微信小程序 this.data與this.setData

1、摘要

  小程序中咱們會常常使用到this.data與this.setData。其中this.data是用來獲取頁面data對象的,而this.setData是用來更新界面的。那麼他們之間的區別與聯繫你真的搞懂了嗎?小程序

2、正文

  this.data能夠獲取頁面data對象,可是它返回的對象究竟是新的對象仍是僅僅只是一個引用吶。這個很關鍵,在平常開發中極可能由於不知道或者是本身的疏忽致使bug,並且很難排查緣由。帶着這個疑問咱們來作一下試驗。因爲時間比較緊,博主就不單獨寫demo了,項目中可能有大量其它代碼干擾咱們分析,還請見諒。this

    var data = this.data.swiperItems[currentSwiper];

  這行代碼使用this.data獲取了我須要的對象,而且賦值給data變量,下面分別打印data和this.data的相應對象。spa

  能夠看到這兩個對象的內容是一致的。下面我將在data變量中添加一個test字段,而後再看這二者的打印結果。注意我並不會對this.data操做。3d

  能夠看到他們都發生了變換,因此這是淺拷貝,也就是兩個變量指向了同一片存儲區域,不管經過哪一個變量操做這片存儲區域,相應的兩個變量得出的值都會變換。爲了繼續證實咱們的猜測是正確的,下面我只操做this.data而不操做data。code

  跟咱們預想的同樣,即便我先賦值後加字段,data得出的結果也是被修改了的。
對象

  可能有人會問,那爲啥用使用this.setData後才能看到界面的變換呢?至於this.setData咱們能夠當作是更新界面,而且貌似this.setData裏面又託管了一個this.data的副本。由於在我改變this.data後立馬去執行blog

    this.setData({});

  界面並不會更新,這就說明咱們須要更新this.setData管理的那個數據對象才能更新界面,而界面真正加載的數據也是來自那裏。想要知道具體怎麼實現的,那就要去看源代碼了。ip

3、結論

  總結一下就是:this.data與this.setData的關係就是this.setData裏面存儲的是this.data的副本,而界面是從this.setData裏面託管的this.data的副本取數據的。因此咱們更改this.data並不會直接更新界面,由於這個時候的this.setData裏面的副本仍是沒有更新前的。開發

4、寫在最後

  推薦一個小程序UI組件庫swiper

掃描小程序碼,可查看效果。

 

  

相關文章
相關標籤/搜索