1,Vue基本語法和概念
2, 打包工具 Webpack , Gulp
3,實戰操做html
參考文獻:
官網: https://cn.vuejs.org/v2/guide/
官方資料庫: https://github.com/vuejs/awes...
全家桶: https://github.com/vuejs/vue-cli
Webpack全家桶文檔: http://vuejs-templates.github...
Vue Router: https://router.vuejs.org/
Vuex: https://vuex.vuejs.org/
Vue-resource: https://github.com/pagekit/vu...
Element-UI: http://element.eleme.io/#/zh-CN前端
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <!-- 1. 導入Vue的包 --> <script src="./lib/vue-2.4.0.js"></script> </head> <body> <!-- 未來 new 的Vue實例,會控制這個 元素中的全部內容 --> <!-- Vue 實例所控制的這個元素區域,就是咱們的 V --> <div id="app"> <p>{{ msg }}</p> </div> <script> // 2. 建立一個Vue的實例 // 當咱們導入包以後,在瀏覽器的內存中,就多了一個 Vue 構造函數 // 注意:咱們 new 出來的這個 vm 對象,就是咱們 MVVM中的 VM調度者 var vm = new Vue({ el: '#app', // 表示,當前咱們 new 的這個 Vue 實例,要控制頁面上的哪一個區域 // 這裏的 data 就是 MVVM中的 M,專門用來保存 每一個頁面的數據的 data: { // data 屬性中,存放的是 el 中要用到的數據 msg: '歡迎學習Vue', // 經過 Vue 提供的指令,很方便的就能把數據渲染到頁面上,程序員再也不手動操做DOM元素了 //【前端的Vue之類的框架,不提倡咱們去手動操做DOM元素了】 } }) </script> </body> </html>
v-cloak
可以解決 插值表達式閃爍的問題v-text
會覆蓋元素中本來的內容,可是插值表達式 只會替換本身的這個佔位符,不會把 整個元素的內容清空.v-html
能夠解析表達式中的<h2>等html標籤用於綁定屬性的指令,例如給input
標籤下的 title 綁定 屬性show
,使得鼠標放置在按鈕時呈現show
中的內容vue
<input type="button" value="按鈕" v-bind:title="show">
鼠標放置在按鈕時,將顯示「這是一個本身定義的titile」webpack
var vm = new Vue({ el: '#app', data: { msg: '123', msg2: '<h1>哈哈,我是一個大大的H1, 我大,我驕傲</h1>', show: '這是一個本身定義的title' },
ps. v-bind 中,能夠寫合法的JS表達式,所以能夠在後面添加表達式,好比v-bind:title='show+'123'';
注意: v-bind: 指令能夠被簡寫爲 :要綁定的屬性git
:title='show+'123'';
v-on
指令定義Vue中的事件在不操做DOM的狀況下,實現事件綁定機制程序員
<input type="button" name="" id="" value="按鈕" v-on:click="zxc"/>
ps. 一樣的 v-on 能夠簡寫爲 @github
methods: { // 這個 methods屬性中定義了當前Vue實例全部可用的方法 zxc: function () { alert('Hello') } }
難點:web
分析:vuex
1. 給 【浪起來】 按鈕,綁定一個點擊事件 `v-on` @ 2. 在按鈕的事件處理函數中,寫相關的業務邏輯代碼:拿到 msg 字符串,而後 調用 字符串的 substring 來進行字符串的截取操做,把 第一個字符截取出來,放到最後一個位置便可; 3. 爲了實現點擊下按鈕,自動截取的功能,須要把 2 步驟中的代碼,放到一個定時器中去;
<!-- 2. 建立一個要控制的區域 --> <div id="app"> <input type="button" value="浪起來" @click="lang"> <input type="button" value="低調" @click="stop"> <h4>{{ msg }}</h4> </div> <script> // 注意:在 VM實例中,若是想要獲取 data 上的數據,或者 想要調用 methods 中的 方法,必須經過 this.數據屬性名 或 this.方法名 來進行訪問,這裏的this,就表示 咱們 new 出來的 VM 實例對象 var vm = new Vue({ el: '#app', data: { msg: '猥瑣發育,別浪~~!', intervalId: null // 在data上定義 定時器Id }, methods: { lang() { // console.log(this.msg) // 獲取到頭的第一個字符 // this if (this.intervalId != null) return; this.intervalId = setInterval(() => { var start = this.msg.substring(0, 1) // 獲取到 後面的全部字符 var end = this.msg.substring(1) // 從新拼接獲得新的字符串,並賦值給 this.msg this.msg = end + start }, 400) // 注意: VM實例,會監聽本身身上 data 中全部數據的改變,只要數據一發生變化,就會自動把 最新的數據,從data 上同步到頁面中去;【好處:程序員只須要關心數據,不須要考慮如何從新渲染DOM頁面】 }, stop() { // 中止定時器 clearInterval(this.intervalId) // 每當清除了定時器以後,須要從新把 intervalId 置爲 null this.intervalId = null; } } })
.stop
阻止冒泡點擊button按鈕時,控制檯只輸出 button 的點擊事件,不會捕獲<div>中的事件vue-cli
<div id="" class="inner" @click="div1Handler"> <input type="button" name="" id="" value="點擊它" @click.stop="btnHandler"/> </div>
.prevent
阻止默認事件tx事件被阻止,頁面不會跳轉
<a href="http://www.qq.com" @click.prevent='tx'>騰訊網</a>
.capture
添加事件監聽器時使用事件捕獲模式.stop 是阻止冒泡,也就是說阻止外表事件的發生。而.capture是讓外部事件先發生
點擊按鈕時先觸發空間背景事件。
只能放在元素自己;當下面代碼中的.self放在input當中時,依舊會發生冒泡事件
<div id="" class="inner" @click.self="div1Handler"> <input type="button" name="" id="" value="點擊它" @click="btnHandler"/> </div>
.once
事件只觸發一次只觸發一次事件處理函數
<a href="http://www.qq.com" @click.once='tx'>騰訊網</a>
v-model
和數據雙向綁定v-bind
只能實現數據的單線綁定,從M層綁定到V層;v-model
只能用在表單元素中
其中包括:input(redio,text.address,email...) select checkbox textarea
<div id="app-6"> <p>{{ message }}</p> <input v-model="message"> </div>
var app6 = new Vue({ el: '#app-6', data: { message: 'Hello Vue!' } })
定義3個input標籤text屬性,1個select標籤
<div id="app"> <input type="text" v-model="n1"> <select v-model="opt"> <option value="+">+</option> <option value="-">-</option> <option value="*">*</option> <option value="/">/</option> </select> <input type="text" v-model="n2"> <input type="button" value="=" @click="calc"> <input type="text" v-model="result"> </div>
在data下定義事件,初始化值。能夠選用switch作判斷循環;也可使用 eval方案(該方法可直接判斷加減乘除符號)
<script> // 建立 Vue 實例,獲得 ViewModel var vm = new Vue({ el: '#app', data: { n1: 0, n2: 0, result: 0, opt: '+' }, methods: { calc() { // 計算器算數的方法 // 邏輯: /* switch (this.opt) { case '+': this.result = parseInt(this.n1) + parseInt(this.n2) break; case '-': this.result = parseInt(this.n1) - parseInt(this.n2) break; case '*': this.result = parseInt(this.n1) * parseInt(this.n2) break; case '/': this.result = parseInt(this.n1) / parseInt(this.n2) break; } */ // 注意:這是投機取巧的方式,正式開發中,儘可能少用 var codeStr = 'parseInt(this.n1) ' + this.opt + ' parseInt(this.n2)' this.result = eval(codeStr) } } }); </script>
如下例子將的將於此代碼,爲方便理解在此展現出來
<style> .red { color: red; } .thin { font-weight: 200; } .italic { font-style: italic; } .active { letter-spacing: 0.5em; } </style>
<script> // 建立 Vue 實例,獲得 ViewModel var vm = new Vue({ el: '#app', data: { flag: true, classObj: { red: true, thin: true, italic: false, active: false } }, methods: {} }); </script>
ps.傳統實現方式: <h1 :class="['red', 'thin']">這是一個邪惡的H1</h1>
第一種使用方式,直接傳遞一個數組,注意: 這裏的 class 須要使用 v-bind
作數據綁定
<h1 :class="['red', 'thin']">這是一個邪惡的H1</h1>
當flag爲真時,執行active樣式,不然不執行
<h1 :class="['red', 'thin', flag?'active':'']">這是一個邪惡的H1</h1>
<h1 :class="['thin', 'italic', {'active':flag} ]">
class
屬性時,這些類將被添加到該組件的根元素上面。這個元素上已經存在的類不會被覆蓋<h1 :class="{red:true, italic:true, active:true, thin:true}">這是一個邪惡的H1</h1>
能夠在class
中直接寫,也能夠將對象寫在data
中,直接引用其屬性.
<h1 :class="classObj">這是一個很大很大的H1,大到你沒法想象!!!</h1>
:style
的形式,書寫樣式對象<h1 :style="{color: 'red', 'font-size': '40px'}">這是一個善良的H1</h1>
data
中,並直接引用到 :style
中data: { h1StyleObj: { color: 'red', 'font-size': '40px', 'font-weight': '200' } }
<h1 :style="h1StyleObj">這是一個善良的H1</h1>
:style
中經過數組,引用多個 data
上的樣式對象data: { h1StyleObj: { color: 'red', 'font-size': '40px', 'font-weight': '200' }, h1StyleObj2: { fontStyle: 'italic' } }
<h1 :style="[h1StyleObj, h1StyleObj2]">這是一個善良的H1</h1>
v-for
和key
ps.在使用2.X以上的版本時,key屬性是必須有的
<div id="app"> <p v-for="(item, i) in list">索引值:{{i}} --- 每一項:{{item}}</p> </div>
<script> // 建立 Vue 實例,獲得 ViewModel var vm = new Vue({ el: '#app', data: { list: [1, 2, 3, 4, 5, 6] }, methods: {} }); </script>
<div id="app"> <p v-for="(user, i) in list">Id:{{ user.id }} --- 名字:{{ user.name }} --- 索引:{{i}}</p> </div>
<script> // 建立 Vue 實例,獲得 ViewModel var vm = new Vue({ el: '#app', data: { list: [ { id: 1, name: 'zs1' }, { id: 2, name: 'zs2' }, { id: 3, name: 'zs3' }, { id: 4, name: 'zs4' } ] }, methods: {} }); </script>
<div id="app"> <!-- 注意:在遍歷對象身上的鍵值對的時候, 除了 有 val key ,在第三個位置還有 一個 索引 --> <p v-for="(val, key, i) in user">值是: {{ val }} --- 鍵是: {{key}} -- 索引: {{i}}</p> </div>
<script> // 建立 Vue 實例,獲得 ViewModel var vm = new Vue({ el: '#app', data: { user: { id: 1, name: '託尼·屎大顆', gender: '男' } }, methods: {} }); </script>
<div id="app"> <!-- in 後面咱們放過 普通數組,對象數組,對象, 還能夠放數字 --> <!-- 注意:若是使用 v-for 迭代數字的話,前面的 count 值從 1 開始 --> <p v-for="count in 10">這是第 {{ count }} 次循環</p> </div>
<script> // 建立 Vue 實例,獲得 ViewModel var vm = new Vue({ el: '#app', data: {}, methods: {} }); </script>
v-for
中的key屬性<div id="app"> <div> <label>Id: <input type="text" v-model="id"> </label> <label>Name: <input type="text" v-model="name"> </label> <input type="button" value="添加" @click="add"> </div> <!-- 注意: v-for 循環的時候,key 屬性只能使用 number獲取string --> <!-- 注意: key 在使用的時候,必須使用 v-bind 屬性綁定的形式,指定 key 的值 --> <!-- 在組件中,使用v-for循環的時候,或者在一些特殊狀況中,若是 v-for 有問題,必須 在使用 v-for 的同時,指定 惟一的 字符串/數字 類型 :key 值 --> <p v-for="item in list" :key="item.id"> <input type="checkbox">{{item.id}} --- {{item.name}} </p> </div>
<div id="app"> <div> <label>Id: <input type="text" v-model="id"> </label> <label>Name: <input type="text" v-model="name"> </label> <input type="button" value="添加" @click="add"> </div> <!-- 注意: v-for 循環的時候,key 屬性只能使用 number獲取string --> <!-- 注意: key 在使用的時候,必須使用 v-bind 屬性綁定的形式,指定 key 的值 --> <!-- 在組件中,使用v-for循環的時候,或者在一些特殊狀況中,若是 v-for 有問題,必須 在使用 v-for 的同時,指定 惟一的 字符串/數字 類型 :key 值 --> <p v-for="item in list" :key="item.id"> <input type="checkbox">{{item.id}} --- {{item.name}} </p> </div>
v-if
和 v-show
<div id="app"> <!-- <input type="button" value="toggle" @click="toggle"> --> <input type="button" value="toggle" @click="flag=!flag"> <!-- v-if 的特色:每次都會從新刪除或建立元素 --> <!-- v-show 的特色: 每次不會從新進行DOM的刪除和建立操做,只是切換了元素的 display:none 樣式 --> <!-- v-if 有較高的切換性能消耗 --> <!-- v-show 有較高的初始渲染消耗 --> <!-- 若是元素涉及到頻繁的切換,最好不要使用 v-if, 而是推薦使用 v-show --> <!-- 若是元素可能永遠也不會被顯示出來被用戶看到,則推薦使用 v-if --> <h3 v-if="flag">這是用v-if控制的元素</h3> <h3 v-show="flag">這是用v-show控制的元素</h3> </div>
<script> // 建立 Vue 實例,獲得 ViewModel var vm = new Vue({ el: '#app', data: { flag: false }, methods: { /* toggle() { this.flag = !this.flag } */ } }); </script>