Vue.js是一款流行的開源JavaScript前端框架,旨在更好地組織與簡化Web開發。Vue所關註的核心是MVC模式中的視圖層,同時,它也能方便地獲取數據更新,並通過組件內部特定的方法實現視圖與模型的交互。由尤雨溪在2014年2月發佈的。 一 基本語法 1. vue的使用要從創建Vue對象開始 ...
Vue.js是一款流行的開源JavaScript前端框架,旨在更好地組織與簡化Web開發。Vue所關註的核心是MVC模式中的視圖層,同時,它也能方便地獲取數據更新,並通過組件內部特定的方法實現視圖與模型的交互。由尤雨溪在2014年2月發佈的。
一 基本語法
1. vue的使用要從創建Vue對象開始
let vm = new Vue();
2.創建vue對象
創建vue對象的時候,需要傳遞參數,是json對象,json對象對象必須至少有兩個屬性成員
let vm = new Vue({
el:"#app",
data: {
數據變數1:"變數值",
數據變數2:"變數值",
數據變數3:"變數值",
},
methods:{},
watch:{},
filters:{},
});
el:設置vue可以操作的html內容範圍,值就是css的id選擇器。
data: 保存vue.js中要顯示到html頁面的數據。
methods:定義函數。
watch:監聽屬性
filters:定義過濾器。
3.設置控制範圍
vue.js要控制器的內容外圍,必須先通過id來設置。
<div id="app">
<h1>{{message}}</h1>
</div>
4 簡單示例
<html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <!--導入vue.js--> <script src="js/vue.js"></script> </head> <body> <div id="app"> <h1>{{message}} </h1> </div> <script> // vue.js的代碼開始於一個Vue對象。所以每次操作數據都要聲明Vue對象開始。 let vm = new Vue({ el:"#app", // 設置當前vue對象要控制的標簽範圍。 data:{ // data 是將要展示到HTML標簽元素中的數據。 message:"hello world!", } }) </script> </body> </html>
效果如下:
二 Vue.js的M-V-VM思想
MVVM 是 Model-View-ViewModel 的縮寫,它是一種基於前端開發的架構模式。
Model 指代的就是vue對象的data屬性裡面的數據。這裡的數據要顯示到頁面中。
View 指代的就是vue中數據要顯示的HTML頁面,在vue中,也稱之為“視圖模板” 。
ViewModel 指代的是vue.js中我們編寫代碼時的vm對象了,它是vue.js的核心,負責連接 View 和 Model,保證視圖和數據的一致性,所以前面代碼中,data裡面的數據被顯示中p標簽中就是vm對象自動完成的。
再來一個示例:
<html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="js/vue.js"></script> </head> <body> <div id="app"> <!-- 在雙標簽中顯示數據要通過 {{ }} 來實現--> <h1>{{name}}</h1> <p>{{age}}</p> <!-- 在表單輸入框中顯示數據要使用模板語法 v-model 來完成--> <input type="text" v-model="name"> </div> <script> let vm = new Vue({ el:"#app", data:{ name:"我是Vue.js", age:5, } }) </script> </body>
效果如圖
要是在輸入框中輸入,則html中的那麼對應的值也會跟著改變
在瀏覽器中可以在 console.log通過 vm對象可以直接訪問el和data屬性,甚至可以訪問data裡面的數據
console.log(vm.$el) # #box vm對象可以控制的範圍
console.log(vm.$data); # vm對象要顯示到頁面中的數據
console.log(vm.name); 顯示name的值
也可以通過console直接修改data中的值,頁面也會跟著改變
總結
1. 如果要輸出data裡面的數據作為普通標簽的內容,需要使用{{ }} 用法: vue對象的data屬性: data:{
name:"小明", }
標簽元素: <h1>{{ name }}</h1>
2. 如果要輸出data裡面的數據作為表單元素的值,需要使用vue.js提供的元素屬性v-model 用法: vue對象的data屬性:
data:{ name:"小明", }
表單元素:
<input v-model="name">
使用v-model把data裡面的數據顯示到表單元素以後,一旦用戶修改表單元素的值,則data裡面對應數據的值也會隨之發生改變,甚至,頁面中凡是使用了這個數據都會發生變化。
三 顯示數據
顯示數據的一般規則:
在表單輸入框中顯示數據要使用v-model來完成數據顯示
輸出html代碼,要使用v-html來輸出.v-html必須在html標簽裡面作為屬性寫出來.
一下來個示例看看
<html lang="en"> <head> <meta charset="UTF-8"> <title></title> <script src="js/vue.js"></script> </head> <body> <div id="app"> <h1>{{title}}</h1> <h3>{{ url1 }}</h3> <h4>用{{}}顯示出來的html代碼則會按原始字元串輸出 :</h4> {{ img }} <br> 以下是圖片 <br> <span v-html="img"></span>
<!-- 在此用data中的img來顯標簽屬性值,即就是把img原樣放入span中 --> </div> <script> let vm = new Vue({ el: "#app", data: { title:"我的vue!", url1:"我的url1地址", img: '<img src="http://wx1.sinaimg.cn/mw600/0076BSS5ly1g2g5zryq8vj30mt0y746v.jpg"> ' }, }) </script> </body> </html>
效果如下:
<h1>{{str1.split("").reverse().join("")}}</h1> <!--支持js的運算符--> <h1>{{num1+3}}</h1> <!-- js還有一種運算符,三元運算符,類似於python裡面的三元表達式 三元運算符的語法: 判斷條件 ? 條件為true : 條件為false的結果 python 三元表達式[三目運算符]的語法: a if 條件 else b --> <h1>num1和num2之間進行比較,最大值:{{ num2>num1?num2:num1 }}</h1>
四 常用指令
在vue中,提供了很多指令,常用的有:v-if、v-model、v-for等等。
指令會在vm對象的data屬性的數據發生變化時,會同時改變元素中的其控制的內容或屬性。
因為vue的歷史版本原因,所以有一部分指令都有兩種寫法:
vue1.x寫法 vue2.x的寫法
v-html ----> {{ }} # vue2.x 也支持v-html
v-bind:屬性名 ----> :屬性
v-on:事件名 ----> @事件名
4.1 操作屬性
格式:
<標簽名 :標簽屬性="data屬性"></標簽名>
<head> <meta charset="UTF-8"> <title>Title</title> <script src="js/vue.js"></script> </head> <body> <div id="index"> <p> <input :type="type" placeholder="請輸入密碼"> <button @click="type='text'">顯示密碼</button> </p> </div> <script> let vm = new Vue({ el: "#index", data: { title: "路飛學成", type: "password" } }) </script> </body>
點擊顯示密碼
4.2 事件綁定
有兩種事件操作的寫法,@事件名 和 v-on:事件名
<button v-on:click="num++">按鈕</button> <!-- v-on 是vue1.x版本的寫法 --> <button @click="num+=5">按鈕2</button>
下麵給button按鈕綁定點擊事件,實現num的加減,點擊“+”實現加1操作,點擊“-” 調用sub函數實現減1操作
<html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="js/vue.min.js"></script> </head> <body> <div id="box"> <button @click="num++">+</button> <input type="text" v-model="num"> <button @click="sub">-</button> </div> <script> let vm = new Vue({ el:"#box", data:{ num:0, }, methods:{ sub(){ if (this.num<=1){ this.num=0 } else { this.num--; } } } }) </script> </body> </html>
4.3 操作樣式
4.3.1 控制標簽class類名
格式:
<h1 :class="值">元素</h1> 值可以是對象、對象名、數組
方式一:
添加class類名,值是一個對象 { class類1:布爾值變數1, class類2:布爾值變數2, }
<html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="js/vue.js"></script> <style> .box1{ color: red; border: 1px solid #000000; } .box2{ background-color: orange; font-size: 32px; } </style> </head> <body> <div id="box"> <p :class="{box1:myclass1}">一個段落</p> <p @click="myclass3=!myclass3" :class="{box1:myclass2,box2:myclass3}">一個段落</p> </div> <script> let vm1 = new Vue({ el:"#box", data:{ myclass1:false, // 布爾值變數如果是false,則不會添加對象的屬性名作為樣式 myclass2:true, myclass3:false, }, }) </script> </body> </html>
效果如圖:
方式二:
上面的代碼可以:class的值保存到data裡面的一個變數,然後使用該變數作為:class的值
<head> <meta charset="UTF-8"> <title>Title</title> <script src="js/vue.js"></script> <style> .box4{ background-color: red; } .box5{ color: green; } </style> </head> <body> <div id="app"> <button @click="mycls.box4=!mycls.box4">改變背景</button> <button @click="mycls.box5=!mycls.box5">改變字體顏色</button> <p :class="mycls">第二個段落</p> </div> <script> let vm2 = new Vue({ el:"#app", data:{ mycls:{ box4:false, box5:true, }, } }) </script> </body>
效果如圖
方式三
批量給元素增加多個class樣式
<head> <meta charset="UTF-8"> <title>Title</title> <script src="js/vue.js"></script> <style> .box6{ background-color: red; } .box7{ color: green; } .box8{border: 3px solid blue;} </style> </head> <body> <div id="app"> <p :class="[mycls1,mycls2]">第三個段落</p> </div> <script> let vm2 = new Vue({ el:"#app", data:{ mycls1:{ box6:true, box7:true, }, mycls2:{ box8:true, } } }) </script> </body>
效果如圖:
總結:
給元素綁定class類名,最常用的就是方式二。 vue對象的data數據: data:{ myObj:{ complete:true, uncomplete:false, } } html元素: <div class="box" :class="myObj">2222</div> 最終瀏覽器效果: <div class="box complete">2222</div>
4.3.2 控制標簽style樣式
格式1:值是json對象,對象寫在元素的:style屬性中
標簽元素: <div :style="{color: activeColor, fontSize: fontSize + 'px' }"></div> data數據如下: data: { activeColor: 'red', fontSize: 30 }
格式2:值是對象變數名,對象在data中進行聲明
標簽元素: <div v-bind:style="styleObject"></div> data數據如下: data: { styleObject: { color: 'red', fontSize: '13px' } }
格式3:值是數組
標簽元素: <div v-bind:style="[style1, style2]"></div> data數據如下: data: { style1:{ color:"red" }, style2:{ background:"yellow", fontSize: "21px" } }
4.4 條件渲染指令
標簽元素: <!-- vue對象最終會把條件的結果變成布爾值 --> <h1 v-if="ok">Yes</h1> data數據: data:{ ok:false // true則是顯示,false是隱藏 }
4.4.2 v-else
v-else指令來表示 v-if 的“else 塊”,v-else 元素必須緊跟在帶 v-if 或者 v-else-if 的元素的後面,否則它將不會被識別。
標簽元素: <h1 v-if="ok">Yes</h1> <h1 v-else>No</h1> data數據: data:{ ok:false // true則是顯示,false是隱藏 }
4.4.3 v-else-if
可以出現多個v-else-if語句,但是v-else-if之前必須有一個v-if開頭。後面可以跟著v-else,也可以沒有。
標簽元素: <h1 v-if="num==1">num的值為1</h1> <h1 v-else-if="num==2">num的值為2</h1> <h1 v-else>num的值是{{num}}</h1> data數據: data:{ num:2 }
4.4.4 v-show
用法和v-if大致一樣,區別有以下兩點:
(1)v-show後面不能有v-else或者v-else-if
(2)v-show隱藏元素時,使用的是display:none來隱藏的,而v-if是直接從HTML文檔中移除(DOM操作中的remove)
標簽元素: <h1 v-show="ok">Hello!</h1> data數據: data:{ ok:false // true則是顯示,false是隱藏 }
4.5 列表渲染指令
在vue中,可以通過v-for指令可以將一組數據渲染到頁面中,數據可以是數組或者對象。
示例一:數據是數組
<html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="js/vue.js"></script> </head> <body> <div id="app"> <ul> <!--i是列表的每一個元素--> <li v-for="book in book_list">{{book.title}}</li> </ul> <ul> <!--i是列表的每一個元素,j是每個元素的下標--> <li v-for="(book, index) in book_list">第{{ index+1}}本圖書:{{book.title}}</li> </ul> </div> <script> var vm1 = new Vue({ el: "#app", data: { book_list: [ {"id": 1, "title": "圖書名稱1", "price": 200}, {"id": 2, "title": "