国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

Vue 通過自定義指令回顧v-內置指令(小結)

2019-11-19 13:03:33
字體:
來源:轉載
供稿:網友

Vue.js 的各種指令(Directives)更加方便我們去數據驅動 DOM,例如 v-bind、v-on、v-model、v-if、v-for、v-once 等內置指令,這些指令的職責就是當表達式改變時將某些行為應用到 DOM 上,盡量不去操作增刪改 DOM。通過了解如何去自定義指令,可以想象內置指令是如何完成的。

內置指令

指令名稱 描述 使用
v-model 綁定數據 </input v-model="message">
v-text 輸出文本,不能解析標簽 </p v-text="message"></p>
v-html 輸出文本,可解析標簽 </p v-html="message">/p>
v-once 只綁定一次數據 </p v-once >{{message}}</p>
v-bind 綁定屬性 </img v-bind:src="imgurl"> 或 </img :src="imgurl">
v-if 控制是否顯示容器 值轉為布爾為false時 注釋該容器,反之顯示 </div v-if="true"></div>
v-show 控制是否顯容器,改變的時display:none/block </div v-show="true"></diiv>
v-for 循環遍歷數組、對象 </li v-for="(val,key) in arr">{{val}}</li>
v-cloak 在還沒有執行到vue代碼的時候隱藏元素,可解決‘閃爍'問題 </p v-cloak>{{message}}</p>

自定義指令

在需要特殊功能時,使用自定義指令對 DOM 進行底層操作

注冊

自定義指令的注冊分為全局注冊和局部注冊,類似組件的注冊,只是方法名為 directive,寫法如下:

// 全局注冊 自定義指令Vue.directive(‘mydir',{  // 指令選項});// 全局注冊 自定義指令函數Vue.directive('mydir', function () { // 這里將會被 `bind` 和 `update` 調用})// 局部注冊(只針對組件內元素)export default {  directives: {    mydir: {      // 指令選項    }  }}

需要注意的是:Vue.directive( ) 注冊指令要在實例初始化 new Vue( ) 之前才能全局注冊指令。定義指令時駝峰式寫法會報錯,所以一般小寫。

指令選項

自定義指令的選項是由幾個鉤子函數(可選)組成,可以根據需求選擇不同的鉤子,例如使用全局注冊一個指令時:

Vue.directive('mydir', { bind: function () {  // 只調用一次,指令第一次綁定到元素時調用,用于在綁定元素時執行一次的初始化動作。  }, update: function () {  // 第一次是緊跟在 bind 之后調用,獲得的參數是綁定的初始值,  // 之后被綁定元素所在的模板更新時調用,而不論綁定值是否變化,可以忽略不必要的模板更新。    },  inserted: function () {  // 被綁定元素插入父節點時調用(父節點存在即可調用,不必存在于 document 中)。  }, componentUpdated: function () {  // 被綁定元素所在模板完成一次更新周期時調用。  }, unbind: function () {  // 只調用一次, 指令與元素解綁時調用。  }})

以上每個鉤子函數都有幾個參數可用:

  1. el:指令所綁定的元素,可以用來直接操作 DOM;
  2. binding:包含指令信息的一個對象;
  3. vnode:Vue 編譯的生成虛擬節點;
  4. oldVnode:上一次的虛擬節點,僅在update和componentUpdated鉤子函數中可用。

示例

// 一個帶自定義指令的元素<div v-mytest:foo.m1.m2="1+1">MyDirective</div>// 部分 JS 代碼export default {  directives:{   mytest: {    bind: function (el, binding, vnode) {     console.log(el)     console.log(binding)     console.log(vnode)    }   }  }}

控制臺輸出截圖:

其中對于 binding 對象輸出的屬性有:

  1. rawName: "v-mytest:foo.m1.m2" // 自定義指令
  2. name: "mytest" // 指令名稱
  3. arg: "foo" // 指令的參數
  4. modifiers: {m1: true, m2: true} // 指令的修飾符
  5. expression: "1+1" // 指令綁定值的字符串形式
  6. value: 2 // 指令的綁定值

v-bind || : 綁定屬性

Vue 內置指令 v-bind 用于動態更新 HTML 元素屬性,使用 v-bind:someAttr = "someData"或者語法糖 :someAttr = "someData"就可以在 someData 改變時更新綁定的 someAttr 屬性。

基本用法

綁定單一的屬性值

<a :href="url" rel="external nofollow" rel="external nofollow" :id="linkID">鏈接</a>

測試 data 如下:

// jsdata : {  url: 'https://www.baidu.com/',  linkID : 'myid'}

元素渲染輸出:

<a  rel="external nofollow" rel="external nofollow" id="myid">鏈接</a>

對象語法

v-bind 最常用的是綁定 class 或 style 屬性來動態改變樣式。例如可以給 :class 設置一個對象來動態切換 class 的值:

<!-- class 綁定 --><div :class="{colorRed: isRed}"></div>

當 isRed:true 時渲染輸出:

<div class="colorRed"></div>

對象中可以傳入多個屬性值來動態切換 class:

<!-- class 綁定,傳入多個屬性 --><div :class="{ classA: isA, classB: isB }">

當 isA、isB 變化時 classA、classB 會動態更新,當都為 true 時顯然渲染結果為:

<div class="classA classB"></div>

同理對于 style 可以傳入對象屬性,并且可以使用字符串拼接:

<!-- style 綁定 --><div :style="{ fontSize: size + 'px' }"></div>

對于元素中的各個對象可以統一用 v-bind 綁定:

<!-- 綁定一個有屬性的對象 --><div v-bind="{ id: someProp, 'other-attr': otherProp }"></div>

數組語法

class 可以傳入多值,給 :class 綁定一個數組就可以使用 class 列表

<div :class="[activeA, activeB]"></div>

例如當 {activeA: 'class1', activeB: 'class2'} 時渲染結果為:

<div class="class1 class2"></div>

還可以在數組語法中使用三元表達式切換 class,例如:

<div :class="[isA ? activeA : '', activeB]">

在 class 有多個條件時使用三元表達式比較繁瑣,可以在數組語法中使用對象語法:

<div :class="[{activeA: isA}, activeB]">

修飾符

v-bind 的修飾符很少,API 中只提供.prop、.camel和.sync,并且多用于組件,使用方式示例:

<!-- 通過 prop 修飾符綁定 DOM 屬性 (property) --><div v-bind:text-content.prop="text"></div><!-- .camel 修飾符(2.1.0+)將 v-bind 屬性名稱 kebab-case 駝峰化為 camelCase --><svg :view-box.camel="viewBox"></svg><!-- .sync 修飾符(2.3.0+) 語法糖,會擴展成一個更新父組件綁定值的 v-on 偵聽器--><text-document v-bind:title.sync="doc.title"></text-document><!-- 批量綁定,將 doc 對象中的每一個屬性 (如 title) 都作獨立的 prop ,各自添加 v-on 監聽器--><text-document v-bind.sync="doc"></text-document>

v-on || @ 監聽事件

v-on 用于動態綁定事件監聽器,使用 v-on:someEvent = "someFunction"或者語法糖 @someEvent = "someFunction"就可以監聽 someEvent 進行交互。

基本用法

@someEvent 調用的方法名后面可以不跟(),例如:

<a :href="url" rel="external nofollow" rel="external nofollow" :id="linkID">鏈接</a><!-- 監聽一個事件 --><button @click="changeFun">change button</button>

可以在 methods 中添加函數:

// 部分 JS 代碼methods :{ changeFun : function () {  this.linkID = 'changeID' // 指向當前組件本身 }}

點擊 button 按鈕后 a 元素的 id 改變:

<a  rel="external nofollow" rel="external nofollow" id="changeID">鏈接</a>

當然 v-on 還可以使用對象語法監聽多個事件:

<!-- v2.4.0+ --><button v-on="{ mousedown: doThis, mouseup: doThat }"></button>

對于在 HTML 元素上監聽的事件,當 ViewModel 銷毀時,所有的事件處理器會自動刪除,無需自己清理。

修飾符

Vue 可以將原生事件對象參數 event 傳入事件方法中,并提供了特殊變量$event用來訪問元素 DOM 事件。此外可以通過一些事件修飾符來實現特定的事件,如 .stop、.prevent、.capture、.once 等,常用的使用示例:

<!-- 停止單擊事件冒泡,調用 event.stopPropagation()--><button @click.stop="doThis"></button><!-- 阻止默認行為,調用 event.preventDefault() --><button @submit.prevent="doThis"></button><!-- 添加事件偵聽器時使用 capture 事件捕獲模式 --><button @click.capture="doThis"></button><!-- 點擊回調只會觸發一次 --><button @click.once="doThis"></button><!-- 只當點擊鼠標左鍵時觸發(2.2.0) --><button @click.left="doThis"></button><!-- 串聯修飾符 --><button @click.stop.prevent="doThis"></button>

此外,v-on 還提供按鍵修飾符來監聽鍵盤事件,鍵值為 .keyCode,常用有.entry、.delete、.tab、.esc、.space、.down等,如下:

<!-- 只有在 `keyCode` 是 5 時調用 `vm.submit()` --><input v-on:keyup.5="submit"><!-- 為重要的 keyCode 如 enter 提供別名--><input v-on:keyup.enter="submit"><!-- 縮寫語法 --><input @keyup.enter="submit">

此外還有系統修飾符監聽鍵盤事件,不同的系統其鍵盤/系統修飾符不一樣。這些按鍵修飾符可以任意組合使用。

v-if、v-show 條件渲染

條件渲染 v-if 根據表達式的值的真假條件渲染元素,在表達式為真時渲染,為假時移除。

<p v-if="status === 1">當 status 為 1 時顯示此行</p><p v-else-if="status === 1">當 status 為 2 時顯示此行</p><p v-else>其它情況默認顯示此行</p>

v-show 也是條件渲染,但只切換元素的 CSS 屬性 display,無論條件真假都會被編譯,相比于 v-if 更適用于頻繁切換場景。

<p v-show="status === 1">當 status 為 1 時顯示此行</p>

當 data: {status: 2} 時隱藏,但依舊會被編譯,渲染結果為:

<p style="display: none;">當 status 為 1 時顯示此行</p>

顯然在 Vue.js 內置的 <template> 元素上可以使用 v-if,但不能使用 v-show,可以思考下為什么。

v-for 列表渲染

列表渲染指令 v-for 常用于數組遍歷或枚舉一個對象的循環顯示,必須結合 in 使用特定語法 alias in expression 為當前遍歷的元素提供別名:

<!-- 遍歷一個數組 --><div v-for="item in items">{{ item.text }}</div><!-- 提供第二個的參數為數組的索引 --><div v-for="(item, index) in items">{{ index }} - {{ item.text }}</div><!-- 遍歷對象屬性 --><div v-for="value in object">{{ value }}</div><!-- 提供第二個可選的參數:對象的鍵名 --><div v-for="(value, key) in object">{{ key }}: {{ value }}</div><!-- 提供第三個的可選參數:對象的索引 --><div v-for="(value, key, index) in object">{{ index }}. {{ key }}: {{ value }}</div>

可以用 of 替代 in 作為分隔符

當 v-for 和 v-if 在同一節點一起使用時,v-for 的優先級比 v-if 更高。

v-model 表單控件雙向綁定

v-model 其實也是一個特殊的語法糖,其實實現的數據雙向綁定也可用v-bind和v-on實現,但v-model在不同表單上會有更加智能的處理。

文本框

經典的使用案例是對<input>、<textarea>文本框的雙向數據綁定:

<!-- 輸入框 --><input type="text" v-model="message" placeholder="edit me"><!-- 文本域 --><textarea v-model="message" placeholder="edit me"></textarea><!-- 實時更新 --><p>Message is: {{ message }}</p>

動態選擇

對于單選按鈕,復選框及選擇框的選項,v-model配合 Vue 實例的數據作為value屬性值實現不同效果,即會忽略所有表單元素的 value、checked、selected 特性的值。

<!--單選按鈕的互斥效果--><div id="example-radio"> <input type="radio" id="one" value="One" v-model="picked"> <label for="one">One</label>  <input type="radio" id="two" value="Two" v-model="picked"> <label for="two">Two</label>  <!-- picked 顯示的是 value 的值 --> <p>Picked: {{ picked }}</p></div><!--多選按鈕--><div id='example-checkbox'> <input type="checkbox" id="one" value="One" v-model="checkedNames"> <label for="jack">Jack</label> <input type="checkbox" id="two" value="Two" v-model="checkedNames"> <label for="john">John</label>  <!-- Checked 顯示的是 value 組成的數組 --> <p>Checked: {{ checkedNames }}</p></div>

修飾符

v-model的修飾符的使用限制在<input>、<select>、<textarea> 和組件。

  1. .lazy - 取代 input 監聽 change 事件
  2. .number - 輸入字符串轉為數字
  3. .trim - 輸入首尾空格過濾

v-pre、v-cloak、v-once

這三個指令的共同點是無需表達式,用法如下:

<!-- 不顯示未編譯的標簽直到實例初始化完 --><div v-cloak>{{ message }}</div><!-- 需要配合 CSS 隱藏樣式 [v-cloak]{ display: none;}--><!-- 只渲染一次,隨后的渲染將被視為靜態內容并跳過 --><div v-once>{{ message }}</div><!-- 不會被編譯,直接顯示顯示原始{{ }}標簽 --><div v-pre>{{ message }}</div>

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 文安县| 金坛市| 康平县| 陵水| 云阳县| 尤溪县| 大方县| 茌平县| 绿春县| 青铜峡市| 永泰县| 古蔺县| 威宁| 盐津县| 基隆市| 新源县| 思茅市| 平潭县| 灵宝市| 额尔古纳市| 新邵县| 临沂市| 宕昌县| 济宁市| 巴青县| 长沙市| 阿合奇县| 中江县| 江门市| 黎平县| 库车县| 涞水县| 黄浦区| 石屏县| 诏安县| 临猗县| 荔波县| 沿河| 锦州市| 新沂市| 遵义县|