當(dāng)前位置:首頁 > IT技術(shù) > Web編程 > 正文

Vue.js
2022-02-14 14:19:24

Vue.js

一、Vue.js概述

1. Vue.js介紹

  • Vue.js和Vue相同(讀音 /vju?/,類似于 view) 是一套用于構(gòu)建用戶界面的漸進式JavaScript框架

    漸進式框架要實現(xiàn)的目標(biāo)就是方便項目增量開發(fā)(即插即用)

2. Vue.js庫的引入方法

  • 在HTML頁面使用script標(biāo)簽引入Vue.js的庫即可使用

    遠程CDN 
    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script> 
    本地
    <script src="vue.min.js"></script>
    

3. Vue.js的基本組成

  • Vue.js的基本組成

    1. 標(biāo)簽內(nèi)容中:插值表達式 {{}}

      作用:通常用來獲取Vue實例中定義的各個數(shù)據(jù)(data)

      使用場景:可以作為div標(biāo)簽的內(nèi)容

      標(biāo)簽屬性中不能使用插值表達式

    2. Vue實例中:掛載點(element) el:'xxx'

      作用:定義Vue實例掛載的元素節(jié)點,表示Vue接管該區(qū)域,Vue會管理el選項命中的元素及其內(nèi)部元素

      使用場景:一般寫在Vue實例中,xxx為選擇器

      el選擇掛載點時,建議使用id選擇器

    3. Vue實例中:數(shù)據(jù)對象 data:{xxx}

      作用: Vue中用到的數(shù)據(jù)定義在data中

      使用場景:一般寫在Vue實例中,xxx可以是定義的不同類型數(shù)據(jù)

      data中的類型

      • 普通key:value,value可以是數(shù)字、字符串、布爾值
      • 對象類型數(shù)據(jù)(value是{},在{}中可以包含多組普通key:value)
      • 數(shù)組類型(value是[],在[]中包含多個value)
    4. Vue實例中:方法methods:{xxx}

      作用:在{}中可以包含多組方法定義方法名:function(){}

      使用場景:一般寫在Vue實例中,其中在一個方法的定義中可以使用this獲取當(dāng)前實例數(shù)據(jù)對象data中的某字段的value,獲取后的字段可以看作是一個全局變量,可以在多個方法的定義中對其value進行改變

    5. Vue實例中的其他屬性

      • computed
      • filters
      • watch
      • components
    6. 示例Code

      <body>
          <div id="app">
              <!-- {{}} 雙括號是 VUE 中的差值表達式,將表達式的值輸出到 HTML 頁面 -->
              {{name}} <br>
              {{student.name}} {{student.age}}
              <ul>
                  <li>{{names[0]}}</li>
                  <li>{{names[1]}}</li>
                  <li>{{names[2]}}</li>
              </ul>
          </div>
      </body>
      
      <script>
      var VM = new Vue({
          // 定義 Vue 實例掛載的元素節(jié)點,表示 vue 接管該 div
          el:"#app",
          // 定義 model 模型數(shù)據(jù)對象
          data:{
              name:"hello, how are you doing",
              // 對象類型
              student: {
                  name: "Jeff",
                  age: "18"
              },
              // 數(shù)組類型
              names: ["Kim", "Chris", "Jack"]
          }
      })
      </script>
      

4. Vue.js的特點

  • Vue.js聲明式渲染的好處

    聲明數(shù)據(jù),Vue幫我們將數(shù)據(jù)渲染到HTML,將數(shù)據(jù)和DOM分離

    使用jQuery將數(shù)據(jù)渲染到HTML有時需要將數(shù)據(jù)和標(biāo)簽進行拼接,這種方式將會影響程序執(zhí)行效率

    在Vue中不需要考慮如何更改DOM元素, 重點放在更改數(shù)據(jù), 數(shù)據(jù)更新之后, 使用數(shù)據(jù)的那個元素會同步更新

二、Vue.js常用指令

1. 指令概述

  • 指令是帶有 v- 前綴的特殊屬性,通過指令來操作DOM元素(HTML標(biāo)簽)

2. v-text (獲取data中的數(shù)據(jù))

  • 作用: 獲取data中的數(shù)據(jù),設(shè)置標(biāo)簽的內(nèi)容(類似用插值表達式)

    v-text與插值表達式的區(qū)別:

    若v-text所在的標(biāo)簽中有內(nèi)容,v-text 獲取data數(shù)據(jù),設(shè)置標(biāo)簽內(nèi)容,會覆蓋當(dāng)前標(biāo)簽的內(nèi)容

    插值表達式會將標(biāo)簽的內(nèi)容拼接到v-text獲取的內(nèi)容之后

  • v-text的value中可以使用運算符+拼接額外內(nèi)容(拼接內(nèi)容支持?jǐn)?shù)字或字符串)

  • 示例Code

    <body>
        <div id="app">
            <h1>{{message}}</h1>
            <!-- 使用插值表達式,不會覆蓋 -->
            <h1>{{message}}golang</h1>
            <!-- v-text 獲取data數(shù)據(jù),設(shè)置標(biāo)簽內(nèi)容,會覆蓋之前的內(nèi)容體-->
            <!-- 拼接字符串 -->
            <h2 v-text="message+1">golang</h2>
            <h2 v-text="message+'abc'"></h2>
        </div>
    </body>
    
    <script>
        var VM = new Vue({
            el: "#app",
            data: {
                message: "Java Developer"
            }
        })
    </script>
    

2. v-html (設(shè)置標(biāo)簽的 innerHTML)

  • 作用: 設(shè)置元素的 innerHTML,可以向當(dāng)前的標(biāo)簽中寫入新的標(biāo)簽

    與v-text和插值表達式一樣可以獲取data中的數(shù)據(jù),前兩種僅僅是獲取數(shù)據(jù),v-html可以獲取整個標(biāo)簽

  • 使用場景:

    當(dāng)data數(shù)據(jù)中某個key對應(yīng)的value是帶鏈接的a標(biāo)簽時,可以將屬性v-html指定屬性值為這個數(shù)據(jù)的key

  • 示例Code

    <body>
        <div id="app">
            <!-- 獲取普通文本 -->
            {{name}}
            <h1 v-text="name"></h1>
            <h1 v-html="name"></h1>
            
            <!-- 設(shè)置元素的innerHTML -->
            <h1 v-html="url"></h1>
        </div>
    </body>
    
    <script>
        var VM = new Vue({
            el: "#app",
            data: {
                name: "JavaScript Developer",
                url: "<a href='http://www.baidu.com'>baidu</a>"
            }
        })
    </script>
    

3. v-on (為標(biāo)簽綁定事件)

  • 作用:為元素綁定事件, 比如: v-on:click="方法名",可以簡寫為 @click="方法名"

    綁定的方法定義在 Vue實例的, methods屬性中定義

  • 事件綁定方法,可以傳入自定義參數(shù)(定義方法時,需要定義形參,來接收實際的參數(shù))

  • 事件的后面跟上.修飾符可以對事件進行限制,如.enter可以限制觸發(fā)的按鍵為回車

  • 示例Code

    Vue實例methods定義的方法中,使用this代表當(dāng)前實例的data數(shù)據(jù)對象來調(diào)用當(dāng)前實例data中的字段對應(yīng)的value

    <body>
    
        <div id="app">
            <!-- 單擊事件 -->
            <input type="button" value="f1 click here" v-on:click="f1">
            <!-- 單擊事件省略寫法 -->
            <input type="button" value="f2 click here" @click="f2">
            <!-- 雙擊事件 -->
            <input type="button" value="f1 double click" @dblclick="f1">
            <!-- 雙擊事件調(diào)用方法并傳參 -->
            <input type="button" value="hello double click" @dblclick="hello(1, 'a')">
            <!-- 輸入后按下回車調(diào)用方法hi -->
            <input type="text" @keyup.enter="hi">
            <h2 @click="f1">{{name}}</h2>
        </div>
        
    </body>
    
    <script>
        var VM = new Vue({
            el: "#app",
            
            data: {
                name: "Jeff",
                hobby: "hiking"
            },
    
            methods: {
                f1: function() {
                    alert("123!")
                },
    
                f2: function() {
                    alert(this.name)
                    console.log(this.hobby)
                },
    
                hi: function() {
                    alert("hi")
                },
    
                hello: function(p1, p2) {
                    alert(p1+p2)
                } 
            },
        })
    </script>
    

4. v-show (切換內(nèi)容顯示狀態(tài))

  • 作用:根據(jù)布爾值,切換元素內(nèi)容(可以是h1、img標(biāo)簽等)的顯示狀態(tài)(值為true顯示, 為false則隱藏),數(shù)據(jù)改變之后,顯示的狀態(tài)會同步更新

  • 原理:是修改元素的display屬性,實現(xiàn)顯示或者隱藏

  • 使用方法:v-show的屬性值設(shè)置為Vue實例數(shù)據(jù)對象data中的值為布爾的字段名

  • 示例Code

    <body>
        <div id="app">
            <h1 v-show="isShow">Hi, How are you doing?</h1>
            <button v-on:click="f1">click here</button>
        </div>    
    </body>
    
    <script>
        var VM = new Vue({
            el:"#app",
    
            data:{
                isShow: true
            },
    
            methods: {
                f1: function(){
                    this.isShow = !this.isShow;
                }
            }
        })
    </script>
    

5. v-if (切換標(biāo)簽的顯示狀態(tài))

  • 作用:作用同v-show,根據(jù)布爾值切換元素的顯示狀態(tài)

  • 原理:通過操作DOM元素(隱藏整個當(dāng)前標(biāo)簽),來切換顯示狀態(tài),效率較低

  • 使用場景:頻繁切換使用v-show,反之使用v-if

  • 示例Code

    <body>
        <div id="app">
            <h1 v-if="isShow">Have a good day</h1>
            <button v-on:click="f1">click here</button>
        </div>    
    </body>
    
    <script>
        var VM = new Vue({
            el:"#app",
    
            data:{
                isShow: true
            },
    
            methods: {
                f1: function(){
                    this.isShow = !this.isShow;
                }
            }
        })
    </script>
    

6. v-bind (為標(biāo)簽綁定屬性)

  • 作用:標(biāo)簽屬性中不能使用插值表達式,需要使用v-bind為標(biāo)簽綁定屬性

  • 使用方法:完整寫法 v-bind:屬性名,可以簡寫為 :屬性名

  • 示例Code:

    <body>
        <div id="app">
            <!-- 使用v-bind設(shè)置src屬性值 -->
            <img v-bind:src="imgSrc" >
    
            <!-- v-bind簡寫 設(shè)置src屬性值和設(shè)置title屬性值 -->
            <img :src="imgSrc" :title="imgTitle" >
            
            <!-- 設(shè)置class -->
            <div v-bind:style="{fontSize: size + 'px'}">v-bind</div>
            <div :style="{fontSize: size + 'px'}">v-bind</div>
        </div>   
    </body>
    
    <script>
        var VM = new Vue({
            el:"#app",
    
            data:{
                imgSrc:"./img/icon01.jpg",
                imgTitle:"image01",
                size:100
            }
        })
    </script>
    

7. v-for (遍歷數(shù)組生成列表項)

  • 作用:根據(jù)數(shù)據(jù)生成列表結(jié)構(gòu)

  • 數(shù)組經(jīng)常和 v-for結(jié)合使用,數(shù)組有兩個常用方法:

    push() 向數(shù)組末尾添加一個或多個元素

    shift() 把數(shù)組中的第一個元素刪除

  • 數(shù)組的長度可以進行動態(tài)的變化,會同步更新到頁面上,是響應(yīng)式的

  • 示例Code

    <body>
        <div id="app">
            <input type="button" value="add" v-on:click="f1">
            <input type="button" value="remove" v-on:click="f2">
    
            <!-- 對普通數(shù)組進行遍歷 -->
            <ul>
                <li v-for="(item, index) in arr">
                    {{index}} city: {{item}}
                </li>
            </ul>
            <!-- 對對象數(shù)組進行遍歷 -->
            <ul>
                <li v-for="p in persons">
                    {{p.name}}
                </li>
            </ul>
        </div>   
    </body>
    
    <script>
        var VM = new Vue({
            el:"#app",
    
            data:{
                // 普通數(shù)組
                arr:["Detroit", "Chicago", "San Francisco"],
                // 對象數(shù)組
                persons:[
                {name: "Jeff"},
                {name: "Lucy"},
                {name: "Helen"}
                ]
            },
    
            methods: {
                f1: function(){
                    this.persons.push({name: "Chris"});
                },
    
                f2: function(){
                    this.persons.shift();
                }
            },
        })
    </script>
    

三、MVVM模式

1. MVVM概述

  • MVVM模式將頁面,分層了 M 、V、和VM ,解釋為:

    Model: 負責(zé)數(shù)據(jù)存儲

    View: 負責(zé)頁面展示

    View Model: 負責(zé)業(yè)務(wù)邏輯處理(比如Ajax請求等),對數(shù)據(jù)進行加工后交給視圖展示

  • 示例Code

    <body>
        <div id="app"> 
            <!-- View 視圖部分 --> 
            <h2>{{name}}</h2> 
        </div> 
    </body>
    
    <script> 
        //創(chuàng)建的vue實例,就是 VM ViewModel
        var VM = new Vue({ 
            el: "#app", 
            //data就是MVVM模式中的 model
            data: { 
                name: "hello", 
        	}, 
        }); 
    </script>
    

2. 數(shù)據(jù)雙向綁定

  • MVVM提供了數(shù)據(jù)的雙向綁定

    • 單向綁定: 就是把Model綁定到View,當(dāng)我們用JavaScript代碼更新Model時,View就會自動更新

      <body>
          <div id="app">
              <input type="text" v-bind:value="message">
              <input type="button" value= "next one" v-on:click="f1">
          </div>
      </body>
      
      <script>
          var VM = new Vue({
              el:"#app",
              data:{
                  message:"how are you doing"
              },
              methods:{
                  f1:function(){
                      this.message="I am good"
                  }
              }
          })
      </script>
      
    • 雙向綁定: 用戶更新了View,Model的數(shù)據(jù)也自動被更新了,這種情況就是雙向綁定

      更新View的情況:

      填寫表單就是一個最直接的例子。當(dāng)用戶填寫表單時,View的狀態(tài)就被更新了,如果此時

      MVVM框架可以自動更新Model的狀態(tài),那就相當(dāng)于我們把Model和View做了雙向綁定

  • v-mode指令實現(xiàn)數(shù)據(jù)雙向綁定

    v-model 指令的作用:

    • 便捷的設(shè)置和獲取表單元素的值
    • 綁定的數(shù)據(jù)會和表單元素值相關(guān)聯(lián)
    • 雙向數(shù)據(jù)綁定
    <body>
    
        <div id="app">
            <!-- 通過在view輸入內(nèi)容來修改model -->
            <input type="text" v-model="message"><br/>
            <input type="text" v-model="password"><br/>
            <!-- 按鈕通過調(diào)用方法修改model來改變view上的輸出結(jié)果 -->
            <input type="button" value="update" @click="f1"><br/>
            {{message}}<br/>
            {{password}}<br/>
        </div>
    
    </body>
    
    <script>
        var VM = new Vue({
            el:"#app",
            data:{
                message:"how are you doing",
                password:"123"
            },
            methods: {
                f1:function(){
                    this.message="this item has been changed";
                    this.password="this item has been changed";
                }
            },
        })
    </script>
    

四、axios庫

1. axios概述

  • axios:目前十分流行網(wǎng)絡(luò)請求庫, 專門用來發(fā)送請求, 其內(nèi)部還是Ajax, 進行封裝之后使用更加方便

    Vue2.0之后建議用axios替換jQuery Ajax

  • 作用: 在瀏覽器中可以幫助我們完成Ajax異步請求的發(fā)送

    Ajax 是一種在無需重新加載整個網(wǎng)頁的情況下,能夠更新部分網(wǎng)頁的技術(shù), 維護用戶體驗性, 進行網(wǎng)頁的局部刷新

  • axios庫的引入方法

    <!-- 官網(wǎng)提供的 axios 在線地址 --> 
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    <!-- 本地引入axios --> 
    <script src="./js/axios.min.js"></script>
    

2. axios發(fā)送請求

  • GET

    • 一般格式

      axios.get(URL?key=value&key2=value2).then(function(response){},function(error) {});
      

      要訪問接口的URL和key主要由接口文檔提供

      then方法中的傳參是回調(diào)函數(shù):

      function(response){}表示請求后有響應(yīng)就會觸發(fā)

      function(error) {}表示請求后失敗就會觸發(fā)

      通過回調(diào)函數(shù)的形參可以獲取響應(yīng)的內(nèi)容或者錯誤信息

    • 示例Code

      接口文檔

      請求地址:https://autumnfish.cn/api/joke/list 
      請求方法:get 
      請求參數(shù):num(笑話條數(shù),數(shù)字) 
      響應(yīng)內(nèi)容:隨機笑話
      

      從URL中獲取2條笑話,打印在console上

      <body>
          <input type="button" value="get請求" id="get"/>
      </body>
      
      <script>
          document.getElementById("get").onclick = function() {
              axios.get("https://autumnfish.cn/api/joke/list?num=2").then(
                  //請求成功,調(diào)用
                  function(resp) {
                      console.log(resp);
                  },
                  //請求失敗,調(diào)用
                  function(err) {
                      console.log(err);
                  }
              );
          };
      </script>
      
  • POST

    • 一般格式

      axios.post(URL,{key:value,key2:value2}).then(function(response) {},function(error){})
      

      要訪問接口的URL和key主要由接口文檔提供

      then方法中的傳參是回調(diào)函數(shù):

      function(response){}表示請求后有響應(yīng)就會觸發(fā)

      function(error) {}表示請求后失敗就會觸發(fā)

      通過回調(diào)函數(shù)的形參可以獲取響應(yīng)的內(nèi)容或者錯誤信息

    • 示例Code

      接口文檔

      請求地址:https://autumnfish.cn/api/user/reg 
      請求方法:post 
      請求參數(shù):username(用戶名,字符串) 
      響應(yīng)內(nèi)容:注冊成功或失敗
      

      通過username進行注冊,將注冊結(jié)果打印在控制臺上

      <body>
          <input type="button" value="post請求" id="post"/>
      </body>
      
      <script>
          document.getElementById("post").onclick = function() {
              axios.post("https://autumnfish.cn/api/user/reg", {username:"123456"}).then(
                  //請求成功,調(diào)用
                  function(resp) {
                      console.log(resp);
                  },
                  //請求失敗,調(diào)用
                  function(err) {
                      console.log(err);
                  }
              );
          };
      </script>
      

3. axios案例

  • 通過Vue+axios 完成一個獲取笑話的案例

    接口文檔:

    請求地址:https://autumnfish.cn/api/joke 
    請求方法:get 
    請求參數(shù):無 
    響應(yīng)內(nèi)容:隨機笑話
    

    示例Code

    axios回調(diào)函數(shù)中this指向已經(jīng)改變, 無法訪問data中的數(shù)據(jù)

    解決方案:

    1. 將this進行保存, 回調(diào)函數(shù)中直接使用保存的this即可
    2. 或者使用ES6的箭頭函數(shù),就可以使用this
    <body>
        <div id="app">
            <input type="button" value="get請求" id="get" v-on:click="getJoke()"/>
            {{message}}
        </div>
    </body>
    
    <script>
        var VM = new Vue({
            el:"#app",
            data:{
                message:"default content"
            },
            methods: {
                getJoke:function() {
                    // 回調(diào)函數(shù)中無法直接調(diào)用this,需要進行保存
                    var that = this;
                    // 異步訪問
                    axios.get("https://autumnfish.cn/api/joke").then(
                        function(resp) {
                            console.log(resp);
                            console.log(resp.data);
                            console.log(that.message);
                            that.message = resp.data;
                        },
                        function(err) {
                            console.log(err);
                        }
                    );
                }
            },
        })
    </script>
    
  • 解決插值表達式閃爍的問題

    • 問題:當(dāng)網(wǎng)絡(luò)較慢,網(wǎng)頁還在加載 Vue.js ,而導(dǎo)致 Vue 來不及渲染,這時頁面就會顯示出 Vue 源代碼

    • 解決方法:可以使用 v-cloak 指令來解決這一問題,可以使頁面加載完成后再進行渲染

      1. 添加樣式

        <style> 
            /* 通過屬性選擇器,設(shè)置 添加了v-cloak */ 
            [v-cloak] { 
                display: none; 
            } 
        </style>
        
      2. 在id為app的div中添加v-cloak

        <div class="wrap" id="app" v-cloak>
        

五、computed

1. 計算屬性概述

  • 作用: 減少運算次數(shù),緩存運算結(jié)果,運用于重復(fù)相同的計算

  • 定義函數(shù)也可以實現(xiàn)與 計算屬性相同的效果,都可以簡化運算

    不同的是計算屬性是基于它們的響應(yīng)式依賴進行緩存的,只在相關(guān)響應(yīng)式依賴發(fā)生改變時它們才會重新求值

2. 計算屬性案例

  • 示例Code

    <body>
        <div id="app">
            <!-- 重復(fù)調(diào)用插值表達式 -->
            <h1>{{a*b}}</h1>
            <h1>{{a*b}}</h1>
            <!-- 調(diào)用方法res1 -->
            <h1>{{res1()}}</h1>
            <h1>{{res1()}}</h1>
            <!-- 計算屬性直接使用屬性名 -->
            <h1>{{res2}}</h1>
            <h1>{{res2}}</h1>
        </div>    
    </body>
        <script>
            var VM = new Vue({
                el:"#app",
                data:{
                    a:10,
                    b:20
                },
                methods:{
                    res1:function(){
                        console.log("res1 is running...");
                        return this.a*this.b;
                    }
                },
                computed:{
                    res2:function(){
                        console.log("res2 is running...");
                        return this.a*this.b;
                    }
                }
            })
        </script>
    

六、filter和watch

1. 過濾器概述

  • 過濾器常被用來處理文本格式化的操作
  • 過濾器使用的兩個位置:插值表達式{{}}、v-bind表達式中
  • 過濾器通過管道(|)傳輸數(shù)據(jù)

2. 局部過濾器

  • 示例Code

    需求: 通過過濾器給電腦價格前面 添加一個符號¥

    <body>
        <div id="app">
            <p>price of computer: {{price | addIcon}}</p>
        </div>    
    </body>
    
    <script>
        var VM = new Vue({
            el:"#app",
            data:{
                price:200
            },
            methods: {
                
            },
            computed: {
    
            },
            //局部過濾器
            filters: {
                //處理函數(shù),value = price ,是固定參數(shù),表示"|"前的部分
                addIcon(value) {
                    return "¥" + value;
                }
            }
        })
    </script>
    

3. 全局過濾器

  • 示例Code

    需求: 將用戶名開頭字母大寫

    <body>
        <div id="app">
            <p>{{user.name | changeName}}</p>
        </div>    
    </body>
    
    <script>
        //在創(chuàng)建Vue實例之前 創(chuàng)建全局過濾器
        Vue.filter("changeName", function(value){
            //將姓名開頭字母大寫,然后再重新拼接
            return value.charAt(0).toUpperCase()+value.slice(1);
        });
    
        var VM = new Vue({
            el:"#app",
            data:{
                user:{
                    name:"tom", 
                }
            },
        })
    </script>
    

4. 偵聽器

  • watch:用于觀察Vue實例上的數(shù)據(jù)變動,觀察變量的變化,進行相應(yīng)的處理

  • 作用:當(dāng)有一些數(shù)據(jù)需要隨其他數(shù)據(jù)變動而變動時,可以使用偵聽屬性

  • 示例Code

    <body>
        <div id="app">
            <h2>counter:{{count}}</h2>
            <input type="button" @click="count++" value="click here">
        </div>
    </body>
    
    <script>
        var VM = new Vue({
            el:"#app",
            data: {
                count:1
            },
            watch: {
                // 監(jiān)聽器中的方法名必須是data中的指定數(shù)據(jù)名
                count:function(nval, oval) {
                    alert("counter has been changed from : " + oval + " to " + nval);
                }
            }
        })
    </script>
    

5. 偵聽器案例

  • 需求: 監(jiān)聽輸入的firstName和lastName的變化,實時顯示fullName

  • 示例Code

    <body>
        <div id="app">
            <div>firstName: <input type="text" v-model="userFirstName"></div>
            <div>lastName: <input type="text" v-model="userLastName"></div>
            {{userFullName}}
        </div>    
    </body>
    
    <script>
        var VM = new Vue({
            el:"#app",
            data: {
                userFirstName:"default_firstName",
                userLastName:"default_lastName",
                userFullName:"default_fullName"
            },
            watch: {
                //監(jiān)聽,程序在運行的時候,實時監(jiān)聽事件
                userFirstName:function(nval, oval){
                    this.userFullName = nval + " " + this.userLastName;
                },
                userLastName:function(nval, oval){
                    this.userFullName = this.userFirstName + " " + nval;
                }
            }
        })
    </script>
    

七、component

1. 組件概述

  • 將相同的功能進行抽取,封裝為組件;在組件化開發(fā)時,只需要書寫一次代碼,隨處引入即可使用
  • 調(diào)用全局組件或是局部組件只能是在Vue接管的區(qū)域中,以標(biāo)簽<組件名></組件名>方式調(diào)用

2. 全局組件

  • 基本格式

    Vue.component("組件名", {
    	template:"<xxx>  </xxx>",
    	data(){
    		return {
    			xxx:"xxx"
    		}
    	},
    	methods:{
    		方法名(){
    
    		}
    	}
    })
    
  • template模板表示組件的內(nèi)容,在template模板中, 只能有一個根元素

  • 組件中的data 必須是一個函數(shù), 注意與Vue實例中的data區(qū)分

    在data函數(shù)中的return中定義數(shù)據(jù)的格式與Vue示例中的data相同

  • 組件名以小寫開頭,采用短橫線分割命名: 例如 hello-Word

  • 示例Code

    <body>
    
        <div id="app">    
            <!-- 可以多次使用組件 -->
            <cony-header></cony-header>
            <cony-header></cony-header>
            <cony-header></cony-header>
        </div>
    
    </body>
    
    <script>
        //全局組件位置在Vue實例之外
        Vue.component("cony-header", {
            //組件的命名一般使用短橫線方式, 組件中的模板只能有一個根元素
            template: "<div>header component code<h1 @click='hello'>{{msg}}</h1></div>",
            //組件中的data是一個函數(shù)
            data() {
                return {
                    msg: "I am good"
                }
            },
            methods: {
                hello(){
                    alert("hi, how are you doing?");
                }
            },
        });
    
        var VM = new Vue({
            el:"#app",
            data:{
    
            },
            methods: {
                
            },
        });
    </script>
    

3. 局部組件

  • 基本格式

    var VM = new Vue({
    	el:"app",
    	components: {
    		組件名: {
    			template: "",
    			data() {
    				return {
    					xxx:"xxx"
    				}
    			}
    		}
    	}
    })
    
  • 局部組件components指的是寫在Vue實例中的組件,與el、methods、data同級

  • 在components中可以定義多個組件

  • 示例Code

    <body>
        <div id="app">
            <web-msg></web-msg>
        </div>    
    </body>
    
    <script>
        var VM = new Vue({
            el:"#app",
            data:{
    
            },
            methods: {
                
            },
            components: {
                "web-msg": {
                    template:"<div><h1>{{msg1}}</h1><h2>{{msg2}}</h2></div>",
                    data() {
                        return{
                            msg1:"developing...",
                            msg2:"complete!"
                        }
                    }
                }
            }
        })
    </script>
    

4. template和組件分離

  • 由于把HTML寫在組件里面不方便也不好看,所以將它們分開寫

  • 分離后,瀏覽器會把 HTML 里的 template 標(biāo)簽過濾掉,所以 template 標(biāo)簽的內(nèi)容是不會在頁面中展示的。直到它被 JS 中的 Vue 調(diào)用

  • 在 html 中,template 標(biāo)簽一定要有一個 id,因為通過 id 是最直接被選中的。 data 和 methods等參數(shù),全部都要放到 Vue 實例里面寫

  • 示例Code

    <body>
        <div id="app">
            <web-msg></web-msg>
        </div>
        
        <!-- 將模板寫在HTML中, 給模板指定一個ID -->
        <template id="temp1">
            <div>
                <button @click="show">{{msg}}</button>
            </div>
        </template>
    </body>
    
    <script>
        var VM = new Vue({
            el:"#app",
            data:{
    
            },
            methods: {
                
            },
            components: {
                "web-msg": {
                    // 模板內(nèi)容與使用id選擇器類似
                    template:"#temp1",
                    data() {
                        return{
                            msg: "click here"
                        }
                    },
                    methods: {
                      show() {
                          alert("wait a moment...")
                      }  
                    },
                }
            }
        })
    </script>
    

八、Vue.js的生命周期

1. 生命周期概述

  • 每個Vue實例在被創(chuàng)建之前都要經(jīng)過一系列的初始化過程,這個過程就是Vue.js的生命周期

2. 常用的鉤子函數(shù)

  • beforeCreate在Vue對象實例化之前執(zhí)行

  • created執(zhí)行時,組件的實例化已經(jīng)完成,但是DOM還未生成

    使用場景:定義created函數(shù)在DOM生成之前進行查詢操作,created執(zhí)行完成后顯示DOM

  • beforeMount執(zhí)行時,模板已經(jīng)在內(nèi)存中編輯完成了,但還沒有渲染到頁面中

    beforeMount執(zhí)行時,模板的插值表達式原樣顯示,不顯示掛載組件中的內(nèi)容

  • mounted執(zhí)行時,模板已經(jīng)被渲染到頁面,執(zhí)行完就會顯示頁面的內(nèi)容

  • beforeUpdate執(zhí)行時,內(nèi)存中的數(shù)據(jù)已經(jīng)更新了,但是還沒有渲染頁面

  • updated執(zhí)行時,內(nèi)存中的數(shù)據(jù)已經(jīng)更新了,此方法執(zhí)行完顯示頁面

九、router庫

1. 路由與SPA概述

  • 路由:實現(xiàn)了根據(jù)指定的URL分配到對應(yīng)的處理程序
  • SPA(single page web application):只有一張Web頁面的應(yīng)用,加載單個HTML頁面并在用戶與應(yīng)用程序交互時動態(tài)局部更新該頁面Web應(yīng)用程序

3. Vue.js中的路由

  • router:是 Vue.js 官方的路由管理器

  • route:route相當(dāng)于一條路由,一個路由就對應(yīng)了一條訪問路徑,route也代表一個路由對象,一個路由對象中包含了path和component兩部分

  • routes:routes代表一組路由,相當(dāng)于是route數(shù)組

  • router-link組件:用于設(shè)置一個導(dǎo)航鏈接,切換不同 HTML內(nèi)容,to 屬性為目標(biāo)地址, 即要顯示的內(nèi)容

    router-link 是對a標(biāo)簽的封裝,通過to屬性指定連接

  • router-view組件:路由導(dǎo)航到指定組件后,進行渲染顯示頁面

2. 路由的使用

  • 使用步驟:

    1. 導(dǎo)入Vue.js的router庫

    2. 定義路由所需的組件(作為下一步中的臨時變量)

    3. 定義路由(數(shù)組),每個路由有兩個部分(path和component)

    4. 創(chuàng)建路由管理實例VueRouter并初始化實例中的routes屬性

    5. 創(chuàng)建Vue實例,將router注入到vue實例中,讓整個應(yīng)用都有路由的功能,使用$mount()指定掛載點

      Vue 的$mount()為手動掛載,在項目中可用于延時掛載(例如在掛載之前要進行一些其他操作、判斷等), 之后要手動掛載上。new Vue時,el和$mount并沒有本質(zhì)上的不同。

    6. 添加超鏈接:使用router-link組件來進行導(dǎo)航,to屬性指定鏈接(route中定義的path),指定的鏈接會跳轉(zhuǎn)到對應(yīng)的component下

    7. 添加路由匹配到組件之后的出口:使用router-view組件

  • 示例Code

    測試效果:

    1. 打開頁面后

    1. 單擊go to homePage后

    1. 單擊go to newsPage后

     <body>
        <div id="app">
            <h1>test router</h1>
            <p>
                <!-- 使用 router-link 組件來導(dǎo)航,to屬性指定鏈接 -->
                <router-link to="/home">go to homePage</router-link>
                <router-link to="/news">go to newsPage</router-link>
            </p>
    
            <!-- 路由的出口, 路由匹配到的組件(頁面)將渲染在這里 -->
            <router-view></router-view>
        </div>
    </body>
    
    <script>
        //1.定義路由所需的組件(作為定義路由中的中間變量)
        const home = {template: "<div>首頁</div>"};
        const news = {template: "<div>新聞</div>"};
    
        //2.定義路由 每個路由都有兩部分 path和component
        const routes = [
            {path: "/home", component: home},
            {path: "/news", component: news},
        ];
    
        //3.創(chuàng)建router路由器實例,對路由對象routes進行管理
        const router = new VueRouter({
            routes:  routes,
        });
    
        //4.創(chuàng)建Vue實例, 調(diào)用掛載mount函數(shù),讓整個應(yīng)用都有路由功能
        const VM = new Vue({
            router
        }).$mount("#app");//$mount是手動掛載代替el
    </script>
    

本文摘自 :https://www.cnblogs.com/

開通會員,享受整站包年服務(wù)立即開通 >