VUE

  1. 什么是VUE
  2. 如何使用VUE
  3. MVVM
  4. 綁定原理
  5. 指令

一. 什么是VUE:

  1. 什么是:
    (1). 第三方開(kāi)發(fā)的 —— 下載
    (2). 基于MVVM設(shè)計(jì)模式的 ?
    (3). 漸進(jìn)式的 —— 可以逐步在項(xiàng)目中使用vue的部分繼承箍铲。而不要求必須把整個(gè)項(xiàng)目都改為vue雇卷。
    (4). 純前端js —— 只要有瀏覽器就可以運(yùn)行,和后端nodejs無(wú)關(guān)颠猴。
    (5). 框架 —— 自動(dòng)化聋庵,避免大量重復(fù)勞動(dòng)
  2. 為什么: 簡(jiǎn)化開(kāi)發(fā),避免重復(fù)勞動(dòng)芙粱!
  3. 何時(shí): 今后祭玉,凡是以數(shù)據(jù)操作(增刪改查)為主的項(xiàng)目,都適合用vue等框架來(lái)實(shí)現(xiàn)春畔。
    比如: 餓了么脱货,美團(tuán)岛都,滴滴,京東振峻,淘寶臼疫,頭條,知乎扣孟,微博...
  4. 問(wèn)題:
    (1). 兼容性問(wèn)題
    (2). 難以接受

二. 如何使用:

  1. 下載: cn.vuejs.org
    (1). 下載vue.js文件烫堤,引入HTML中使用:
    a. 開(kāi)發(fā)版: 未壓縮版,包含完整的注釋?zhuān)a格式和見(jiàn)名知義的變量名凤价。而且鸽斟,還包含極其友好的錯(cuò)誤提示信息。
    適合學(xué)習(xí)和開(kāi)發(fā)之用
    b. 生產(chǎn)版: 壓縮版利诺,去掉了所有注釋?zhuān)a格式富蓄,極簡(jiǎn)化了變量名。而且慢逾,去掉了友好的錯(cuò)誤提示信息立倍。
    適合生產(chǎn)環(huán)境上線(xiàn)使用。
    (2). 安裝腳手架
    _first_vue.html


    圖片1.png
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <!--先引入vue.js-->
  <script src="js/vue.js"></script>
</head>

<body>
  <!--VUE 3步-->
  <!--1. 先做界面: 3個(gè)要求
  1.1 統(tǒng)一的要求: 界面中所有元素侣滩,都必須包裹在一個(gè)唯一的父元素下口注,習(xí)慣上<div id="app"></div>
  1.2 找到界面中將來(lái)可能隨程序自動(dòng)變化的位置,用專(zhuān)門(mén)的語(yǔ)法:{{變量名}}來(lái)標(biāo)記/占位
  本例中:君珠?
  1.3 找到界面中將來(lái)可能觸發(fā)事件的元素寝志,用專(zhuān)門(mén)的語(yǔ)法: @事件名="事件處理函數(shù)名" 來(lái)標(biāo)記
  本例中: ?-->
  <div id="app">
    <button @click="minus">-</button>
    <span>{{n}}</span>
    <button @click="add">+</button>
  </div>
  <script>
    //2. 創(chuàng)建一個(gè)new Vue()對(duì)象葛躏,來(lái)監(jiān)控div所包含的區(qū)域。
    var vm=new Vue({
      //vue對(duì)象中悠菜,必須用el屬性舰攒,告訴new Vue()要監(jiān)控的區(qū)域是哪里: (el其實(shí)是element的縮寫(xiě))
      //  id選擇器
      el:"#app",
      //3. 定義模型對(duì)象,來(lái)保存界面中所需的所有變量和事件處理函數(shù)
      //什么是模型對(duì)象: 就是專(zhuān)門(mén)替界面保存變量和事件處理函數(shù)的特殊的對(duì)象
      //3.1 先創(chuàng)建一個(gè)data:{}來(lái)保存界面中所需的所有變量和初始值
      //本例中: 因?yàn)榻缑嫔现恍枰粋€(gè)變量n悔醋,所以data中才需要1個(gè)變量n
      data:{
        n:0
      },
      //3.2 再創(chuàng)建一個(gè)methods:{}來(lái)保存界面中所需的所有事件處理函數(shù)
      //本例中: 因?yàn)榻缑嬷行枰?個(gè)事件處理函數(shù)摩窃,所以methods中應(yīng)該定義兩個(gè)函數(shù)
      methods:{
        add(){
          this.n++;
        },
        minus(){
          if(this.n>0){
            this.n--;
          }
        }
      }
      //強(qiáng)調(diào):
      //3.2.1 methods中的事件處理函數(shù)中,如果要操作data中的變量芬骄,必須加this.
      //3.2.2 methods中的事件處理函數(shù)中猾愿,根本不用考慮如何從界面取值,也不用考慮如何將新值放回界面账阻,只需要專(zhuān)門(mén)考慮如何把data中的變量值修改正確即可蒂秘!
      
      //new Vue()會(huì)自動(dòng)保持界面中變量n和data中變量n同步: 
      //開(kāi)局時(shí),data中n是幾淘太,new Vue()就把n的值送到頁(yè)面上姻僧,對(duì)應(yīng)位置顯示給人看
      //當(dāng)methods中修改了n的值规丽,new Vue()會(huì)自動(dòng)把n的新值自動(dòng)更新到界面中n所在的位置給人看
    });
    console.log(vm);
  </script>
</body>
</html>

運(yùn)行結(jié)果:
image.png

三. MVVM:

1.舊的前端程序劃分為三部分:
(1). HTML: 專(zhuān)門(mén)定義網(wǎng)頁(yè)內(nèi)容
(2). CSS: 專(zhuān)門(mén)定義網(wǎng)頁(yè)內(nèi)容的樣式
(3). JS: 專(zhuān)門(mén)為網(wǎng)頁(yè)添加交互行為

  1. 問(wèn)題: HTML和CSS功能太弱,甚至不支持程序該有基本功能: 變量撇贺,運(yùn)算赌莺,分支、循環(huán)松嘶。所以艘狭,哪怕一點(diǎn)兒修改,都要麻煩js來(lái)操作翠订。導(dǎo)致js的任務(wù)量非常繁重巢音,且存在大量重復(fù)勞動(dòng)。
3. 解決: MVVM設(shè)計(jì)模式蕴轨,是對(duì)前端三大部分的重新劃分港谊。

(1). 界面(View):
a. 包括HTML+CSS
b. 增強(qiáng)版: 支持程序的基本功能: 變量,運(yùn)算橙弱,分支和循環(huán).
(2). 模型對(duì)象(Model):
a. 什么是: 專(zhuān)門(mén)替界面保存所屬的變量和函數(shù)的特殊對(duì)象
b. 今后歧寺,只要界面上需要用到哪些變量和函數(shù)時(shí),都要保存在模型對(duì)象中
(3). 視圖模型(ViewModel)
a. 什么是: 專(zhuān)門(mén)自動(dòng)將模型對(duì)象中的變量和函數(shù)棘脐,自動(dòng)傳遞到界面上指定位置的特殊對(duì)象
b. 何時(shí): 今后斜筐,只要希望有人自動(dòng)將模型對(duì)象中的變量和函數(shù)自動(dòng)運(yùn)送到界面上,都要定義視圖模型蛀缝。

4. Vue框架如何實(shí)現(xiàn)MVVM設(shè)計(jì)模式的: Vue的綁定原理

(1). 創(chuàng)建new Vue()對(duì)象, 2件事:
a. 隱藏data中的原變量顷链,自動(dòng)為data中原變量創(chuàng)建訪(fǎng)問(wèn)器屬性。從此屈梁,在new Vue中使用的任何變量嗤练,其實(shí)都只能是訪(fǎng)問(wèn)器屬性。
b. 引入methods并打散methods為多個(gè)函數(shù)在讶。
1). 原methods中的函數(shù)煞抬,不再隸屬于methods,而是直接隸屬于new Vue()對(duì)象了
2). 所以构哺,methods中的函數(shù)打散后與訪(fǎng)問(wèn)器屬性平級(jí)革答,所以,methods中的方法曙强,想訪(fǎng)問(wèn)訪(fǎng)問(wèn)器屬性變量残拐,必須加this.
(2). new Vue()中el:"#app"在指引new Vue()對(duì)象去創(chuàng)建虛擬DOM樹(shù)
a. 掃描el屬性:"#app"所指的頁(yè)面區(qū)域的真實(shí)DOM樹(shù),只找出可能發(fā)生變化的元素碟嘴,保存進(jìn)虛擬DOM樹(shù)中
b. 今后溪食,只要new Vue()中修改了變量,其實(shí)就是修改了訪(fǎng)問(wèn)器屬性娜扇。
1). 訪(fǎng)問(wèn)器屬性就會(huì)向虛擬DOM樹(shù)發(fā)出通知
2). 虛擬DOM樹(shù)掃描內(nèi)部所有可能發(fā)生變化的元素眠菇,找出受本次變量修改影響的個(gè)別元素边败。
3). 虛擬DOM樹(shù)利用內(nèi)部已經(jīng)封裝好的DOM操作,只修改頁(yè)面上受本次影響的元素捎废。不受本次影響的元素笑窜,不會(huì)改變。
(3). 總結(jié): Vue的綁定原理=訪(fǎng)問(wèn)器屬性+虛擬DOM樹(shù)

5. 虛擬DOM樹(shù)的優(yōu)點(diǎn):

(1). 小 —— 只包含受影響的元素
(2). 遍歷快
(3). 更新效率高—— 只更新受影響的元素登疗,不受影響的元素保持不變排截。
(4). 避免重復(fù)編碼—— 已經(jīng)封裝了DOM增刪改查操作,可自動(dòng)更新頁(yè)面內(nèi)容辐益。


圖片2.png

四. 綁定語(yǔ)法: 學(xué)名: 插值語(yǔ)法 Interpolation

  1. 什么是: 專(zhuān)門(mén)在HTML語(yǔ)言中標(biāo)記可能發(fā)生變化的元素內(nèi)容的特殊語(yǔ)法
  2. 何時(shí): 今后跪削,只要一個(gè)元素的內(nèi)容库继,在程序執(zhí)行過(guò)程中,可能會(huì)被改變,都要用綁定語(yǔ)法來(lái)標(biāo)記
3. 如何: <元素>其它文本{{變量名}}其它文本</元素>

4. 結(jié)果:
(1). 首次加載頁(yè)面時(shí)撮执,new Vue()會(huì)自動(dòng)去data中查找同名的變量蛮拔,并將變量值眷蜈,替換{{}}所在的位置
(2). 今后只要在new Vue()中修改了{(lán){}}中的變量后怒炸,new Vue()都會(huì)自動(dòng)將變量的新值重新替換{{}}的位置。

  1. {{}}內(nèi)部: 和模板字符串的${}中規(guī)則一樣
    (1). 可以放: 有返回值的語(yǔ)法正確的js表達(dá)式
    比如: 變量, 算術(shù)計(jì)算, 三目, 訪(fǎng)問(wèn)數(shù)組元素, 創(chuàng)建對(duì)象, 調(diào)用方法牙瓢。
    (2). 不可以放: 分支和循環(huán)以及沒(méi)有返回值的js表達(dá)式
  2. 示例: 使用綁定語(yǔ)法展示各種數(shù)據(jù):
    _{{}}.html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script src="js/vue.js"></script>
</head>
<body>
  <div id="app">
    <h3>Welcome {{uname}}</h3>
    <h3>性別:{{sex==1?"男":"女"}}</h3>
    <h3>小計(jì):¥{{(price*count).toFixed(2)}}</h3>
    <h3>下單時(shí)間: {{new Date(orderTime).toLocaleString()}}</h3>
    <h3>今天星期{{week[day]}}</h3>
  </div>
  <script>
    new Vue({
      el:"#app",
      data:{
        uname:"dingding",
        sex:1,
        price:12.5,
        count:5,
        orderTime:1614158191101,
        week:["日","一","二","三","四","五","六"],
        day:new Date().getDay()
      }
    })
  </script>
</body>
</html>

運(yùn)行結(jié)果:
Welcome dingding
性別:男
小計(jì):¥62.50
下單時(shí)間: 2021/2/24下午5:16:31
今天星期二

五. 指令(directive):

  1. 問(wèn)題: 如果一個(gè)元素的屬性值隨程序自動(dòng)變化劫拗,則如果用{{}}標(biāo)記,會(huì)報(bào)錯(cuò)矾克!
  2. 解決: 今后页慷,只要元素的屬性可能發(fā)生變化,都要用"指令"來(lái)代替{{}}
3. vue中包括: 13種:

(1). v-bind:
a. 什么是: 專(zhuān)門(mén)用來(lái)標(biāo)記屬性值變化的特殊指令
b. 如何:
1). 標(biāo)準(zhǔn): <元素 v-bind:屬性名="變量或js表達(dá)式">
html地盤(pán) | js的地盤(pán) |
2). 簡(jiǎn)寫(xiě): <元素 :屬性名="變量或js表達(dá)式">
c. 原理: new Vue()只要掃描到":"胁附,就會(huì)先執(zhí)行=右側(cè)""中的js變量或表達(dá)式酒繁。然后用變量值或js表達(dá)式的運(yùn)行結(jié)果,作為當(dāng)前屬性的屬性值控妻!
d. 強(qiáng)調(diào):
1). 一旦屬性上加了:州袒,則不要再加{{}}了!""就起到了{(lán){}}的作用饼暑。
2). ""之內(nèi)變成了js的語(yǔ)法天下稳析!必須遵守js的語(yǔ)法洗做!
e. 示例: 根據(jù)pm25數(shù)值弓叛,顯示不同的圖片
4_v-bind.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>根據(jù)程序中PM25的數(shù)值顯示不同的表情</title>
  <script src="js/vue.js"></script>
</head>
<body>
  <div id="app">
    <!--哪里可能隨程序自動(dòng)改變?-->
    <img :src="pm25<100?'img/1.png':pm25<200?'img/2.png':pm25<300?'img/3.png':'img/4.png'">
    <h3>{{pm25<100?'img/1.png':pm25<200?'img/2.png':pm25<300?'img/3.png':'img/4.png'}}</h3>
  </div>
  <script>
    var vm=new Vue({
      el:"#app",
      data:{
        //程序中只保存pm2.5的數(shù)值诚纸,不保存圖片路徑
        pm25:160
      }
    })
    //運(yùn)行后撰筷,F(xiàn)12打開(kāi)控制臺(tái),console畦徘,輸入vm.pm25=數(shù)值毕籽,觀察頁(yè)面上圖片的變化.
  </script>
</body>
</html>

運(yùn)行結(jié)果:
image.png
(2). v-show:

a. 什么是: 專(zhuān)門(mén)根據(jù)條件控制一個(gè)元素的顯示隱藏
b. 如何: <元素 v-show="變量或js表達(dá)式">
c. 原理: new Vue()只要掃描到v-show抬闯,就會(huì)先執(zhí)行=右邊""中的變量或js表達(dá)式:
1). 如果=右邊的變量或js表達(dá)式結(jié)果為true,則當(dāng)前元素正常顯示
2). 如果=右邊的變量或js表達(dá)式結(jié)果為false关筒,則當(dāng)前元素隱藏(new Vue()自動(dòng)將v-show替換為display:none)溶握!
d. 示例: 點(diǎn)按鈕彈出框
5_v-show.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script src="js/vue.js"></script>
  <style>
    #pop{
      position:fixed;
      top:50%;
      left:50%;
      width:300px;
      height:100px;
      margin-left:-150px;
      margin-top:-50px;
      background-color:lightBlue
    }
    #pop>a{
      float:right;
      margin-right:20px;
      text-decoration:none;
    }
  </style>
</head>
<body>
  <!--VUE 3步
  1. 做界面: 
  1.1 唯一父元素
  1.2 找可能發(fā)生變化的元素
  本例中:div的顯示隱藏狀態(tài)有可能變化
  1.3 找觸發(fā)事件的元素
  本例中: 
    button觸發(fā)事件,顯示對(duì)話(huà)框
    a觸發(fā)事件蒸播,隱藏對(duì)話(huà)框
  -->
  <div id="app">
    <button @click="show">click me</button>
    <div v-show="visible" id="pop">
      <a href="javascript:;" @click="hide">×</a>
    </div>
  </div>
  <script>
    //2. 創(chuàng)建new Vue()對(duì)象睡榆,監(jiān)控id為app的區(qū)域
    new Vue({
      el:"#app",
      //3. 創(chuàng)建模型對(duì)象: 
      //3.1 創(chuàng)建data對(duì)象
      //本例中: 只用到一個(gè)變量visible,所以
      data:{
        visible:false, //專(zhuān)門(mén)用來(lái)保存彈出框的顯示隱藏狀態(tài)袍榆。開(kāi)局胀屿,因?yàn)閺棾隹螂[藏,所以變量值為false包雀。
      },
      //3.2 創(chuàng)建methods對(duì)象
      //本例中: 因?yàn)榻缑嫔闲枰?個(gè)事件處理函數(shù)宿崭,所以,methods中也應(yīng)該保存2個(gè)事件處理函數(shù)
      methods:{
        show(){
          this.visible=true;
        },
        hide(){
          this.visible=false;
        }
      }
    })
  </script>
</body>
</html>

運(yùn)行結(jié)果:
image.png
(3). v-if和v-else:

a. 什么是: 專(zhuān)門(mén)根據(jù)條件在兩個(gè)元素之間二選一顯示隱藏
b. 如何:
<元素1 v-if="變量或js表達(dá)式">
<元素2 v-else>

強(qiáng)調(diào): v-if和v-else兩個(gè)元素之間必須緊挨著寫(xiě)才写,不能插入任何其他元素.
c. 原理: new Vue()掃描到v-if時(shí)葡兑,總是先執(zhí)行=右邊""中的變量和js表達(dá)式:
1). 如果v-if=右邊的變量或js表達(dá)式返回true,則顯示v-if所在的元素琅摩,而刪除v-else所在元素
2). 如果v-if=右邊的變量或js表達(dá)式返回false铁孵,則刪除v-if所在的元素,而保存v-else所在的元素
d. 問(wèn)題:為什么已經(jīng)刪除的元素房资,后來(lái)還能回到頁(yè)面上
原理: 每次刪除的指示真實(shí)DOM樹(shù)中的元素對(duì)象蜕劝。而虛擬DOM樹(shù)中始終同時(shí)保存著v-if和v-else兩個(gè)元素對(duì)象。每次變量發(fā)生變化時(shí)轰异,并不是直接掃描真實(shí)DOM樹(shù)岖沛,而是掃描虛擬DOM樹(shù)中兩個(gè)元素對(duì)象,決定這次派誰(shuí)上場(chǎng)搭独!
e. v-if和v-show的差別:
1). v-show: 用display:none隱藏元素
2). v-if: 用刪除元素方式來(lái)達(dá)到隱藏的目的

f. 示例: 切換登錄狀態(tài):
6_v-if_v-else.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script src="js/vue.js"></script>
</head>
<body>
  <!--VUE 3步
  1. 做界面
  1.1 唯一父元素包裹
  1.2 找可能發(fā)生變化的元素
  本例中: 兩個(gè)div根據(jù)條件不同二選一顯示
  1.3 找觸發(fā)事件的元素
  本例中: 
    點(diǎn)擊登錄的a元素時(shí)婴削,切換為已登錄狀態(tài)
    點(diǎn)擊注銷(xiāo)的a元素時(shí),切換為未登錄狀態(tài)-->
  <div id="app">
    <!--已登錄時(shí)顯示-->
    <!--       記錄當(dāng)前用戶(hù)是否登錄-->
    <div v-if="isLogin">
      <h3>Welcome dingding <a href="javascript:;" @click="logout">注銷(xiāo)</a></h3>
    </div>
    <!--未登錄時(shí)顯示-->
    <div v-else>
      <a href="javascript:;" @click="login">登錄</a> | 
      <a href="javascript:;">注冊(cè)</a>
    </div>
    
  </div>
  <script>
    //2. 創(chuàng)建new Vue()
    new Vue({
      el:"#app",
      //3. 創(chuàng)建模型對(duì)象
      //3.1 創(chuàng)建data對(duì)象
      //本例中:因?yàn)榻缑嫔闲枰?個(gè)變量牙肝,所以
      data:{
        isLogin:false,//記錄用戶(hù)是否登錄唉俗。開(kāi)局,用戶(hù)暫時(shí)未登錄配椭,所以初始值為false
      },
      //3.2 創(chuàng)建methods對(duì)象
      //本例中:因?yàn)榻缑嬷行枰?個(gè)函數(shù)虫溜,所以
      methods:{
        login(){
          //讓用戶(hù)變成已登錄狀態(tài)
          this.isLogin=true;
        },
        logout(){
          //讓用戶(hù)變回未登錄狀態(tài)
          this.isLogin=false;
        }
      }
    })
  </script>
</body>
</html>

運(yùn)行結(jié)果:
1.png

2.png
(4). v-else-if:

a. 什么是: 和v-if v-else配合來(lái)控制多個(gè)元素多選一顯示的特殊指令
b. 如何:
<元素1 v-if="條件1">
<元素2 v-else-if="條件2">
... ...
<元素n v-else>

c. 原理: new Vue()掃描到v-if時(shí),先執(zhí)行=右邊的條件1股缸。
1). 如果條件1為true衡楞,則顯示v-if所在的元素,刪除之后所有v-else-if和v-else
2). 如果條件1為false敦姻,則先刪除v-if所在的元素瘾境,依次判斷v-else-if后的條件歧杏。只要有任何一個(gè)v-else-if條件滿(mǎn)足,則只保留這一個(gè)v-else-if所在的元素迷守,刪除其余元素
3). 如果所有v-if 和v-else-if的條件都不滿(mǎn)足犬绒,則刪除所有v-if和v-else-if所在元素,只保留v-else
d. 示例: 根據(jù)pm25值不同兑凿,顯示不同表情
7_v-else-if.html

圖片4.png

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script src="js/vue.js"></script>
</head>
<body>
  <div id="app">
    <img v-if="pm25<100" src="img/1.png" alt="">
    <img v-else-if="pm25<200" src="img/2.png" alt="">
    <img v-else-if="pm25<300" src="img/3.png" alt="">
    <img v-else src="img/4.png" alt="">
  </div>
  <script>
    var vm=new Vue({
      el:"#app",
      data:{
        pm25:160
      }
    })
  </script>
</body>
</html>

運(yùn)行結(jié)果:


image.png
(5). v-for:

a. 什么是: 專(zhuān)門(mén)根據(jù)一個(gè)數(shù)組的內(nèi)容反復(fù)生成多個(gè)相同結(jié)構(gòu)的HTML元素的特殊指令

b. 何時(shí): 今后懂更,只要希望根據(jù)一個(gè)數(shù)組中的元素內(nèi)容,來(lái)生成相應(yīng)個(gè)數(shù)的HTML元素急膀,都要用v-for沮协。

c. 如何: <要反復(fù)生成的元素 v-for="(元素值, 下標(biāo)i) of 數(shù)組">
強(qiáng)調(diào): of前的()中第一個(gè)變量必須接住值,第二個(gè)變量必須接住下標(biāo)/屬性名卓嫂。變量名可以隨便改慷暂,但是順序改不了。
d. 原理: new Vue()只要掃描到v-for晨雳,就會(huì)自動(dòng)遍歷of后的數(shù)組中每個(gè)元素行瑞。每遍歷一個(gè)元素,就自動(dòng)返回元素的內(nèi)容和下標(biāo)餐禁,保存到of前的兩個(gè)變量中血久。并且,每遍歷一個(gè)元素帮非, v-for都自動(dòng)創(chuàng)建一個(gè)當(dāng)前HTML元素的副本氧吐。遍歷了數(shù)組中的幾個(gè)元素,最終就會(huì)反復(fù)創(chuàng)建幾個(gè)相同結(jié)構(gòu)的HTML元素副本末盔。

e. v-for還能遍歷對(duì)象中每個(gè)屬性:
1). 其實(shí)vue中的v-for統(tǒng)一了js中for of和for in的功能
2). 其實(shí)v-for="(元素值, 下標(biāo)i) in 數(shù)組/對(duì)象"
3). 其實(shí)寫(xiě)in和寫(xiě)of完全一樣筑舅!都是既能遍歷索引數(shù)組,又能遍歷對(duì)象中的屬性陨舱。
f. VUE2的兩個(gè)著名的坑:
1). 如果使用"數(shù)組[下標(biāo)]=新值"方式來(lái)修改數(shù)組中某個(gè)位置的元素翠拣,則即使數(shù)組內(nèi)容可以修改成功,那么頁(yè)面也不會(huì)跟著自動(dòng)變化
原因: vue中并沒(méi)有給數(shù)組中的數(shù)字下標(biāo)添加任何訪(fǎng)問(wèn)器屬性游盲,所以vue中所有數(shù)字下標(biāo)误墓,都是不受監(jiān)控的!
臨時(shí)解決: 所有對(duì)數(shù)組的修改益缎,不要用下標(biāo)來(lái)做谜慌。用數(shù)組類(lèi)型提供的那些API函數(shù)來(lái)實(shí)現(xiàn)。
比如: 想修改數(shù)組中1位置的元素值為新值:
錯(cuò)誤: 數(shù)組[1]=新值
正確: 數(shù)組.splice(1,1,新值)
從1位置刪除1個(gè)元素
再將新值插入到1位置——完成替換
將來(lái)解決: 升級(jí)到VUE3链峭,自動(dòng)解決了.
2). 在運(yùn)行時(shí)畦娄,為對(duì)象添加新屬性又沾,則新屬性不會(huì)自動(dòng)更新界面弊仪。
原因: VUE2的new Vue()只能對(duì)開(kāi)局時(shí)對(duì)象中現(xiàn)有的屬性自動(dòng)添加訪(fǎng)問(wèn)器屬性熙卡。而,將來(lái)在運(yùn)行時(shí)励饵,由程序動(dòng)態(tài)添加的屬性驳癌,都無(wú)法實(shí)時(shí)自動(dòng)獲得訪(fǎng)問(wèn)器屬性。所以役听,又會(huì)出現(xiàn)不受監(jiān)控的屬性
解決: 只能升級(jí)VUE3

g. v-for的問(wèn)題:
1). v-for很蠢颓鲜,即使我們?cè)诔绦蛑兄恍薷牧艘粋€(gè)元素值,因?yàn)関-for無(wú)法區(qū)分頁(yè)面上的HTML元素典予,所以甜滨,只能刪除整個(gè)列表,重建整個(gè)列表瘤袖∫履Γ——效率低
2). 根本原因: v-for反復(fù)生成的多個(gè)HTML元素副本,沒(méi)有差別捂敌!
3). 解決: vue規(guī)定艾扮,今后只要使用v-for,都必須為元素同時(shí)綁定:key屬性占婉,且屬性值應(yīng)該是一個(gè)不重復(fù)的下標(biāo)或?qū)傩悦?br> 4). 如何:
<元素 v-for="(元素值, 下標(biāo)i) of 數(shù)組" :key="下標(biāo)i">
5). 原理:
i. 今后泡嘴,v-for每創(chuàng)建一個(gè)HTML元素副本,都會(huì)綁定一個(gè)key屬性逆济,屬性值為數(shù)組中一個(gè)不重復(fù)的下標(biāo)
ii. 今后酌予,當(dāng)更新數(shù)組中某一個(gè)元素時(shí),v-for就可根據(jù)HTML元素上綁定的唯一的key屬性值奖慌,只找到對(duì)應(yīng)的一個(gè)HTML元素霎终,修改其內(nèi)容即可。不會(huì)更新列表——效率高升薯!
6). 總結(jié): v-for為什么必須帶:key
為每個(gè)元素添加唯一標(biāo)識(shí)莱褒,避免更新一個(gè)元素時(shí)重建整個(gè)列表.

h. 示例: 使用v-for遍歷索引數(shù)組和對(duì)象
8_v-for.html

3.png

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script src="js/vue.js"></script>
</head>
<body>
  <div id="app">
    <h3>遍歷數(shù)組中每個(gè)元素</h3>
    <ul>
      <li v-for="(str,i) of arr" :key="i">
        {{i+1}} - {{str}}
      </li>
    </ul>
    <h3>遍歷對(duì)象中每個(gè)屬性</h3>
    <ul>
      <li v-for="(屬性值, 屬性名) of lilei" :key="屬性名">{{屬性名}} - {{屬性值}}</li>
    </ul>
  </div>
  <script>
    var vm=new Vue({
      el:"#app",
      data:{
        arr:["亮亮","楠楠","東東"],
        lilei:{
          sname:"Li Lei",
          sage:11,
          class:"初一2班"
        }
      }
    })
    //1. vm.arr[1]="濤濤" //修改不成功
    //2. vm.arr.splice(1,1,"濤濤") //成功
    //3. vm.lilei.money=100  //沒(méi)成功
  </script>
</body>
</html>

運(yùn)行結(jié)果:
遍歷數(shù)組中每個(gè)元素
?1 - 亮亮
?2 - 楠楠
?3 - 東東
遍歷對(duì)象中每個(gè)屬性
?sname - Li Lei
?sage - 11
class - 初一2班

i. 其實(shí)v-for也可以根據(jù)一個(gè)整數(shù)反復(fù)生成指定個(gè)數(shù)的HTML元素.
1). <元素 v-for="i of 整數(shù)" :key="i">
2). 原理: v-for會(huì)自動(dòng)從1開(kāi)始,連續(xù)數(shù)數(shù)涎劈,數(shù)到給定的整數(shù)結(jié)束广凸。每數(shù)一個(gè)數(shù),就自動(dòng)創(chuàng)建當(dāng)前HTML元素的一個(gè)副本蛛枚。
3). 示例: 生成分頁(yè)按鈕
9_v-for_pages.html

![4.png](https://upload-images.jianshu.io/upload_images/22277500-58d42cbaae9910a2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script src="js/vue.js"></script>
  <style>
    ul{
      list-style: none;
    }
    ul>li{
      float:left;
      width:40px;
      height:40px;
      text-align:center;
      line-height:40px;
      border:1px solid #555;
      border-radius: 5px;
      margin-left:5px;
    }
    ul>li:hover{
      cursor:pointer;
      background-color:lightskyblue;
      color:#fff;
      border:0;
    }
  </style>
</head>
<body>
  <div id="app">
    <ul>
      <li v-for="i of pageCount" :key="i">{{i}}</li>
    </ul>
  </div>
  <script>
    var vm=new Vue({
      el:"#app",
      data:{
        pageCount:10 //共6頁(yè)
      }
    })
  </script>
</body>
</html>

運(yùn)行結(jié)果:


5.png

常見(jiàn)錯(cuò)誤: Error compiling template : 模板編譯錯(cuò)誤
通常因?yàn)镠TML中所寫(xiě)的HTML標(biāo)簽或綁定語(yǔ)法不符合vue的要求了谅海!
進(jìn)一步確定出錯(cuò)的位置:
沿控制臺(tái)左側(cè)向下找,跳過(guò)大片的HTML代碼蹦浦,找到一個(gè)很短的"-"扭吁,這里標(biāo)記的就是出錯(cuò)的位置!

總結(jié):

1. MVVM: 界面View+模型Model+視圖模型ViewModel
2. Vue綁定原理: 訪(fǎng)問(wèn)器屬性+虛擬DOM樹(shù)
變量被修改時(shí): 訪(fǎng)問(wèn)器屬性發(fā)出通知,虛擬DOM樹(shù)掃描并僅更新受影響的元素
3. 虛擬DOM樹(shù)優(yōu)點(diǎn):
(1). 小: 只包含可能變化的元素侥袜。
(2). 遍歷查找快
(3). 修改效率高: 只修改受影響的元素蝌诡。
(4). 避免重復(fù)編碼: 已封裝DOM增刪改查代碼
4. Vue功能3步:
(1). 先創(chuàng)建增強(qiáng)版的界面:
a. 整個(gè)界面必須包含在一個(gè)唯一的父元素下:
通常是<div id="app">
b. 可能變化的元素內(nèi)容用{{自定義變量名}}標(biāo)記
c. 觸發(fā)事件的元素用@click="自定義處理函數(shù)名"標(biāo)記
(2). 再創(chuàng)建new Vue()對(duì)象,其中el:指向new Vue()要監(jiān)控的頁(yè)面區(qū)域
(3). 在new Vue()對(duì)象內(nèi)定義模型對(duì)象data和methods
a.界面所需的所有變量都放在data中
b.界面所需的所有事件處理函數(shù)都放在methods中

5. 總結(jié): 綁定語(yǔ)法+13種指令
(1). 如果元素的內(nèi)容需要隨變量自動(dòng)變化: {{}}
(2). 如果元素的屬性值需要隨變量自動(dòng)變化: :
(3). 控制一個(gè)元素顯示隱藏: v-show
(4). 控制兩個(gè)元素二選一顯示: v-if v-else
(5). 多個(gè)元素多選一顯示: v-if v-else-if v-else
(6). 只要反復(fù)生成多個(gè)相同結(jié)構(gòu)的元素組成列表時(shí): v-for :key="唯一標(biāo)識(shí)"

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市枫吧,隨后出現(xiàn)的幾起案子浦旱,更是在濱河造成了極大的恐慌,老刑警劉巖九杂,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件颁湖,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡例隆,警方通過(guò)查閱死者的電腦和手機(jī)甥捺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)镀层,“玉大人涎永,你說(shuō)我怎么就攤上這事÷瓜欤” “怎么了羡微?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)惶我。 經(jīng)常有香客問(wèn)我妈倔,道長(zhǎng),這世上最難降的妖魔是什么绸贡? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任盯蝴,我火速辦了婚禮,結(jié)果婚禮上听怕,老公的妹妹穿的比我還像新娘捧挺。我一直安慰自己,他們只是感情好尿瞭,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布闽烙。 她就那樣靜靜地躺著,像睡著了一般声搁。 火紅的嫁衣襯著肌膚如雪黑竞。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,182評(píng)論 1 299
  • 那天疏旨,我揣著相機(jī)與錄音很魂,去河邊找鬼。 笑死檐涝,一個(gè)胖子當(dāng)著我的面吹牛遏匆,可吹牛的內(nèi)容都是我干的法挨。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼幅聘,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼凡纳!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起喊暖,我...
    開(kāi)封第一講書(shū)人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎撕瞧,沒(méi)想到半個(gè)月后陵叽,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡丛版,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年巩掺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片页畦。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡胖替,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出豫缨,到底是詐尸還是另有隱情独令,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布好芭,位于F島的核電站燃箭,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏舍败。R本人自食惡果不足惜招狸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望邻薯。 院中可真熱鬧裙戏,春花似錦、人聲如沸厕诡。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)灵嫌。三九已至信柿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間醒第,已是汗流浹背渔嚷。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留稠曼,地道東北人形病。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親漠吻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子量瓜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 一、簡(jiǎn)介 Vue (讀音 /vju?/途乃,類(lèi)似于 view) 是一套用于構(gòu)建用戶(hù)界面的漸進(jìn)式框架绍傲。與其它大型框架不同...
    想聽(tīng)丿伱說(shuō)衹愛(ài)我閱讀 423評(píng)論 0 1
  • 主要還是自己看的,所有內(nèi)容來(lái)自官方文檔耍共。 介紹 Vue.js 是什么 Vue (讀音 /vju?/烫饼,類(lèi)似于 vie...
    Leonzai閱讀 3,348評(píng)論 0 25
  • 為什么要學(xué)習(xí)流行框架 企業(yè)為了提高開(kāi)發(fā)效率:在企業(yè)中,時(shí)間就是效率试读,效率就是金錢(qián);企業(yè)中杠纵,使用框架,能夠提高開(kāi)發(fā)的...
    wanminglei閱讀 626評(píng)論 0 0
  • 這篇筆記主要包含 Vue 2 不同于 Vue 1 或者特有的內(nèi)容钩骇,還有我對(duì)于 Vue 1.0 印象不深的內(nèi)容比藻。關(guān)于...
    云之外閱讀 5,048評(píng)論 0 29
  • Vue.js(讀音/vju?/, 類(lèi)似于 view)是一個(gè)構(gòu)建數(shù)據(jù)驅(qū)動(dòng)的web 界面的漸進(jìn)式框架。Vue.js的目...
    xingyunfuhao閱讀 597評(píng)論 0 0