最近在學習Vue2.x框架,把本身的學習筆記整理一下,方便本身的回顧和總結,本人也是初學,其中不免出現本身理解的錯誤和思考不周全的,但願你們可以多多指教。鑑於Vue不一樣版本之間存在差別,本人的筆記是以Vue2.x來學習的,後續會在2.x版本的基礎上對比最新版本Vue的特性來增長新的文章來講明。html
<!--1. 導入Vue的包--> <script src="js/vue.js"></script> <body> <!--2. div#app 就是 Vue實例綁定的html元素,在這裏能夠顯示Vue對象的data屬性中的配置的數據--> <!--該區域就是MVVM模型中那個的V層--> <div id="app"> {{msg}} </div> <script> //3. 建立一個Vue實例 // Vue實例就是MVVM模型中的vm層,也就是將M中的數據渲染到V的調度者 var vm = new Vue({ // el表示的是當前實例化的Vue對象要控制的元素的id值 el: '#app', // data就是MVVM模型中的m層, data的數據就是要渲染到#app元素中 data: { msg: 'Hello Vue' } }); </script> </body>
{{msg}} 是Vue提供的,用來向html頁面傳遞變量vue
以v-開始: 指令自己是html元素的自定義屬性
html5
插值表達式存在‘閃動’問題,解決原理:先隱藏,替換好值之後再顯示最終值
bootstrap
<style> [v-cloak] { display: none; } </style> <p v-cloak>{{msg}}</p> 其餘代碼與'Vue使用步驟'處代碼一致
與Mustache插值表達式做用同樣用來向html元素傳遞Vue對象數據的,不存在‘閃動’問題
segmentfault
<script src="js/vue.js"></script> <body> <div id="app"> 這是Mustache表達式輸出的內容:{{msg}} <br> 這是v-text指令輸出的內容:<span v-text="msg"></span> </div> <script> var vm = new Vue({ el: '#app', data: { msg: 'v-text指令示例' } }); </script> </body>
用來向指定的html元素內部填html片斷內容
存在安全問題, 容易受到XSS攻擊
原則上網站內的數據能夠經過v-html指令添加,第三方的數據不能夠經過v-html指令添加
數組
<script src="js/vue.js"></script> <body> <div id="app"> 這是Mustache表達式輸出的結果: {{msg}} <br> 這是v-text指令輸出的結果:<span v-text="msg"></span> <br> 這是v-html指令輸出的結果:<span v-html="msg"></span> </div> <script> var vm = new Vue({ el: '#app', data: { msg: '<h1>這是一個html元素 h1 格式的標題</h1>' } }); </script> </body>
跳過Vue的編譯,顯示Vue模板原始內容
安全
<script src="js/vue.js"></script> <body> <div id="app"> {{msg}} <div v-pre>{{msg}}</div> </div> <script> var vm = new Vue({ el: '#app', data: { msg: 'Vue的v-pre指令的處理', msg1: '<h1>aaa</h1>' } }); </script> </body>
應用的場景,是對應的數據,在後續不須要修改,可使用v-once指令,這樣能夠提升性能。
app
<script src="js/vue.js"></script> <body> <div id="app"> <span></span>普通的mustache表達是,能夠在console中修改變量值,而且會在頁面顯示修改後的值:{{msg}}</span> <div v-once>使用v-once指令的表達式,在console中修改該變量的值,但頁面的顯示內容沒有變化:{{msg}}</div> </div> <script> var vm = new Vue({ el: '#app', data: { msg: 'Hello Vue!' } }); </script> </body>
經過 Mustache 表達式或是經過 v-text 等指令把Vue對象中的數據顯示的網頁中,就是數據綁定框架
經過v-model指令來實現數據的雙向綁定,雙向是指:dom
使用方式
<script src="js/vue.js"></script> <body> <div id="app"> <div>{{msg}}</div> <div> <input type="text" v-model="msg"> </div> </div> <script> var vue = new Vue({ el: '#app', data: { msg: 'hello Vue!' }, methods: { } }); </script> </body>
M: Model V: View VM: View-Model
var vm = new Vue({ el: '#app', data: { num: 0 }, methods: { handle() { this.num ++; } } });
直接經過函數名稱調用
<button @click="handle">點擊2</button>
經過函數調用的方式: 能夠傳遞參數
<button @click="handle()">點擊3</button>
Vue中函數調用的不一樣形式:
<body> <div id="app"> <div>{{num}}</div> <div> <button v-on:click="num++">點擊</button> <button @click="num++">點擊1</button> <button @click="handle">點擊2</button> <button @click="handle()">點擊3</button> </div> </div> <script> var vm = new Vue({ el: '#app', data: { num: 0 }, methods: { handle() { this.num ++; } } }); </script> </body>
<body> <div id="app"> <div> <button @click="handle1('123', '456')">Btn1</button> <button @click="handle2">Btn2</button> </div> </div> <script> var vm = new Vue({ el: '#app', data: { num: 1 }, methods: { handle1(p1, p2, $event) { console.log(p1, p2, event); }, handle2($event) { console.log(event); } }, }); </script> </body>
<body> <div id="app"> <div @click="handle0"> <div>阻止冒泡 {{num}}</div> <button @click="handle1">正常冒泡</button> <button @click="handle2">傳統阻止冒泡</button> <button @click.stop="handle3">Vue阻止冒泡</button> </div> <a href="http://www.baidu.com">a標籤默認行爲</a> <a href="http://www.baidu.com" @click="preventHandle">a標籤傳統方式默認行爲</a> <a href="http://www.baidu.com" @click.prevent="vuePrevent">a標籤Vue方式阻止默認行爲</a> </div> <script> var vm = new Vue({ el: '#app', data:{ num: 0 }, methods: { handle0(){ this.num++; }, handle1() { console.log("nothing to do, 冒泡觸發,num+1"); }, handle2(event) { console.log("傳統方式阻止冒泡"); event.stopPropagation(); }, handle3() { console.log("使用vue提供的.stop修飾符阻止冒泡"); }, preventHandle(event) { console.log("使用傳統方式阻止默認行爲"); event.preventDefault(); }, vuePrevent() { console.log("vue使用.prevent修飾符來阻止默認行爲"); } }, }); </script> </body>
<body> <div id="app"> <form action=""> <div> <input type="text" name="username" id="" v-model="username" v-on:keyup.delete="clearHandler"> </div> <div> <input type="text" name="password" id="" v-model="password" v-on:keyup.enter="submitHandler"> </div> <div> <input type="button" value="Submit" @click="submitHandler"> </div> </form> </div> <script> var vm = new Vue({ el: '#app', data: { username: '', password: '' }, methods: { clearHandler() { this.username = ""; }, submitHandler() { console.log("username=%s, password=%s", this.username, this.password); } }, }); </script> </body>
<body> <div id="app"> <div> 針對全部按鍵的事件:<input type="text" @keyup="keyHandler" name="" id=""> </div> <div> 經過keyCode來綁定指定按鍵的事件(只對按鍵a有效):<input type="text" @keyup.65="keyHandler"> </div> <div> 經過自定義按鍵修飾符來幫頂按鍵事件(只對a有效):<input type="text" @keyup.akey="keyHandler"> </div> </div> <script> // 對a按鍵定義事件別名 Vue.config.keyCodes.akey = 65; var vm = new Vue({ el: '#app', data: { }, methods: { keyHandler(event) { console.log(event.keyCode); } } }); </script> </body>
8-1. 經過 v-model 指令實現數據的雙向綁定
8-2. 給計算按鈕綁定事件函數,實現計算邏輯
8-3. 經過 v-text 指令將結果在指定位置顯示
<div id="app"> <h1>簡單加法計算器</h1> <div> <span>數值A:</span> <span><input type="text" v-model="a"></span> </div> <div> <span>數值B:</span> <span><input type="text" v-model="b"></span> </div> <div> <span><input type="button" value="計算" @click="calculate"></span> </div> <div> <span>計算結果</span> <span v-text="result"></span> </div> </div> <script> var vm = new Vue({ el: '#app', data: { a: '', b: '', result: '' }, methods: { calculate() { this.result = parseFloat(this.a) + parseFloat(this.b); } }, }); </script> </body>
經過 v-bind 指令來實現對html元素屬性值的綁定,從而實現數據動態改變的目的。v-bind 指令的簡寫形式是 「:」
經過 v-bind 指令和 v-on 指令實現 v-model指令
<input type="text" :value="msg" @input="handleInput"> // 事件處理函數 handleInput(event) { this.msg = event.target.value; }
簡寫形式
<input type="text" :value="msg" @input="msg=$event.target.value">
經過上述代碼咱們會發現v-model指令的底層實現原理
v-model 則是實現雙向數據綁定的,是基於 v-bind 指令和 v-on 指令實現的
<body> <div id="app"> <div> 超連接的地址:{{url}} </div> <div v-text="url"></div> <div> <a v-bind:href="url">連接1</a> <input type="button" @click="changeHref" value="切換地址"> </div> <h1> 經過 v-bind 指令和 v-on 指令實現 v-model 指令的雙向數據綁定功能 </h1> <div>變量msg內容是:{{msg}}</div> v-on 和 v-bind:<input type="text" :value="msg" @input="handleInput"> <br> 簡寫形式:<input type="text" :value="msg" @input="msg=$event.target.value"> <br> v-model形式: <input type="text" v-model="msg"> <br> </div> <script> var vm = new Vue({ el: '#app', data: { url: 'http://www.baidu.com', msg: 'Hello Vue!!!' }, methods: { changeHref() { this.url = "http://www.google.com" }, handleInput(event) { this.msg = event.target.value; } } }); </script> </body>
控制樣式變化:
首先,要定義一個樣式名稱;
而後,經過v-bind指令將html元素的class屬性與樣式進行綁定;
定義一個事件函數來實現html元素的動態切換
/*1. 定義樣式規則*/ .active { border: 1px solid red; height: 100px; width: 100px; } .error { background-color: orange; } <!--2-1. 經過Vue規定的方式實現樣式綁定 對象形式--> <div :class="{active:isActive, error: isError}"> 測試v-bind指令+class屬性實現樣式綁定 對象形式 </div> <div> <!-- 5-1. 將動態切換樣式的事件方法綁定到html元-->素 對象形式:<button @click="switchClass">切換樣式</button> </div> <!--2-2. 經過Vue規定的方式實現樣式綁定 數組形式--> <div v-bind:class="[activeClass, errorClass]"> 測試v-bind指令+class屬性實現樣式綁定 數組形式 </div> <div> <!--5-1. 將動態切換樣式的事件方法綁定到html元素--> 數組形式:<button @click="switchClassArray">切換樣式</button> </div> var vm = new Vue({ el: '#app', data: { // 3-1. 定義 對象形式 對應樣式變量名 isActive: true, isError: true, // 3-2. 定義 數組形式 對應樣式變量名 activeClass: 'active', errorClass: 'error' }, methods: { // 4-1. 定義動態切換樣式的事件方法 switchClass() { this.isActive = !this.isActive; }, // 4-2. 定義動態切換數組 數組形式 樣式的名稱 switchClassArray() { this.activeClass = ''; this.errorClass = ''; } }, });
經過v-bind指令 + class屬性實現樣式綁定的細節:
<div id="app"> v-bind指令+style屬性實現樣式綁定 <div :style="{border: borderStyle, width: widthStyle, height: heightStyle}"></div> v-bind指令+style屬性 簡寫形式 <div :style="objectStyles"></div> v-bind指令+style屬性 數組形式 <div :style="[objectStyles, overrideStyles]"></div> <div> <button @click="switchStyles">切換</button> </div> </div> <script> var vm = new Vue({ el: '#app', data: { borderStyle: '1px solid red', widthStyle: '100px', heightStyle: '200px', objectStyles: { border: '3px solid green', width: '200px', height: '100px' }, overrideStyles: { border: '5px, solid blue', width: '500px', height: '100px', backgroundColor:'orange' } }, methods: { switchStyles() { this.widthStyle = '200px'; this.objectStyles.height = '200px'; } } }); </script> </body>
控制的是條件分支對應的dom元素是否渲染到頁面上,適用於元素渲染出來後不怎麼變化的
dom元素已經渲染到頁面經過style樣式來控制元素是否顯示,適用於元素頻繁的顯示和隱藏時使用
<body> <div id="app"> v-if v-else-if v-else 指令 <div v-if="score>90">優秀</div> <div v-else-if="score>80&&score<=90">良好 </div> <div v-else-if="score<=80&&score>70">通常</div> <div v-else-if="score<=70&&score>=60">及格</div> <div v-else>不及格</div> v-show指令 <div v-show="showFlag">show指令控制的內容</div> <div> <button @click="switchShowFlag">切換</button> </div> </div> <script> var vm = new Vue({ el: '#app', data: { score: 99, showFlag: true }, methods: { switchShowFlag() { this.showFlag = !this.showFlag; } } }); </script> </body>
v-for="item in [array]" v-for="(item, index) in [array]"
其中 item 就是簡單數組中的一個元素,index是當前元素在數組中的位置
<li v-bind:key="item.id" v-for="item in fruitObjects">{{item.id}} --- {{item.ename}} --- {{item.cname}}</li>
v-for指令相關的key用來方便vue定位區分遍歷的集合中的元素
<li v-for="(value, key, index) in obj"> {{key + '---' + value + '---' + index}} </li>
代碼中 value, key, index 的位置是固定不變的,能夠變換名字可是,對應位置分別表明的含義是:屬性值、屬性名、屬性位置
<body> <div id="app"> 循環簡單數組 <div> <li v-for="item in fruitArray">{{item}}</li> </div> 循環帶下標 <div> <li v-for="(item, index) in fruitArray">{{item}} --- {{index}}</li> </div> 循環對象數組 <div> <li v-for="item in fruitObjects">{{item.ename}} --- {{item.cname}}</li> </div> v-for指令相關的key用來方便vue定位區分遍歷的集合中的元素 <div> <li v-bind:key="item.id" v-for="item in fruitObjects">{{item.id}} --- {{item.ename}} --- {{item.cname}}</li> </div> 遍歷對象中各個屬性及對應的取值 <div> <li v-for="(value, key, index) in obj"> {{key + '---' + value + '---' + index}} </li> </div> v-for 指令 和 v-if 指令 結合使用 <div> <li v-if='item == "apple"' v-for="item in fruitArray">{{item}}</li> </div> </div> <script> var vm = new Vue({ el: '#app', data: { fruitArray: ['apple', 'orange', 'banana'], fruitObjects: [ { id: 1, ename: 'apple', cname: '蘋果' }, { id: 2, ename: 'orange', cname: '橘子' }, { id: 3, ename: 'banana', cname: '香蕉' } ], obj: { uname: 'lisi', age: 12, gender: 'male' } }, methods: { } }); </script> </body>