vue中如何解除數(shù)據(jù)之間的雙向綁定
如何解除數(shù)據(jù)之間的雙向綁定
問題
在開發(fā)過程中,我想要的結(jié)果是,一個表格和數(shù)據(jù)data數(shù)組綁定,將data中的數(shù)據(jù)依次遍歷渲染到表格。
而data的數(shù)據(jù)是通過另一個this.formValidate 來push,代碼如下
this.formValidate.BookISBN = res.data.Data.ISBN
this.formValidate.BookName = res.data.Data.BookTitle
this.formValidate.Author = res.data.Data.Author
this.data2.push(this.formValidate)
這樣寫造成的結(jié)果是:每次添加新的數(shù)據(jù)時,data2中的所有數(shù)據(jù)都會變成剛剛添加的新數(shù)據(jù),看下圖
第一個記錄錄入

第二個記錄錄入

這就很尷尬,于是想解除數(shù)據(jù)的雙向綁定。
結(jié)論
用JSON,對對象進行深拷貝。先上代碼
this.formValidate.BookISBN = res.data.Data.ISBN
this.formValidate.BookName = res.data.Data.BookTitle
this.formValidate.Author = res.data.Data.Author
let formdata= JSON.parse(JSON.stringify(this.formValidate))
this.data2.push(formdata)
使用這句話
let formdata= JSON.parse(JSON.stringify(this.formValidate))
其實是通過json之間的解析 創(chuàng)建的臨時變量,不會隨this.formValidate改變而改變。
其中parse和stringfy 兩個函數(shù)是json與字符串之間數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)變的函數(shù),不了解的可以自行查閱。
vue雙向綁定2.0和3.0區(qū)別
vue2.0實現(xiàn)雙向綁定
Vue2.0使用ES5的Object.defineProperty()實現(xiàn)數(shù)據(jù)劫持和雙向綁定
Obejct.defineProperty()可以添加對象屬性或者修改屬性
用法:
Obejct.defineProperty(obj, prop, descriptor)
obj:目標對象prop:對象屬性descriptor:屬性特性
返回處理后的對象obj
如果沒有給Object設置特性的話,默認configurable,enumrable.writable都為false

返回結(jié)果:


設置了setter,getter方法以后

這里可以看到Object.defineProperty()方法劫持了set方法,也就為Vue.2.0的雙向綁定提供了思路
vue3.0實現(xiàn)雙向綁定
Vue3.0使用ES6的Proxy代理setter,getter方法,代理整個對象,只要對象的某個屬性發(fā)生變化,就可以劫持數(shù)據(jù)

vue2.0和Vue3.0雙向綁定的區(qū)別
Vue2.0的Object.defineProperty()只能劫持對象中的某個屬性,而Proxy可以監(jiān)聽整個對象
vue2.0如果對象的屬性增加或者刪除無法監(jiān)聽到,無法監(jiān)聽到數(shù)組基于下標的修改,還有無法改變length
觀察者模式和發(fā)布者訂閱者模式的區(qū)別
發(fā)布訂閱模式多了一層類似代理的關系,調(diào)度中心
發(fā)布者-訂閱者模式
發(fā)布訂閱模式在觀察者模式的基礎上加上了一個中間層代理“通知”的角色,這讓發(fā)布者不直接與溝通者聯(lián)系,不知道有哪些訂閱者訂閱了自己,發(fā)布者只負責“發(fā)布”一個責任,而訂閱者只負責接受信息然后更新。
訂閱者把想要訂閱的事件注冊到調(diào)用中心去,發(fā)布者把更新發(fā)布到調(diào)用中心,調(diào)用中心統(tǒng)一通知訂閱者

實現(xiàn)效果如下:

觀察者模式
有時候觀察者模式又稱為發(fā)布訂閱模式,但其實兩種模式還是存在區(qū)別的,觀察者模式是一對多關系,當對象改變,其他依賴它的對象都會更新改變
優(yōu)點:
- 降低目標與觀察者之間的耦合關系,兩者是抽象耦合關系,符合依賴倒置原則
- 目標和觀察者建立一套觸發(fā)機制
缺點:
- 依賴關系沒有完全解除,可能出現(xiàn)循環(huán)利用
- 當觀察者很多的時候,通知需要花很多時間,影響程序效率

這里實現(xiàn)了簡單的觀察者模式,每次obj的name屬性變化時,set都會監(jiān)聽到, 并且通知觀察者更新數(shù)據(jù)
Vue模型的建立以及怎么實現(xiàn)的
對于一個template,先計算出dom樹,生成render函數(shù),然后繪制布局,最后繪制樣式
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
- vue子組件改變父組件傳遞的prop值通過sync實現(xiàn)數(shù)據(jù)雙向綁定(DEMO)
- Vue.js實現(xiàn)數(shù)據(jù)雙向綁定的代碼示例
- 使用Vue.js實現(xiàn)數(shù)據(jù)的雙向綁定
- Vue父子組件數(shù)據(jù)雙向綁定(父傳子、子傳父)及ref、$refs、is、:is的使用與區(qū)別
- 淺析Vue3中通過v-model實現(xiàn)父子組件的雙向數(shù)據(jù)綁定及利用computed簡化父子組件雙向綁定
- vue3中reactive數(shù)據(jù)被重新賦值后無法雙向綁定的解決
- proxy實現(xiàn)vue3數(shù)據(jù)雙向綁定原理
- vue自定義組件實現(xiàn)v-model雙向綁定數(shù)據(jù)的實例代碼
- vue 數(shù)據(jù)雙向綁定的實現(xiàn)方法
- Vue項目開發(fā)實現(xiàn)父組件與子組件數(shù)據(jù)間的雙向綁定原理及適用場景
相關文章
vue 監(jiān)聽input輸入事件(oninput)的示例代碼支持模糊查詢
這篇文章主要介紹了vue 監(jiān)聽input輸入事件(oninput)支持模糊查詢,比如說表格模糊查詢,實現(xiàn)一邊輸入,一邊過濾數(shù)據(jù),本文通過示例代碼給大家詳細講解,需要的朋友可以參考下2023-02-02
Nuxt封裝@nuxtjs/axios請求后端數(shù)據(jù)方式
這篇文章主要介紹了Nuxt封裝@nuxtjs/axios請求后端數(shù)據(jù)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-10-10
vue2使用el-date-picker實現(xiàn)動態(tài)日期范圍demo
這篇文章主要為大家介紹了vue2使用el-date-picker實現(xiàn)動態(tài)日期范圍示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-06-06
Vue聲明式導航與編程式導航及導航守衛(wèi)和axios攔截器全面詳細講解
這篇文章主要介紹了Vue聲明式導航與編程式導航及導航守衛(wèi)和axios攔截器,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧2023-01-01
一篇看懂vuejs的狀態(tài)管理神器 vuex狀態(tài)管理模式
一篇看懂vuejs的狀態(tài)管理神器,Vuex一個專為Vue.js應用程序開發(fā)的狀態(tài)管理模式,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04
vue2 v-model/v-text 中使用過濾器的方法示例
這篇文章主要介紹了vue2 v-model/v-text 中使用過濾器的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-05-05
Vue移動端實現(xiàn)pdf/excel/圖片在線預覽
這篇文章主要為大家詳細介紹了Vue移動端實現(xiàn)pdf/excel/圖片在線預覽功能的相關方法,文中的示例代碼講解詳細,有需要的小伙伴可以參考下2024-04-04

