• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當(dāng)前位置: 首頁 - 科技 - 知識(shí)百科 - 正文

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

    來源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 22:25:51
    文檔

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

    深入理解Vue 單向數(shù)據(jù)流的原理:單向數(shù)據(jù)流是什么 單向數(shù)據(jù)流指只能從一個(gè)方向來修改狀態(tài)。下圖是單向數(shù)據(jù)流的極簡示意: 單向數(shù)據(jù)流的極簡示意 與單向數(shù)據(jù)流對(duì)對(duì)應(yīng)的是雙向數(shù)據(jù)流(也叫雙向綁定)。在雙向數(shù)據(jù)流中,Model(可以理解為狀態(tài)的集合) 中可以修改自己或其他Model的狀態(tài),
    推薦度:
    導(dǎo)讀深入理解Vue 單向數(shù)據(jù)流的原理:單向數(shù)據(jù)流是什么 單向數(shù)據(jù)流指只能從一個(gè)方向來修改狀態(tài)。下圖是單向數(shù)據(jù)流的極簡示意: 單向數(shù)據(jù)流的極簡示意 與單向數(shù)據(jù)流對(duì)對(duì)應(yīng)的是雙向數(shù)據(jù)流(也叫雙向綁定)。在雙向數(shù)據(jù)流中,Model(可以理解為狀態(tài)的集合) 中可以修改自己或其他Model的狀態(tài),

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

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

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

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

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

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

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

    從v-model開始講起

    1、v-model 用在 input 元素上

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

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

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

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

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

    我們仔細(xì)觀察語法糖和原始語法那兩行代碼,可以得出一個(gè)結(jié)論: 在給 input 元素添加 v-model 屬性時(shí),默認(rèn)會(huì)把 value 作為元素的屬性,然后把 'input' 事件作為實(shí)時(shí)傳遞 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: {
     // 不是直接更新值,而是使用此方法來對(duì)輸入值進(jìn)行格式化和位數(shù)限制
     updateValue: function (value) {
     var formattedValue = value
     // 刪除兩側(cè)的空格符
     .trim()
     // 保留 2 位小數(shù)
     .slice(
     0,
     value.indexOf('.') === -1
     ? value.length
     : value.indexOf('.') + 3
     )
     // 如果值尚不合規(guī),則手動(dòng)覆蓋為合規(guī)的值
     if (formattedValue !== value) {
     this.$refs.input.value = formattedValue
     }
     // 通過 input 事件帶出數(shù)值
     // <!--為什么這里把 'input' 作為觸發(fā)事件的事件名?`input` 在哪定義的?-->
     this.$emit('input', Number(formattedValue))
     }
     }
    })
    
    

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

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

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

    3、v-model 的缺點(diǎn)和解決辦法

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

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

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

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

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

    當(dāng) v-model 用到組件上時(shí):

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

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

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

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


    所以,當(dāng)你想要在子組件去修改 props 時(shí),把這個(gè)子組件當(dāng)成父組件那樣用,所以就有了

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

    聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

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

    深入理解Vue 單向數(shù)據(jù)流的原理:單向數(shù)據(jù)流是什么 單向數(shù)據(jù)流指只能從一個(gè)方向來修改狀態(tài)。下圖是單向數(shù)據(jù)流的極簡示意: 單向數(shù)據(jù)流的極簡示意 與單向數(shù)據(jù)流對(duì)對(duì)應(yīng)的是雙向數(shù)據(jù)流(也叫雙向綁定)。在雙向數(shù)據(jù)流中,Model(可以理解為狀態(tài)的集合) 中可以修改自己或其他Model的狀態(tài),
    推薦度:
    標(biāo)簽: VUE 的原理 理解vue
    • 熱門焦點(diǎn)

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 国产精品久久网| 久久国产精品一区| 久久99精品久久久久久不卡| 国产亚洲精品精华液| 久久丝袜精品中文字幕| 国产精品久久久天天影视| 亚洲AV无码久久精品蜜桃| 久久久国产精品| A级毛片无码久久精品免费| 97精品人妻系列无码人妻 | 国产第一福利精品导航| 亚洲精品无码鲁网中文电影| 精品少妇一区二区三区在线| 97精品在线播放| 四虎国产精品永久一区| 精品亚洲永久免费精品| 国产精品99久久99久久久| 久久精品国产99久久久| 久久亚洲精精品中文字幕| 在线亚洲精品自拍| 亚洲av无码成人精品区在线播放| 久久精品国产一区二区电影| 国产精品亚洲αv天堂无码| 久久精品免费一区二区三区| 99精品国产在热久久无毒不卡| 精品一区二区三区在线成人| 无码精品国产VA在线观看| 亚洲精品午夜无码电影网| 中文字幕精品无码一区二区三区| 日韩精品欧美亚洲| 日本精品一区二区三区在线视频一| 国产午夜精品一区二区| 国产精品免费看久久久香蕉| 国产精品第六页| 精品欧美一区二区在线观看| 国内精品久久久久久久涩爱| 精品视频一区二区三区| 久久久精品国产Sm最大网站| 蜜臀av无码人妻精品| 亚洲人成国产精品无码| 亚洲AV日韩精品久久久久久久|