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

首頁 > 編程 > JavaScript > 正文

Vue自定義屬性實例分析

2019-11-19 12:04:42
字體:
來源:轉載
供稿:網友

本文實例講述了Vue自定義屬性。分享給大家供大家參考,具體如下:

1 事件名

跟組件和 prop 不同,事件名不存在任何自動化的大小寫轉換。而是觸發的事件名需要完全匹配監聽這個事件所用的名稱。舉個例子,如果觸發一個 camelCase 名字的事件:

this.$emit('myEvent')

則監聽這個名字的 kebab-case 版本是不會有任何效果的:

<my-component v-on:my-event="doSomething"></my-component>

跟組件和 prop 不同,事件名不會被用作一個 JavaScript 變量名或屬性名,所以就沒有理由使用 camelCase 或 PascalCase 了。并且 v-on 事件監聽器在 DOM 模板中會被自動轉換為全小寫 (因為 HTML 是大小寫不敏感的),所以 v-on:myEvent 將會變成 v-on:myevent――導致 myEvent 不可能被監聽到。

因此,我們推薦你始終使用 kebab-case 的事件名。

2 自定義組件的 v-model

2.2.0+ 新增

一個組件上的 v-model 默認會利用名為 value 的 prop 和名為 input 的事件,但是像單選框、復選框等類型的輸入控件可能會將 value 特性用于不同的目的。model 選項可以用來避免這樣的沖突:

Vue.component('base-checkbox', {  model: {    prop: 'checked',    event: 'change'  },  props: {    checked: Boolean  },  template:      `      <input        type="checkbox"        v-bind:checked="checked"        v-on:change="$emit('change',$event.target.checked)"      >      `});

現在在這個組件上使用 v-model 的時候:

<base-checkbox v-model="loving"></base-checkbox>

這里的 loving 的值將會傳入這個名為 checkedprop。同時當 <base-checkbox> 觸發一個 change 事件并附帶一個新的值的時候,這個 loving 的屬性將會被更新。

注意你仍然需要在組件的 props 選項里聲明 checked 這個 prop。

3 將原生事件綁定到組件

你可能有很多次想要在一個組件的根元素上直接監聽一個原生事件。這時,你可以使用 v-on.native 修飾符:

<base-input v-on:focus.native="onFocus"></base-input>

在有的時候這是很有用的,不過在你嘗試監聽一個類似 <input> 的非常特定的元素時,這并不是個好主意。比如上述<base-input>組件可能做了如下重構,所以根元素實際上是一個 <label> 元素:

<label>  {{ label }}  <input      v-bind=$attrs",      v-bind:value="value"      v-on:input="$emit('input',$event.target.value)"      ></label>

這時,父級的 .native 監聽器將靜默失敗。它不會產生任何報錯,但是 onFocus 處理函數不會如你預期地被調用。

為了解決這個問題,Vue 提供了一個 $listeners 屬性,它是一個對象,里面包含了作用在這個組件上的所有監聽器。例如:

{ focus: function (event) { /* ... */ } input: function (value) { /* ... */ },}

有了這個 $listeners 屬性,你就可以配合 v-on="$listeners" 將所有的事件監聽器指向這個組件的某個特定的子元素。對于類似 <input> 的你希望它也可以配合 v-model 工作的組件來說,為這些監聽器創建一個類似下述inputListeners 的計算屬性通常是非常有用的:

Vue.component('base-input', {  inheritAttrs: false,  props: ['label', 'value'],  computed: {    inputListeners: function () {      var vm = this;      //Object.assign() 會將所有的對象合并為一個新對象      return Object.assign({},          //從父級添加所有的監聽器          this.$listeners,          //添加自定義監聽器或復寫監聽器行為          {            input: function (event) {              vm.$emit('input', event.target.value);            }          }      )    }  },  template: `    <label>      {{ label }}      <input        v-bind="$attrs"        v-bind:value="value"        v-on="inputListeners"      >    </label>  `});

現在 <base-input> 組件是一個完全透明的包裹器了,也就是說它可以完全像一個普通的 <input> 元素一樣使用了:所有跟它相同的特性和監聽器的都可以工作。

4 .sync 修飾符

2.3.0+ 新增

在有些情況下,我們可能需要對一個 prop 進行“雙向綁定”。不幸的是,真正的雙向綁定會帶來維護上的問題,因為子組件可以修改父組件,且在父組件和子組件都沒有明顯的改動來源。

這也是為什么我們推薦以 update:my-prop-name 的模式觸發事件取而代之。舉個例子,在一個包含 title prop 的假設的組件中,我們可以用以下方法表達對其賦新值的意圖:

this.$emit('update:title', newTitle)

然后父組件可以監聽那個事件并根據需要更新一個本地的數據屬性。例如:

<text-document v-bind:title="doc.title" v-on:update:title="doc.title = $event"></text-document>

為了方便起見,我們為這種模式提供一個縮寫,即 .sync 修飾符:

<text-document v-bind:title.sync="doc.title"></text-document>

當我們用一個對象同時設置多個 prop 的時候,也可以將這個 .sync 修飾符和 v-bind 配合使用:

<text-document v-bind.sync="doc"></text-document>

這樣會把 doc 對象中的每一個屬性 (如 title) 都作為一個獨立的 prop 傳進去,然后各自添加用于更新的 v-on 監聽器。

v-bind.sync 用在一個字面量的對象上,例如v-bind.sync=”{ title: doc.title }”,是無法正常工作的,因為在解析一個像這樣的復雜表達式的時候,有很多邊緣情況需要考慮。

希望本文所述對大家vue.js程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宜兴市| 墨玉县| 万盛区| 逊克县| 桂东县| 孟村| 宁晋县| 新宾| 西畴县| 白城市| 永兴县| 唐河县| 潼南县| 花垣县| 梁平县| 临湘市| 岳阳县| 左权县| 额尔古纳市| 抚州市| 平乐县| 土默特右旗| 长治市| 镇远县| 寿阳县| 肇东市| 虎林市| 萨嘎县| 衡阳市| 新龙县| 广汉市| 东明县| 德令哈市| 文水县| 屏东市| 柘城县| 定襄县| 桂平市| 锡林郭勒盟| 神木县| 马边|