vuejs檢視不能及時更新的問題 ,深入響應式原理
最近三個多月,我和我的同事一起用vuejs 做公司的專案管理系統,因為是第一次用這種雙向繫結的框架,難免遇到一些問題。
在做專案時,發現數據並沒有實時更新,比如說你用element-ui的時間控制元件或者上傳外掛,你雖然更改了時間,或者更改了日期,但是檢視並沒有更新,奇怪的是,你隨便的在旁邊某個文字框輸入值,檢視就更新了,一開始我們很納悶,到底是什麼原因呢?真的是百思不得其解!後面仔仔細細的看了一下官方文件,終於找到了原因,其實這跟Vue的響應式原理有關係(附上官網“深入響應式原理”網址:https://cn.vuejs.org/v2/guide/reactivity.html);如果你遇到這個問題,自然就知道我說的是什麼,如果沒遇到,最好也能詳細的讀官網的這篇文章!
那麼我接下來就講講什麼是響應式原理,當然我的理解可能不對,完全是主觀的寫這篇文章,正解應該到官網上檢視。因為任何一門語言或者框架,其實官網已經說得非常明白了,只是我們大部分人習慣性的百度,然後是大部分無用的資訊,對解決問題毫無幫助,所以,廣大的程式設計朋友們,官網是最好的教程!我就是因為不認真看教程導致自己走了一些彎路。我也是邊走邊反思。還好,我很慶幸我明白了這個道理。
不說廢話了,開擼。。。。。
我先寫一個物件:let submitMesage ={
name:‘小紅’,
sex:‘女’,
task:[
{time:'2017',doWhat:'除草'},
{time:'2018',doWhat:'釣魚'}
]
}
如果你在你的檢視中迴圈遍歷task中的內容,time和doWhat是響應式的,也許你改更改其中的某個time和doWhat,檢視並沒有更細,注意我說的是也許,不一定不會更新,我在實際的專案中確實是這樣發生的,有些地方能實時更新,有些卻不能,如果資料巢狀的層數越多,出現檢視不更新的概率就越大!請原諒我用概率來描述這個問題。假如出現檢視不更新的情況,如何解決?我們一般定義的資料格式都是類似javaScript的物件,受現代
JavaScript 的限制 (以及廢棄 Object.observe
),Vue 不能檢測到物件屬性的新增或刪除。由於
Vue 會在初始化例項時對屬性執行
getter/setter
轉化過程,所以屬性必須在 data
物件上存在才能讓
Vue 轉換它,這樣才能讓它是響應的。(紅色部分是官網的原話),官網的解釋是不能檢測到屬性的新增或刪除!然而我開發中是遇到原有存在的屬性的值不能修改。我開發中因為是for迴圈task陣列中的物件,數量也許是不太確定的,對於不太確定的陣列,Vue可能就認為你的數組裡面的屬性是不太確定的,個數也不太確定,所以改了資料,檢視並沒有主動的更新,Vue認為,你需要手動的去更新了。好吧,我只能這樣說服自己了。利用官網的vm.$set方法手動的更新資料。如果對react有認識的朋友,就不難明白為什麼要這麼做了。reactjs是單項繫結資料的框架,凡是檢視
更新必須手動,這樣的話我的理解就是更不容易出錯。好吧,既然vue提供瞭解決方案,那就跟著畫葫蘆吧!想要更新task裡的內容只能這
樣搞了:this.$set(submitMesage.task,index,{time:"xxx",doWhat:"xxx});其中的index是陣列的角標,比如說0,1,2...;
這樣檢視就更新了!如果我寫的有點抽象,請認真看官網!這些理解都是主觀並不客觀,看看就好,如果是錯的,馬上拋棄之。。。