初涉RN RN中的MobX

在剛開始做頁面時, 數據綁定的時候, 對一個爲array的list進行了observable, 裏面的值改變的時候, 並不會重新渲染頁面

這裏面就涉及到MobX會對什麼做出反應?這個問題

MobX會對在追蹤函數執行過程讀取現存的可觀察屬性做出反應

"讀取":是對象屬性的間接引用, 可以用過"."或者"[ ]"的形式完成. eg:user.name或者user['name']

"追蹤函數"是computed表達式,observer組件的render()方法和when, reaction 和 autorun的第一個入參函數

"過程(during)"意味着只追蹤那些在函數執行時被讀取的observable.這些值是否由追蹤函數直接或間接使用並不重要

換句話說,MobX 不會對其作出反應:

  • 從 observable 獲取的值,但是在追蹤函數之外
  • 在異步調用的代碼塊中讀取的 observable

後來查看了官方文檔, 才發現MobX追蹤屬性訪問, 而不是值

通過官方的文檔和圖可以清晰的看出來

比如代碼如下:

let message = observable({
    title: "Foo",
    author: {
        name: "Michel"
    },
    likes: [
        "John", "Sara"
    ]
})


現在 MobX 基本上所做的是記錄你在函數中使用的是哪個箭頭。之後,只要這些箭頭中的其中一個改變了(它們開始引用別的東西了),它就會重新運行。

比如有個數字list= [1, 2, 3], 如果觀測list 當list[0]=5,的時候, 這個時候並不會引起重新渲染, 就像圖上面的值是改變的, 但是箭頭的指向仍然是原來的, 所以就不用改變, 這個我感覺有點像c,c++中的指針, 只有當指針的指向發生改變的時候, 才能被重新觀察到, 如果裏面的值改變, 是不會引起重新渲染的.

這個時候可以將list中使用observable, 它在默認情況下會進行遞歸應用, 到每個list[0],list[1],list[2]中, 但是這樣會引起大量的重複渲染, 最好的還是將每個模塊細分化, 渲染的時候只渲染一部分


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章