最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關(guān)于vue雙向綁定帶來(lái)的問(wèn)題及解決

 更新時(shí)間:2022年09月24日 08:53:18   作者:方沐雨  
這篇文章主要介紹了關(guān)于vue雙向綁定帶來(lái)的問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

vue雙向綁定帶來(lái)的問(wèn)題

問(wèn)題場(chǎng)景

查詢(xún)完表格數(shù)據(jù)后 通過(guò)作用域插槽,將該行數(shù)據(jù)傳到修改頁(yè)面(定義了個(gè)新對(duì)象存儲(chǔ)數(shù)據(jù)),但是由于數(shù)據(jù)雙向綁定,修改這個(gè)新對(duì)象的值,會(huì)影響到最初查詢(xún)表格獲取的值

如下

this.editForm = row

解決方案

方法1:通過(guò)json之間的解析,深拷貝創(chuàng)建一個(gè)與row無(wú)綁定關(guān)聯(lián)的臨時(shí)對(duì)象,再賦值給editForm

this.editForm = JSON.parse(JSON.stringify(row))

方法2:使用…展開(kāi)運(yùn)算符

this.editForm = {...this.editForm,...row}

方法3:$set也不會(huì)影響原數(shù)據(jù),但只能操作單個(gè)數(shù)據(jù),在上述場(chǎng)景可能不太適用(屬性多久麻煩了)

this.$set(this.editForm,'roleName',row.roleName)
this.$set(this.editForm,'roleDesc',row.roleDesc)

這樣就不會(huì)影響到最初的row啦! 

vue雙向綁定的原理總結(jié)

MVVM

視圖模型雙向綁定,是Model-View-ViewModel的縮寫(xiě),也就是把MVC中的Controller演變成ViewModel。Model層代表數(shù)據(jù)模型,View代表UI組件,ViewModel是View和Model層的橋梁,數(shù)據(jù)會(huì)綁定到viewModel層并自動(dòng)將數(shù)據(jù)渲染到頁(yè)面中,視圖變化的時(shí)候會(huì)通知viewModel層更新數(shù)據(jù)。以前是操作DOM結(jié)構(gòu)更新視圖,現(xiàn)在是數(shù)據(jù)驅(qū)動(dòng)視圖。

優(yōu)點(diǎn):

1.低耦合。視圖(View)可以獨(dú)立于Model變化和修改,一個(gè)Model可以綁定到不同的View上,當(dāng)View變化的時(shí)候Model可以不變化,當(dāng)Model變化的時(shí)候View也可以不變;

2.可重用性。你可以把一些視圖邏輯放在一個(gè)Model里面,讓很多View重用這段視圖邏輯。

3.獨(dú)立開(kāi)發(fā)。開(kāi)發(fā)人員可以專(zhuān)注于業(yè)務(wù)邏輯和數(shù)據(jù)的開(kāi)發(fā)(ViewModel),設(shè)計(jì)人員可以專(zhuān)注于頁(yè)面設(shè)計(jì)。

4.可測(cè)試。

數(shù)據(jù)(model)變化主動(dòng)觸發(fā)ui(view)變化,同時(shí)ui(view)變化主動(dòng)觸發(fā)數(shù)據(jù)(model)變化,當(dāng)然這里的ui變化指定表單中的用戶(hù)輸入,可通俗的理解為:在單向綁定的基礎(chǔ)上給可輸入元素(input、textarea等)添加change(input)事件,來(lái)動(dòng)態(tài)修改model和view

vue當(dāng)中的雙向綁定

vue.js是采用數(shù)據(jù)劫持結(jié)合發(fā)布者-訂閱者模式的方式,通過(guò)Object.defineProperty()來(lái)劫持各個(gè)屬性的setter和getter,在數(shù)據(jù)變動(dòng)時(shí)發(fā)布消息給訂閱者,觸發(fā)相應(yīng)的監(jiān)聽(tīng)回調(diào)

使用 v-model / .sync 實(shí)現(xiàn),v-model是 v-bind:value 和 v-on:input 的語(yǔ)法糖

  • v-bind:value 實(shí)現(xiàn)了 data ⇒ UI 的單向綁定
  • v-on:input 實(shí)現(xiàn)了 UI ⇒ data 的單向綁定

引申出這兩個(gè)單向綁定如何實(shí)現(xiàn)

v-bind的實(shí)現(xiàn)

通過(guò) Object.defineProperty API 給 data 創(chuàng)建 getter 和 setter,用于監(jiān)聽(tīng) data 的改變,data 一變就會(huì)安排改變 UI

v-on的實(shí)現(xiàn)

通過(guò) template compiler 給 DOM 添加事件監(jiān)聽(tīng),DOM input 的值變了就會(huì)去修改 data。

Compile(指令解析器)

Compile主要做的事情是解析模板指令,將模板中變量替換成數(shù)據(jù),然后初始化渲染頁(yè)面視圖,并將每個(gè)指令對(duì)應(yīng)的節(jié)點(diǎn)綁定更新函數(shù),添加鑒定數(shù)據(jù)的訂閱者,一旦數(shù)據(jù)有變動(dòng),收到通知,更新視圖

Observer(數(shù)據(jù)監(jiān)聽(tīng)器)

Observer的核心是通過(guò)Object.defineProprtty()來(lái)監(jiān)聽(tīng)數(shù)據(jù)的變動(dòng),這個(gè)函數(shù)內(nèi)部可以定義setter和getter,每當(dāng)數(shù)據(jù)發(fā)生變化,就會(huì)觸發(fā)setter。這時(shí)候Observer就要通知訂閱者,訂閱者就是Watcher

Watcher(訂閱者)

Watcher訂閱者作為Observer和Compile之間通信的橋梁,主要做的事情是:

  • 在自身實(shí)例化時(shí)往屬性訂閱器(dep)里面添加自己
  • 自身必須有一個(gè)update()方法
  • 待屬性變動(dòng)dep.notice()通知時(shí),能調(diào)用自身的update()方法,并觸發(fā)Compile中綁定的回調(diào)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 手把手教你搭建一個(gè)vue項(xiàng)目的完整步驟

    手把手教你搭建一個(gè)vue項(xiàng)目的完整步驟

    身為入行未深的小白前端,不斷的學(xué)習(xí)是我們不可丟失的習(xí)慣,前端流行的框架也是層出不窮,vue在眾多框架中脫穎而出,下面這篇文章主要給大家介紹了關(guān)于搭建一個(gè)vue項(xiàng)目的完整步驟,需要的朋友可以參考下
    2022-07-07
  • 仿ElementUI實(shí)現(xiàn)一個(gè)Form表單的實(shí)現(xiàn)代碼

    仿ElementUI實(shí)現(xiàn)一個(gè)Form表單的實(shí)現(xiàn)代碼

    這篇文章主要介紹了仿ElementUI實(shí)現(xiàn)一個(gè)Form表單的實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Vue2?中自定義圖片懶加載指令?v-lazy實(shí)例詳解

    Vue2?中自定義圖片懶加載指令?v-lazy實(shí)例詳解

    這篇文章主要為大家介紹了Vue2?中自定義圖片懶加載指令?v-lazy實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • Vue+webpack+Element 兼容問(wèn)題總結(jié)(小結(jié))

    Vue+webpack+Element 兼容問(wèn)題總結(jié)(小結(jié))

    這篇文章主要介紹了Vue+webpack+Element 兼容問(wèn)題總結(jié)(小結(jié)),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • VUE3安裝element?ui失敗的原因以及解決辦法

    VUE3安裝element?ui失敗的原因以及解決辦法

    這篇文章主要給大家介紹了關(guān)于VUE3安裝element?ui失敗的原因以及解決的相關(guān)資料,很多朋友升級(jí)使用Vue3了,但在安裝element?ui失敗出錯(cuò)了,這里給大家總結(jié)下,需要的朋友可以參考下
    2023-09-09
  • vue+element控件之間間距太大問(wèn)題及解決

    vue+element控件之間間距太大問(wèn)題及解決

    這篇文章主要介紹了vue+element控件之間間距太大問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • vue移動(dòng)端的左右滑動(dòng)事件詳解

    vue移動(dòng)端的左右滑動(dòng)事件詳解

    這篇文章主要為大家詳細(xì)介紹了vue移動(dòng)端的左右滑動(dòng)事件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • vue axios數(shù)據(jù)請(qǐng)求get、post方法及實(shí)例詳解

    vue axios數(shù)據(jù)請(qǐng)求get、post方法及實(shí)例詳解

    axios是一個(gè)基于Promise,同時(shí)支持瀏覽器端和Node.js的HTTP庫(kù),常用于Ajax請(qǐng)求。這篇文章主要介紹了vue axios數(shù)據(jù)請(qǐng)求get、post方法的使用 ,需要的朋友可以參考下
    2018-09-09
  • 基于Vue實(shí)現(xiàn)頁(yè)面切換左右滑動(dòng)效果

    基于Vue實(shí)現(xiàn)頁(yè)面切換左右滑動(dòng)效果

    這篇文章主要為大家詳細(xì)介紹了基于Vue實(shí)現(xiàn)頁(yè)面切換左右滑動(dòng)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • 解決vue項(xiàng)目Error:Cannot find module‘xxx’類(lèi)報(bào)錯(cuò)問(wèn)題

    解決vue項(xiàng)目Error:Cannot find module‘xxx’類(lèi)報(bào)錯(cuò)問(wèn)題

    當(dāng)npm運(yùn)行報(bào)錯(cuò)Error:Cannot find module 'xxx'時(shí),通常是因?yàn)閚ode_modules文件或依賴(lài)未正確安裝,解決步驟包括刪除node_modules和package-lock.json文件,重新運(yùn)行npm install,并根據(jù)需要安裝額外插件,若網(wǎng)絡(luò)問(wèn)題導(dǎo)致安裝失敗
    2024-10-10

最新評(píng)論

巨野县| 古交市| 文登市| 延寿县| 平顶山市| 广州市| 池州市| 沁源县| 三都| 广河县| 疏勒县| 海晏县| 女性| 洛阳市| 六枝特区| 达日县| 栖霞市| 江华| 广汉市| 万安县| 和政县| 深圳市| 青冈县| 宾川县| 龙海市| 开远市| 木兰县| 长岛县| 四川省| 岳普湖县| 揭西县| 西宁市| 乳源| 闽侯县| 星子县| 旺苍县| 万州区| 区。| 芒康县| 张掖市| 腾冲县|