摘要:背景是的項目,并且打開了嚴格模式的情況下大概我的需求是,將中的一個數組在中進行渲染,那么自然就想到了的方法,然后再中直接將數組轉成代碼塊。同樣的,的解構賦值,也只是淺拷貝所以說,嚴格模式下一直再警告我不能修改的值。
背景是 React + mobx@4.x + antd 的項目,并且打開了嚴格模式的情況下:
configure({ enforceActions: true })
大概我的需求是, 將store 中的一個數組(dataSource)在stateless Component中進行渲染,那么自然就想到了Array 的 map 方法,然后再JSX中直接將數組轉成JSX 代碼塊。
const wrapperItem = (title, list) => { const result = list.map((item, index) =>) return (
{index} {item} ) }{title}
{result}
上面的demo 代碼中的第二個參數list 會傳入observable 屬性----是一個數組。
然后瀏覽器狂報錯誤:
[mobx] Since strict-mode is enabled, changing observed observable values outside actions is not allowed. Please wrap the code in an `action` if this change is intended. Tried to modify: SupernatantStore@13.data.baseInfo
然后看一下 下面的簡單代碼排查錯誤吧:
var list = [{"a": 1},{"a": 2}]; var newList = list.map(function(index){ return index.a += 1; }); console.log(newList,"newList",list,"list"); // newList 和 list 都改變了。先修改了list的單個key值,再將key值返回,自然就修改了兩個 var list = [{"a": 1},{"a": 2}]; var newList = list.slice(0).map(function(index){ return index.a += 1; }); console.log(newList,"newList",list,"list"); // newList 和 list 也都改變了,關鍵很不理解,明明 list 跟 list.slice(0) 已經不是指向同一個數組,為什么list.slice(0) 修改內容還會引發list 也改變? // wa ... // 難受的一批。。。 // slice() concat() 都是淺拷貝,整個數組的指向是不同的了,但是,里面的對象的指向是同一個,所以其實在map里執行的函數,操作的對象還是同一個。。。 list.slice(0)[0] === list[0] // truw list.slice(0) === list // false
同樣的,es6 的解構賦值,也只是淺拷貝:
var a = {b: {c:111},d:{d:2222}} var {b} = a b === a.b // true
所以說,mobx嚴格模式下一直再警告我不能修改observable 的值。
constructor() { this.initData() } @action initData = async () => { this.baseInfo = await getBaseInfo() this.extractInfo = await getExtractInfo() this.extractInfo = await getExtractStatus() }
我之前的代碼是這樣的,其實,我覺得連@action 也不要,因為就算在嚴格模式下constructor函數中也是可以修改observable中的值的。
那為什么一直報不能在action之外修改observable 屬性的錯誤呢?
action 僅影響當前運行的函數,而不會影響異步函數,這意味著如果你有setTimeout,promise, then 或 異步的constructor ,在回調更多的狀態改變,這些回調應包裝在 runInAction 中。。。。
寫在最后:
我之前真的沒有好好注意這個問題,對于以前沒有任何限制引用值的 set 的時候,我往往只關心我得到的值(return 出來的)是不是我想要的。。。。
說明我對于什么 slice,concat() 產生一個新的數組這一個概念的理解,只停留于表面。。。。
我這么菜,不能老是這樣。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/94319.html
摘要:所以這是一篇插隊的文章,用于去理解中的裝飾器和概念。因此,該的作用就是根據入參返回具體的描述符。其次局部來看,裝飾器具體應用表達式是,其函數簽名和是一模一樣。等裝飾器語法,是和直接使用是等效等價的。 ================前言=================== 初衷:以系列故事的方式展現 MobX 源碼邏輯,盡可能以易懂的方式講解源碼; 本系列文章: 《【用故事解...
摘要:本文挑選了到大廠面試題,大家在閱讀時,建議不要先看我的答案,而是自己先思考一番。構造函數返回值是或,是返回的是種返回的對象。 今年來,各大公司都縮減了HC,甚至是采取了裁員措施,在這樣的大環境之下,想要獲得一份更好的工作,必然需要付出更多的努力。 本文挑選了20到大廠面試題,大家在閱讀時,建議不要先看我的答案,而是自己先思考一番。盡管,本文所有的答案,都是我在翻閱各種資料,思考并驗證之...
摘要:原理分析的核心就是通過觀察某一個變量,當該變量產生變化時,對應的內的回調函數就會發生變化。回調函數若依賴外部環境,則無法進行收集很好理解,的回調函數在預執行的時候無法到達那一行代碼,所以收集不到。 Mobx解決的問題 傳統React使用的數據管理庫為Redux。Redux要解決的問題是統一數據流,數據流完全可控并可追蹤。要實現該目標,便需要進行相關的約束。Redux由此引出了dispa...
摘要:數組學習記錄是的實例屬性。對數組元素進行排序,并返回當前數組。返回一個由所有數組元素組合而成的字符串。為數組中的每個元素執行一次回調函數。返回一個數組迭代器對象,該迭代器會包含所有數組元素的鍵值對。 JavaScript數組學習記錄 Array.length Array.length 是Array的實例屬性。返回或設置一個數組中的元素個數。該值是一個無符號 32-bit 整數,并且總是...
閱讀 3205·2021-11-08 13:21
閱讀 1196·2021-08-12 13:28
閱讀 1406·2019-08-30 14:23
閱讀 1925·2019-08-30 11:09
閱讀 840·2019-08-29 13:22
閱讀 2685·2019-08-29 13:12
閱讀 2549·2019-08-26 17:04
閱讀 2250·2019-08-26 13:22