欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深入理解Vue 單向數(shù)據(jù)流的原理

 更新時間:2017年11月09日 16:42:14   作者:Saharacat  
這篇文章主要介紹了深入理解Vue 單向數(shù)據(jù)流的原理,詳細的介紹了Vue 單向數(shù)據(jù)流的原理和使用,具有一定的參考價值,有興趣的可以了解一下

單向數(shù)據(jù)流是什么

單向數(shù)據(jù)流指只能從一個方向來修改狀態(tài)。下圖是單向數(shù)據(jù)流的極簡示意:

單向數(shù)據(jù)流的極簡示意

與單向數(shù)據(jù)流對對應的是雙向數(shù)據(jù)流(也叫雙向綁定)。在雙向數(shù)據(jù)流中,Model(可以理解為狀態(tài)的集合) 中可以修改自己或其他Model的狀態(tài), 用戶的操作(如在輸入框中輸入內(nèi)容)也可以修改狀態(tài)。這使改變一個狀態(tài)有可能會觸發(fā)一連串的狀態(tài)的變化,最后很難預測最終的狀態(tài)是什么樣的。使得代碼變得很難調試。如下圖所示:

與雙向數(shù)據(jù)流比,在單向數(shù)據(jù)流中,當你需要修改狀態(tài),完全重新開始走一個修改的流程。這限制了狀態(tài)修改的方式,讓狀態(tài)變得可預測,容易調試。

單向數(shù)據(jù)流的使用場景

多個組件會共享狀態(tài)時,共享狀態(tài)和組件間(兄弟組件)通信變的不容易。我們把共享狀態(tài)抽取出來,用單向數(shù)據(jù)流的方式會變得容易。

從v-model開始講起

1、v-model 用在 input 元素上

v-model在使用的時候很像雙向綁定的(實際上也是。。。),但是 Vue 是單項數(shù)據(jù)流,v-model 只是語法糖而已:

<input v-model="something" />
<input v-bind:value="something" v-on:input="something = $event.target.value" />

第一行的代碼其實只是第二行的語法糖。然后第二行代碼還能簡寫成這樣:

<input :value="something" @input="something = $event.target.value" />

要理解這行代碼,首先你要知道 input 元素本身有個 oninput 事件,這是 HTML5 新增加的,類似 onchange ,每當輸入框內(nèi)容發(fā)生變化,就會觸發(fā) oninput ,通過 $event 把最新的 value 傳遞給 something。

我們仔細觀察語法糖和原始語法那兩行代碼,可以得出一個結論: 在給 input 元素添加 v-model 屬性時,默認會把 value 作為元素的屬性,然后把 'input' 事件作為實時傳遞 value 的觸發(fā)事件

2、v-model 用在組件上

v-model 不僅僅能在 input 上用,在組件上也能使用,拿官網(wǎng)上的demo看。

<currency-input v-model="price"></currency-input>
Vue.component('currency-input', {
 template: '\
 <span>\
  $\
  <input\
  ref="input"\
  v-bind:value="value"\
  v-on:input="updateValue($event.target.value)"\
  >\
 </span>\
 ',
 props: ['value'], // 為什么這里要用 value 屬性,value在哪里定義的?
 methods: {
 // 不是直接更新值,而是使用此方法來對輸入值進行格式化和位數(shù)限制
 updateValue: function (value) {
  var formattedValue = value
  // 刪除兩側的空格符
  .trim()
  // 保留 2 位小數(shù)
  .slice(
   0,
   value.indexOf('.') === -1
   ? value.length
   : value.indexOf('.') + 3
  )
  // 如果值尚不合規(guī),則手動覆蓋為合規(guī)的值
  if (formattedValue !== value) {
  this.$refs.input.value = formattedValue
  }
  // 通過 input 事件帶出數(shù)值
  // <!--為什么這里把 'input' 作為觸發(fā)事件的事件名?`input` 在哪定義的?-->
  this.$emit('input', Number(formattedValue))
 }
 }
})

如果你知道這兩個問題的答案,那么恭喜你真正掌握了 v-model,如果你沒明白,那么可以看下這段代碼:

<currency-input v-model="price"></currency-input>
所以在組件中使用時,它相當于下面的簡寫:
//上行代碼是下行的語法糖
<currency-input :value="price" @input="price = arguments[0]"></currency-input>

所以,給組件添加 v-model 屬性時,默認會把 value 作為組件的屬性,然后把 'input' 值作為給組件綁定事件時的事件名。這在寫組件時特別有用。

3、v-model 的缺點和解決辦法

在創(chuàng)建類似復選框或者單選框的常見組件時,v-model就不好用了。

<input type="checkbox" v-model="something" />

v-model 給我們提供好了 value 屬性和 oninput 事件,但是,我們需要的不是 value 屬性,而是 checked 屬性,并且當你點擊這個單選框的時候不會觸發(fā) oninput 事件,它只會觸發(fā) onchange 事件。

因為 v-model 只是用到了 input 元素上,所以這種情況好解決:

<input type="checkbox" :checked="value" @change="change(value, $event)"

當 v-model 用到組件上時:

<checkbox v-model="value"></checkbox>

Vue.component('checkbox', {
 tempalte: '<input type="checkbox" @change="change" :checked="currentValue"/>'
 props: ['value'],
 data: function () {
  return {
   //這里為什么要定義一個局部變量,并用 prop 的值初始化它。
   currentValue: this.value
  };
 },
 methods: {
 change: function ($event) {
  this.currentValue = $event.target.checked;
  this.$emit('input', this.currentValue); 
 }
})

在 Vue 2.2 版本,你可以在定義組件時通過 model 選項的方式來定制 prop/event 。

4、vue 組件數(shù)據(jù)流

從上面 v-model 的分析我們可以這么理解,雙向數(shù)據(jù)綁定就是在單向綁定的基礎上給可輸入元素(input、textare等)添加了 change(input) 事件,來動態(tài)修改 model 和 view ,即通過觸發(fā)($emit)父組件的事件來修改mv來達到 mvvm 的效果。而 vue 組件間傳遞數(shù)據(jù)是單向的,即數(shù)據(jù)總是由父組件傳遞到子組件,子組件在其內(nèi)部可以有自己維護的數(shù)據(jù),但它無權修改父組件傳遞給它的數(shù)據(jù),當開發(fā)者嘗試這樣做的時候,vue 將會報錯。這樣做是為了組件間更好的解耦,在開發(fā)中可能有多個子組件依賴于父組件的某個數(shù)據(jù),假如子組件可以修改父組件數(shù)據(jù)的話,一個子組件變化會引發(fā)所有依賴這個數(shù)據(jù)的子組件發(fā)生變化,所以 vue 不推薦子組件修改父組件的數(shù)據(jù),直接修改 props 會拋出警告。流程圖如下:


所以,當你想要在子組件去修改 props 時,把這個子組件當成父組件那樣用,所以就有了

1、定義一個局部變量,并用 prop 的值初始化它。
2、定義一個計算屬性,處理 prop 的值并返回。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Vue實現(xiàn)彈出框點擊空白頁彈框消失效果

    Vue實現(xiàn)彈出框點擊空白頁彈框消失效果

    這篇文章主要介紹了VUE實現(xiàn)彈出框點擊空白頁彈框消失,實現(xiàn)方法可以在Vue中實現(xiàn)彈出框然后通過點擊空白頁面來讓彈窗隱藏,本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2023-12-12
  • Vue.directive 自定義指令的問題小結

    Vue.directive 自定義指令的問題小結

    這篇文章主要介紹了Vue.directive 自定義指令的問題小結,需要的朋友可以參考下
    2018-03-03
  • Vue跳轉頁面的幾種常用方法總結

    Vue跳轉頁面的幾種常用方法總結

    在Vue.js中,頁面跳轉是構建單頁面應用(SPA)的基本操作之一,本文將介紹Vue中實現(xiàn)頁面跳轉的幾種方法,并通過實例代碼幫助理解每種方法的用法,需要的朋友可以參考下
    2024-09-09
  • 在vue中完美使用ueditor組件(cdn)解讀

    在vue中完美使用ueditor組件(cdn)解讀

    這篇文章主要介紹了在vue中完美使用ueditor組件(cdn)解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • vue3.0中的雙向數(shù)據(jù)綁定方法及優(yōu)缺點

    vue3.0中的雙向數(shù)據(jù)綁定方法及優(yōu)缺點

    這篇文章主要介紹了vue3.0中的雙向數(shù)據(jù)綁定方法 ,文中通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-08-08
  • iview實現(xiàn)select tree樹形下拉框的示例代碼

    iview實現(xiàn)select tree樹形下拉框的示例代碼

    這篇文章主要介紹了iview實現(xiàn)select tree樹形下拉框的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-12-12
  • 基于el-table實現(xiàn)行內(nèi)增刪改功能

    基于el-table實現(xiàn)行內(nèi)增刪改功能

    這篇文章主要介紹了基于el-table實現(xiàn)行內(nèi)增刪改功能,用過通過操作按鈕點擊刪除或者編輯功能即可實現(xiàn)相應的效果,下面小編給大家分享實例代碼感興趣的朋友跟隨小編一起看看吧
    2024-04-04
  • vue2中provide/inject的使用與響應式傳值詳解

    vue2中provide/inject的使用與響應式傳值詳解

    Vue中 Provide/Inject實現(xiàn)了跨組件的通信,下面這篇文章主要給大家介紹了關于vue2中provide/inject的使用與響應式傳值的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • vue3.2?Composition?API項目依賴升級

    vue3.2?Composition?API項目依賴升級

    這篇文章主要為大家介紹了vue3.2?Composition?API項目依賴升級示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • vue2.0使用md-edit編輯器的過程

    vue2.0使用md-edit編輯器的過程

    這篇文章主要介紹了vue2.0+使用md-edit編輯器的解決方案,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-02-02

最新評論