整合營銷服務(wù)商

          電腦端+手機端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          第二章 Vue指令

          一章節(jié)我們探討了Vue的入門,對Vue有了初步的了解,并且掌握了模板語法。本節(jié)課我們的學(xué)習(xí)目標(biāo)是Vue的指令。

          首先解釋以下什么叫做指令,指定就是命令的意思,人們用指令表達(dá)自己的意圖。Vue中有多種指令,每種指令有不同的功能,比如有個指令的名字叫做v-text,此指令用于主要用來更新html標(biāo)簽InnerText內(nèi)容,等同于JS操作dom元素的text屬性。

          除此以外vue還提供了多種指令,接下來我們就開始詳細(xì)介紹這些指令的使用場景已經(jīng)使用方式。

          2.1 什么是指令

          我們已經(jīng)了解到Vue雖然使用場景與功能類似于JQuery,但是語法習(xí)慣完全不同于JQuery,比如Vue使用步驟主要有實例化Vue對象,掛載點使用模板語法綁定數(shù)據(jù)。除此以外Vue指令也是Vue使用中的重要組成部分,根據(jù)不同的指令有不同的功能,比如綁定事件,渲染InnerText數(shù)據(jù),渲染InnerHtml數(shù)據(jù)。

          2.1.1 什么是Vue指令

          Vue中的指令存在的形式是以“v-”為前綴的特殊屬性,出現(xiàn)在html的標(biāo)簽的屬性部分,功能是當(dāng)表達(dá)式的值改變時,將其產(chǎn)生的連帶影響,響應(yīng)式地作用于 DOM。

          Vue指令的組成部分如下所示。

          <tag標(biāo)簽 v-指令名="表達(dá)式"> </tag標(biāo)簽>

          2.1.2 DOM節(jié)點

          無論是傳統(tǒng)的原生js,還是老牌前端框架JQuery,包括正在學(xué)習(xí)的Vue,他們的功能主要都是操作dom節(jié)點對象,我們這里再復(fù)習(xí)一下dom節(jié)點的相關(guān)概念,因為指令就是對DOM節(jié)點的操作。在 HTML DOM 中 , 每一個元素都是節(jié)點,Vue指令就是節(jié)點的特殊屬性。Vue.js是數(shù)據(jù)驅(qū)動的,無需手動操作DOM,它通過指令語法,將DOM和數(shù)據(jù)綁定起來。一旦創(chuàng)建了綁定,DOM將和數(shù)據(jù)保持同步,每當(dāng)變更了數(shù)據(jù),DOM也會相應(yīng)地更新。

          2.2 指令一覽

          Vue提供了多種內(nèi)置的指令,不同的指令有不同的功能,在具體學(xué)習(xí)每種指令之前,我們先將部分常見指令以表格形式進(jìn)行一覽,如圖2.1所示。

          圖2.1 部分指令一覽

          2.3 v-if & v-else-if & v-else指令

          先描述一個場景:現(xiàn)有一組標(biāo)簽,此標(biāo)簽展示內(nèi)容只有在當(dāng)前用戶符合某些條件的情況下才顯示。

          這種類型的功能在開發(fā)中是十分常見的,實現(xiàn)思路也很簡單,需要先進(jìn)行判斷是否符合條件,根據(jù)判斷結(jié)果來決定是否展示標(biāo)簽。在Vue中想要實現(xiàn)此種功能,就需要使用v-if指令。

          2.3.1 v-if指令

          我們使用v-if指令來實現(xiàn)剛才描述的場景,創(chuàng)建index.html文件,并使用上一章節(jié)中我們學(xué)習(xí)過的內(nèi)容快速加載Vue環(huán)境,這里就不在重新闡述。index.html中判斷當(dāng)前l(fā)evel的值是否大于等于10,如果大于10在頁面中顯示文字:“歡迎來自艾歐尼亞的最強王者上機!”如果levle的值小于10則什么都不顯示。為了實現(xiàn)此效果,我們需要使用到v-if指令。index.html代碼內(nèi)容如2-1所示:

          例2-1 index.html

          1. <!DOCTYPE html>
          2. <html lang="en">
          3. <head>
          4. <meta charset="UTF-8">
          5. <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
          6. <title>v-if指令</title>
          7. </head>
          8. <body>
          9. <div id="app">
          10. <!--span只有在levle的值大于等于10的時候才顯示-->
          11. <span v-if="levle>=10">歡迎來自艾歐尼亞的最強王者上機!</span>
          12. </div>

          件綁定基本用法

          我們實現(xiàn)一個復(fù)雜的web應(yīng)用,少不了與用戶的交互,那么用戶交互最直接相關(guān)的就是事件,我們上一章學(xué)習(xí)的數(shù)據(jù)雙向綁定的v-model指令的底層就是用到了事件,所以VUE專門提供了事件處理這種語法結(jié)構(gòu),其實本質(zhì)上還是指令。所以我們稱之為事件綁定。之前我們學(xué)到了數(shù)據(jù)綁定,其實是類似的,數(shù)據(jù)綁定是將數(shù)據(jù)與模板綁定起來,只不過對于事件綁定來說,它綁定的是具體的操作。接下來我們學(xué)習(xí)下,VUE如何來處理事件。

          1、VUE如何處理事件

          • v-on指令用法
          <button v-on:click='count+=2'>點擊1</button>
          • v-on簡寫形式
          <button @click='count+=2'>點擊2</button>

          完整代碼:

          <!DOCTYPE html>
          <html lang="en">
          <body>
                  <div id="app">
                      <div>{{count}}</div>
                      <button v-on:click='count+=2'>點擊1</button>
                      <button @click='count+=2'>點擊2</button>
                  </div>
                  <script type="text/javascript" src="vue.js"></script>
                  <script type="text/javascript">
                      var vm = new Vue({
                          el:'#app',
                          data:{
                              count:0 
                          }
                      });
                  </script>
                </body>
          </html>


          展示效果圖:

          2、事件函數(shù)的調(diào)用方式

          以上我們調(diào)用事件是直接在指令內(nèi)寫的業(yè)務(wù)邏輯,那么如果比較復(fù)雜的業(yè)務(wù)邏輯再直接寫到指令內(nèi)那肯定是不合理了,這時我們要抽取函數(shù),通過事件函數(shù)的方式來調(diào)用,VUE中也專門提供了一個屬性(methods)用來定義我們需要的方法。

          • 直接綁定函數(shù)名稱
          <button @click='todo'>點擊3</button>
          • 調(diào)用函數(shù)
          <button @click='todo()'>點擊4</button>

          完整代碼:

          <!DOCTYPE html>
          <html lang="en">
          <body>
                  <div id="app">
                      <div>{{count}}</div>
                      <button @click='todo'>點擊3</button>
                      <button @click='todo()'>點擊4</button>
                  </div>
                  <script type="text/javascript" src="vue.js"></script>
                  <script type="text/javascript">
                      var vm = new Vue({
                          el:'#app',
                          data:{
                              count:0 
                          },
                          methods:{
                              todo:function(){
                                  this.count+=2;
                              }
                          }
                      });
                  </script>
                </body>
          </html>

          展示效果:

          注意:在使用方法的時候,我們用到了this.count+,為什么用this呢,因為count在方法內(nèi)部,在方法內(nèi)部是沒辦法訪問這個屬性的,我們大可認(rèn)為data和methods是vm實例下的2個子域,他們2個是沒辦法直接交互的,只能往上通過父域(vm)來訪問,所以這里的this就是vm實例對象,比如我在方法內(nèi)部打印下console.log(this===vm) 返回的是true。

          methods內(nèi)可以定義多個方法。

          3、事件函數(shù)參數(shù)傳遞

          如果我們的事件調(diào)用中不需要傳遞參數(shù),那么以上第一種(直接綁定函數(shù)名稱)比較方便一些;

          如果我們的事件中需要傳遞參數(shù),我們只能通過以上第二種(調(diào)用函數(shù))的方式進(jìn)行函數(shù)調(diào)用;

          當(dāng)我們需要傳遞參數(shù)的時候,根據(jù)入?yún)⒌姆诸惪梢苑譃槠胀▍?shù)和事件對象,下邊來看下事件函數(shù)如何來傳遞這2中類型的參數(shù):

          • 參數(shù)傳遞
          <button @click='todo(11,22,$event)'>點擊</button>

          完整代碼:

          <!DOCTYPE html>
          <html lang="en">
          <body>
                  <div id="app">
                      <div>{{count}}</div>
                      <button @click='todo(11,22,$event)'>點擊</button>
                  </div>
                  <script type="text/javascript" src="vue.js"></script>
                  <script type="text/javascript">
                      var vm = new Vue({
                          el:'#app',
                          data:{
                              count:0 
                          },
                          methods:{
                              todo:function(p1,p2,event){
                                  console.log(p1);
                                  console.log(p2);
                                  console.log(event.target.tagName + " " + event.target.innerHTML);
                                  this.count+=2;
                              }
                          }
                      });
                  </script>
                </body>
          </html>

          展示效果圖:


          其實,我們通過第一種方式(直接綁定函數(shù)名稱)來調(diào)用函數(shù)的時候,是沒辦法從傳遞普通參數(shù)的,但是它默認(rèn)綁定了事件對象。我們可以在方法內(nèi)部直接獲取事件。

          <!DOCTYPE html>
          <html lang="en">
          <body>
                  <div id="app">
                      <div>{{count}}</div>
                      <button @click='todo'>點擊</button>
                  </div>
                  <script type="text/javascript" src="vue.js"></script>
                  <script type="text/javascript">
                      var vm = new Vue({
                          el:'#app',
                          data:{
                              count:0 
                          },
                          methods:{
                              todo:function(event){
                                  console.log(event.target.tagName + " " + event.target.innerHTML);
                                  this.count+=2;
                              }
                          }
                      });
                  </script>
                </body>
          </html>


          展示效果:


          總結(jié):參數(shù)傳遞

          1、如果事件直接綁定的是函數(shù)名稱(直接綁定函數(shù)名稱 todo),那么默認(rèn)會傳遞事件對象作為事件函數(shù)的第一個參數(shù)

          2、如果事件函數(shù)綁定的是函數(shù)調(diào)用(函數(shù)調(diào)用 todo()),那么事件對象必須作為最后一個參數(shù)顯示的傳遞,并且事件對象的名稱必須是$event

          4、事件修飾符

          下邊來看個例子:

          <!DOCTYPE html>
          <html lang="en">
          <body>
                  <div id="app">
                      <div>{{count}}</div>
                      <div @click='todo2'>
                          <button @click='todo'>點擊</button>
                      </div>
          
                  </div>
                  <script type="text/javascript" src="vue.js"></script>
                  <script type="text/javascript">
                      var vm = new Vue({
                          el:'#app',
                          data:{
                              count:0 
                          },
                          methods:{
                              todo:function(event){
                                  
                              },
                              todo2:function(event){
                                  console.log(event.target.tagName + " " + event.target.innerHTML);
                                  this.count+=2;
                              }
                          }
                      });
                  </script>
                </body>
          </html>

          展示效果:



          分析:在代碼中,button綁定的todo方法是沒有實現(xiàn)的,理論上是沒有反應(yīng)的,但從展示效果來看,是執(zhí)行了todo2方法,為什么呢?這是因為事件冒泡到了它的父級元素div上,所以才執(zhí)行了todo2方法,這就叫做冒泡,一個從子元素向父元素傳遞事件的行為。那么這種情況顯然不是我們預(yù)想的,那怎么辦呢。阻止冒泡,有2種方式解決:

          第一種:原生js

          event.stopPropagation();

          第二種:vue提供的修飾符

          .stop 阻止冒泡

          <button @click.stop='todo'>點擊</button>

          完整代碼:

          <!DOCTYPE html>
          <html lang="en">
          <body>
                  <div id="app">
                      <div>{{count}}</div>
                      <div @click='todo2'>
                          <button @click.stop='todo'>點擊</button>
                      </div>
                  
                  </div>
                  <script type="text/javascript" src="vue.js"></script>
                  <script type="text/javascript">
                      var vm = new Vue({
                          el:'#app',
                          data:{
                              count:0 
                          },
                          methods:{
                              todo:function(event){
                                  console.log('111');
                                  //阻止冒泡
                                  //event.stopPropagation();
                              },
                              todo2:function(event){
                                  console.log(event.target.tagName + " " + event.target.innerHTML);
                                  this.count+=2;
                              }
                          }
                      });
                  </script>
                </body>
          </html>

          展示效果:


          .stop 的存在就相當(dāng)于阻止事件向父元素傳遞,保證只執(zhí)行todo

          • 阻止默認(rèn)行為(取消默認(rèn)事件)

          在實際開發(fā)中,有的時候,我們想要改變某些組件原生的動作,比如默認(rèn)情況下,如果我點擊一個<a>標(biāo)簽,那么默認(rèn)會自動跳轉(zhuǎn)到href對應(yīng)的鏈接上去。如果我想要阻止這些原生的動作行為,而是僅僅需要功能完成執(zhí)行我們的function函數(shù)。那么這時候,我們就要使用prevent了,我們來舉一個例子看看:

          <!DOCTYPE html>
          <html lang="en">
          <body>
              <div id="app">
                   <a href="www.baidu.com" @click.prevent="func">百度</a>
              </div>
              <script type="text/javascript" src="vue.js"></script>
              <script type="text/javascript">
                  var vm = new Vue({
                      el:"#app",
                      data: {
                          count:0 
                      },
                      methods:{
                           func:function(){
                              alert('阻止a標(biāo)簽原先點擊跳轉(zhuǎn)的默認(rèn)行為。')
                           }
                      }
                  });
              </script>
                </body>
          </html>

          展示效果:


          除了以上經(jīng)常用的2個以外,官網(wǎng)還提供了其它修飾符,有興趣的可以研究下使用場景


          5、按鍵修飾符

          在以往的頁面交互中,我們常常會遇到這種需求:當(dāng)用戶輸入賬號密碼后點擊 Enter 鍵、一個多選篩選條件通過點擊多選框后自動加載符合選中條件的數(shù)據(jù)等等。在傳統(tǒng)的前端開發(fā)中,當(dāng)我們碰到這種類似的需求時,我們往往需要知道 js 中需要監(jiān)聽的按鍵所對應(yīng)的 keyCode,然后通過判斷 keyCode 得知用戶是按下了那個按鍵,繼而執(zhí)行后續(xù)的操作。例如,在下面的示例中,當(dāng)我們松開 Enter 按鍵后控制臺就會打印出姓名輸入框內(nèi)的值。

           <label>姓名:</label>
           <input id="name" type="text">
           
           $('#name').on('keyup',function(event){
               event.preventDefault();//阻止瀏覽器默認(rèn)動作
               if(event.Code == 13){
                   console.log($(this).val());
               }
           });

          而在 Vue 中,給我們提供了一種便利的方式去實現(xiàn)監(jiān)聽我們的按鍵事件。在監(jiān)聽鍵盤事件時,我們經(jīng)常需要查找常見的按鍵所對應(yīng)的 keyCode,而 Vue 為最常用的按鍵提供了別名。


          在下面的代碼中,我們同樣監(jiān)聽了 input 框的 Enter 事件,而我們只需要在綁定的 input 標(biāo)簽的 keyup 事件上添加 .enter 修飾符即可。

          <!DOCTYPE html>
          <html lang="en">
          <body>
              <div id="app">
                    <label>姓名:</label>
                    <input id="name" type="text" v-model:value="name" @keyup.enter="log">
              </div>
              <script type="text/javascript" src="vue.js"></script>
              <script type="text/javascript">
                   var vm = new Vue({
                       el: '#app',
                       data: {
                           name: ''
                       },
                       methods: {
                           log:function() {
                               console.log(`name:${this.name}`);
                           }
                       }
                   })
              </script>
                </body>
          </html>

          展示效果:


          6、自定義按鍵

          對于標(biāo)準(zhǔn)的104鍵盤,Vue 不可能幫我們把所有的按鍵鍵值都定義好,這也不現(xiàn)實。于是,Vue 給我們提供了一種通過定義全局 config.keyCodes 來自定義按鍵修飾符的別名的方式。例如,在上面的例子中,我們是通過 Enter 按鍵獲取到輸入的文本框的值,現(xiàn)在,我們的需求變了,需要我們通過 F2 按鍵來獲得文本框的值,這時我們就可以通過自定義按鍵修飾符來實現(xiàn)操作。

          <!DOCTYPE html>
          <html lang="en">
          <body>
              <div id="app">
                    <label>姓名:</label>
                    <input id="name" type="text" v-model:value="name" @keyup.prevent.f2="logF2">
              </div>
              <script type="text/javascript" src="vue.js"></script>
              <script type="text/javascript">
                    //通過 keyCode 自定義按鍵修飾符
                    Vue.config.keyCodes.f2 = 113
                   var vm = new Vue({
                       el: '#app',
                       data: {
                           name: ''
                       },
                       methods: {
                           logF2:function() {
                              console.log(`name:${this.name} --- 通過 F2 按鍵獲得`);
                           }
                       }
                   })
              </script>
                </body>
          </html>

          這時,通過enter鍵已經(jīng)不生效了,只有恩f2才能實現(xiàn)功能。

          規(guī)則:自定義按鍵修飾符名字是自定義的,但對應(yīng)的值必須是按鍵對應(yīng)event.keyCode值。

          上一篇:VUE入門教程(二)之模板語法(指令)

          件監(jiān)聽是javascript中的一個重要概念。我將通過how do even turn dock實現(xiàn)事件監(jiān)聽來分享這一技術(shù)。下面分別介紹每種事件的詳細(xì)操作。

          ·等夜視鼠標(biāo)事件mouse down就是鼠標(biāo)左鍵按下。

          ·鼠標(biāo)逆時針抬起neck就是點擊一下db,肯尼克就是雙擊事件。

          ·mose over就是鼠標(biāo)移到元素上,經(jīng)過了核磁觸發(fā)。

          ·mouse move就是鼠標(biāo)動一下就會出發(fā)。

          ·mouse out就是鼠標(biāo)移出元素。

          ·mouse leave就是鼠標(biāo)遠(yuǎn)離開頁面。

          ·mouse enter是鼠標(biāo)一代元素上。經(jīng)過刺身的指元素抒發(fā) contact the minute。

          ·鼠標(biāo)右鍵打開菜單,在一個鍵盤世界投檔。

          ·就是按下鍵盤上某個鍵時觸發(fā),也可以獲取到到底是按的哪個鍵。

          ·tf就是按下鍵抬起觸發(fā)。

          ·然后是ui 事件,比如加載事件還有鼠標(biāo)滾動的事件。

          ·然后是手指事件也叫觸摸事件主要用于移動端用于手機觸摸屏幕。

          ·踏起時代就是觸發(fā)開始。

          ·踏起摁的就是觸發(fā)結(jié)束。

          ·踏起就是在滑動踏起。

          ·看守就是被系統(tǒng)阻止了滑動世界。比如在觸摸的過程中被彈出的彈出框打斷就會觸發(fā)開啟開鎖世界致表達(dá)世界。

          ·表達(dá)安居然要添加鳳元素作為監(jiān)聽的對象,表達(dá)事件是用的比較多的。


          主站蜘蛛池模板: 国产福利一区视频| 日本一区二区三区免费高清在线| 国产精品一区视频| 亚洲一区二区久久| 精品国产AV无码一区二区三区| 日本一道一区二区免费看| 午夜无码一区二区三区在线观看 | 亚洲视频在线观看一区| 久久中文字幕无码一区二区| 人妻天天爽夜夜爽一区二区| 亚洲日韩AV无码一区二区三区人| 亚洲一区无码精品色| 精品久久久久久中文字幕一区| 国产91大片精品一区在线观看 | 亚洲一区二区三区国产精品| 日韩一区二区a片免费观看| 91精品一区二区三区久久久久 | 亚洲AV无码一区二区乱子伦 | 日本一区二区三区在线视频| 国产成人一区二区三区| 精品一区二区ww| 成人毛片无码一区二区| 亚洲AV无码一区二区三区久久精品 | 国产品无码一区二区三区在线蜜桃| 国产三级一区二区三区| 日韩一区二区三区不卡视频| 毛片一区二区三区无码| 精品无码成人片一区二区| 国产一区二区三区精品久久呦| 国产精品福利一区| 精品视频午夜一区二区| 无码av不卡一区二区三区| 果冻传媒一区二区天美传媒| 亚洲无人区一区二区三区| 国产高清视频一区三区| 国产精品视频一区二区猎奇| 国产日韩精品一区二区在线观看播放| 国产精品香蕉在线一区| 亚洲高清毛片一区二区| 久久精品无码一区二区三区日韩| 夜夜添无码试看一区二区三区 |