Vue基礎(chǔ)之MVVM,模板語(yǔ)法和數(shù)據(jù)綁定
1. Vue概述
Vue官網(wǎng)
英文官網(wǎng): https://vuejs.org/
中文官網(wǎng): https://cn.vuejs.org/
MVVM架構(gòu)模式
MVVM簡(jiǎn)介
MVVM 由 M:Model 模型,V:View 視圖 ,VM:ViewModel 視圖模型(Vue實(shí)例對(duì)象) 三部分構(gòu)成,Model 層代表數(shù)據(jù)模型,也可以在Model中定義數(shù)據(jù)修改和操作的業(yè)務(wù)邏輯;View 代表UI 組件,它負(fù)責(zé)將數(shù)據(jù)模型轉(zhuǎn)化成UI 展現(xiàn)出來(lái),ViewModel 是一個(gè)同步View 和 Model的對(duì)象。
在MVVM架構(gòu)下,View 和 Model 之間并沒(méi)有直接的聯(lián)系,而是通過(guò)ViewModel進(jìn)行交互,Model 和 ViewModel 之間的交互是雙向的, 因此View 數(shù)據(jù)的變化會(huì)同步到Model中,而Model 數(shù)據(jù)的變化也會(huì)立即反應(yīng)到View 上。
ViewModel 通過(guò)雙向數(shù)據(jù)綁定把 View 層和 Model 層連接了起來(lái),而View 和 Model 之間的同步工作完全是自動(dòng)的,無(wú)需人為干涉,因此開(kāi)發(fā)者只需關(guān)注業(yè)務(wù)邏輯,不需要手動(dòng)操作DOM, 不需要關(guān)注數(shù)據(jù)狀態(tài)的同步問(wèn)題,復(fù)雜的數(shù)據(jù)狀態(tài)維護(hù)完全由 MVVM 來(lái)統(tǒng)一管理。
MVVM模式圖

- Vue的設(shè)計(jì)受到MVVM模型的啟發(fā)
- data中所有的屬性,最后都出現(xiàn)在了vm身上。
- vm身上所有的屬性 及 Vue原型上所有屬性,在Vue模板中都可以直接使用。
Vue簡(jiǎn)介
- 是一個(gè)JavaScript MVVM庫(kù),是一套動(dòng)態(tài)構(gòu)建用戶界面的漸進(jìn)式框架
- Vue用于構(gòu)建用戶界面的漸進(jìn)式框架,漸進(jìn)式代表的含義是:主張最少。每個(gè)框架都不可避免會(huì)有自己的一些特點(diǎn),從而會(huì)對(duì)使用者有一定的要求,這些要求就是主張,主張有強(qiáng)有弱,它的強(qiáng)勢(shì)程度會(huì)影響在業(yè)務(wù)開(kāi)發(fā)中的使用方式。
- 漸進(jìn)式:Vue可以自底向上逐層地應(yīng)用。簡(jiǎn)單應(yīng)用只需一個(gè)輕量小巧的核心庫(kù),復(fù)雜應(yīng)用可以引入各式各樣的Vue插件
Vue特點(diǎn)
- 遵循MVVM模式
- 雙向數(shù)據(jù)綁定:vue.js會(huì)自動(dòng)響應(yīng)數(shù)據(jù)的變化情況,并且根據(jù)用戶在代碼中預(yù)先寫(xiě)好的綁定關(guān)系,對(duì)所有綁定在一起的數(shù)據(jù)和視圖內(nèi)容都進(jìn)行修改
- 組件化:Vue.js通過(guò)組件,把一個(gè)單頁(yè)應(yīng)用中的各種模塊拆分到一個(gè)一個(gè)單獨(dú)的組件(component)中,我們只要先在父級(jí)應(yīng)用中寫(xiě)好各種組件標(biāo)簽(占坑),并且在組件標(biāo)簽中寫(xiě)好要傳入組件的參數(shù)(就像給函數(shù)傳入?yún)?shù)一樣,這個(gè)參數(shù)叫做組件的屬性),然后再分別寫(xiě)好各種組件的實(shí)現(xiàn)(填坑),然后整個(gè)應(yīng)用就算做完了。采用組件化模式,提高代碼復(fù)用率、且讓代碼更好維護(hù)。
- 視圖、數(shù)據(jù)和結(jié)構(gòu)的分離,聲明式編碼:使數(shù)據(jù)的更改更為簡(jiǎn)單,不需要進(jìn)行邏輯代碼的修改,無(wú)需直接操作DOM,只需要操作數(shù)據(jù)就能完成相關(guān)操作,提高開(kāi)發(fā)效率。
- 虛擬DOM 和 diff算法:可以預(yù)先通過(guò)JavaScript進(jìn)行各種計(jì)算,把最終的DOM操作計(jì)算出來(lái)并優(yōu)化,由于這個(gè)DOM操作屬于預(yù)處理操作,并沒(méi)有真實(shí)的操作DOM,所以叫做虛擬DOM。最后在計(jì)算完畢才真正將DOM操作提交,將DOM操作變化反映到DOM樹(shù)上。
2. 初識(shí)Vue
- 想讓Vue正常工作,就必須創(chuàng)建一個(gè)Vue實(shí)例,且要傳入一個(gè)配置對(duì)象;
- root容器里的代碼依然符合html規(guī)范,只不過(guò)加入了一些特殊的Vue語(yǔ)法;
- root容器里的代碼被稱為 Vue模板 ;
- Vue 實(shí)例和容器 是 一一對(duì)應(yīng)的;
- 真實(shí)開(kāi)發(fā)中只有一個(gè)Vue實(shí)例,并且會(huì)配合著組件一起使用;
- {{xxx}}中的xxx要寫(xiě)js表達(dá)式,且xxx可以自動(dòng)讀取到data中的所有屬性;
注意區(qū)分js表達(dá)式和js代碼(語(yǔ)句)
1、表達(dá)式:一個(gè)表達(dá)式會(huì)產(chǎn)生一個(gè)值,可以放在任何一個(gè)需要值的地方
(1). a
(2). a+b
(3). demo(1) //函數(shù)調(diào)用表達(dá)式
(4). x === y ? 'a' : 'b' //三元表達(dá)式
2、js代碼(語(yǔ)句)
(1). if(){}
(2). for(){}
- 一旦data中的數(shù)據(jù)發(fā)生改變,那么頁(yè)面中用到該數(shù)據(jù)的地方也會(huì)自動(dòng)更新;
<!-- 準(zhǔn)備好一個(gè)容器 -->
<div id="demo">
<h1>Hello,{{name.toUpperCase()}},{{address}}</h1>
</div>
<script type="text/javascript" >
Vue.config.productionTip = false //阻止 vue 在啟動(dòng)時(shí)生成生產(chǎn)提示。
//創(chuàng)建Vue實(shí)例
new Vue({
el:'#demo', //el用于指定當(dāng)前Vue實(shí)例為哪個(gè)容器服務(wù),值通常為css選擇器字符串。
data:{ //data中用于存儲(chǔ)數(shù)據(jù),數(shù)據(jù)供el所指定的容器去使用,值我們暫時(shí)先寫(xiě)成一個(gè)對(duì)象。
name:'bilibili',
address:'上海'
}
})
</script>
3. 模板語(yǔ)法
Vue模板語(yǔ)法有2大類:
1、插值語(yǔ)法:
- 功能:用于解析標(biāo)簽體內(nèi)容(起始標(biāo)簽和結(jié)束標(biāo)簽中間均為標(biāo)簽體)。
- 寫(xiě)法:{{xxx}},xxx是js表達(dá)式,且可以直接讀取到data中的所有屬性。
2、指令語(yǔ)法:
- 功能:用于解析標(biāo)簽(包括:標(biāo)簽屬性、標(biāo)簽體內(nèi)容、綁定事件…)。
- 舉例:v-bind:href="xxx" 或 簡(jiǎn)寫(xiě)為 :href="xxx",xxx同樣要寫(xiě)js表達(dá)式,且可以直接讀取到data中的所有屬性。
- 備注:Vue中有很多的指令,且形式都是:v-xxx,此處以v-bind舉例
<!-- 準(zhǔn)備好一個(gè)容器-->
<div id="root">
<h1>插值語(yǔ)法</h1>
<h3>你好,{{name}}</h3>
<hr/>
<h1>指令語(yǔ)法</h1>
<a v-bind:href="address.url.toUpperCase()" x="hello">點(diǎn)我去{{address.name}}1</a>
<a :href="address.url" x="hello">點(diǎn)我去{{address.name}}2</a>
</div>
<script type="text/javascript">
Vue.config.productionTip = false //阻止 vue 在啟動(dòng)時(shí)生成生產(chǎn)提示。
new Vue({
el:'#root',
data:{
name:'月見(jiàn)',
// 可以設(shè)置成多級(jí)結(jié)構(gòu)
address:{
name:'百度',
url:'http://www.baidu.com',
}
}
})
</script>

4. 數(shù)據(jù)綁定
Vue中有2種數(shù)據(jù)綁定的方式:
1.單向綁定(v-bind):數(shù)據(jù)只能從data流向頁(yè)面。
2.雙向綁定(v-model):數(shù)據(jù)不僅能從data流向頁(yè)面,還可以從頁(yè)面流向data。
備注:
- 雙向綁定一般都應(yīng)用在表單類元素上(如:input、select等)
v-model:value可以簡(jiǎn)寫(xiě)為 v-model,因?yàn)?code>v-model默認(rèn)收集的就是value值(只有表單類元素才存在value)。
<div id="root">
<!-- 普通寫(xiě)法 -->
單向數(shù)據(jù)綁定:<input type="text" v-bind:value="name"><br/>
雙向數(shù)據(jù)綁定:<input type="text" v-model:value="name"><br/>
<!-- 簡(jiǎn)寫(xiě) -->
單向數(shù)據(jù)綁定:<input type="text" :value="name"><br/>
雙向數(shù)據(jù)綁定:<input type="text" v-model="name"><br/>
<!-- 下面代碼是錯(cuò)誤的,因?yàn)関-model只能應(yīng)用在表單類元素(輸入類元素)上 -->
<h2 v-model:x="name">你好啊</h2>
</div>
<script type="text/javascript">
Vue.config.productionTip = false //阻止 vue 在啟動(dòng)時(shí)生成生產(chǎn)提示。
new Vue({
el:'#root',
data:{
name:'bilibili'
}
})
</script>
5. el與data的兩種寫(xiě)法
1、el有2種寫(xiě)法new
- Vue時(shí)候配置el屬性。
- 先創(chuàng)建Vue實(shí)例,隨后再通過(guò)
vm.$mount('#root')指定el的值。
2、data有2種寫(xiě)法
- 對(duì)象式
- 函數(shù)式
- 如何選擇:兩種寫(xiě)法都可以,但使用到組件時(shí),data必須使用函數(shù)式,否則會(huì)報(bào)錯(cuò)。
3、一個(gè)重要的原則:
由Vue管理的函數(shù),一定不要寫(xiě)箭頭函數(shù),一旦寫(xiě)了箭頭函數(shù),this就不再是Vue實(shí)例了,而是window。
<div id="root">
<h1>你好,{{name}}</h1>
</div>
<script type="text/javascript">
Vue.config.productionTip = false //阻止 vue 在啟動(dòng)時(shí)生成生產(chǎn)提示。
//el的兩種寫(xiě)法 -----------
const v = new Vue({
//el:'#root', //第一種寫(xiě)法
data:{
name:'bilibili'
}
})
console.log(v)
v.$mount('#root') //第二種寫(xiě)法
// 例:
setTimeout(() => {
v.$mount('#root')
},1000); //定時(shí)器:頁(yè)面過(guò)1秒后再顯示vue效果
// ---------------------
//data的兩種寫(xiě)法
new Vue({
el:'#root',
//data的第一種寫(xiě)法:對(duì)象式
/* data:{
name:'bilibili'
} */
//data的第二種寫(xiě)法:函數(shù)式
// 把data寫(xiě)成一個(gè)函數(shù),且這個(gè)函數(shù)必須要返回一個(gè)對(duì)象,函數(shù)式寫(xiě)法一般用于組件和框架
// 注意:此函數(shù)不是自己調(diào)用,是Vue調(diào)用的
data(){
// console.log('@@@',this) //此處的this是Vue實(shí)例對(duì)象(data為普通函數(shù)時(shí),否則this指window)
return{
name:'bilibili'
}
}
})
</script>
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
淺析Vue3中通過(guò)v-model實(shí)現(xiàn)父子組件的雙向數(shù)據(jù)綁定及利用computed簡(jiǎn)化父子組件雙向綁定
這篇文章主要介紹了淺析Vue3中通過(guò)v-model實(shí)現(xiàn)父子組件的雙向數(shù)據(jù)綁定及利用computed簡(jiǎn)化父子組件雙向綁定,需要的朋友可以參考下2022-12-12
Vue+Element實(shí)現(xiàn)封裝抽屜彈框
這篇文章主要為大家詳細(xì)介紹了如何利用Vue和Element實(shí)現(xiàn)簡(jiǎn)單的抽屜彈框效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-06-06
Vuex子模塊調(diào)用子模塊的actions或mutations實(shí)現(xiàn)方式
這篇文章主要介紹了Vuex子模塊調(diào)用子模塊的actions或mutations實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10
Element-Plus Select組件實(shí)現(xiàn)滾動(dòng)分頁(yè)加載功能
Element-Plus的select組件并沒(méi)有自帶滾動(dòng)分頁(yè)加載的功能,其雖然提供了自定義下拉菜單的底部的方式可以自定義上一頁(yè)及下一頁(yè)操作按鈕的方式進(jìn)行分頁(yè)加載切換,這篇文章主要介紹了Element-Plus Select組件實(shí)現(xiàn)滾動(dòng)分頁(yè)加載功能,需要的朋友可以參考下2024-03-03
vue3實(shí)現(xiàn)表格編輯和刪除功能的示例代碼
這篇文章主要為大家詳細(xì)介紹了vue3實(shí)現(xiàn)表格編輯和刪除功能的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-01-01
Vue 3 中使用 Element Plus 的 `el-t
在 Vue 3 中使用 Element Plus 的 `el-table` 組件實(shí)現(xiàn)自適應(yīng)高度,你可以根據(jù)容器的高度動(dòng)態(tài)設(shè)置表格的高度,下面通過(guò)示例代碼給大家展示,感興趣的朋友一起看看吧2024-12-12

