immer分享摘要

文檔:https://juejin.cn/post/6844904111402385422

1、immutable解決了什么問(wèn)題?

  • 數(shù)據(jù)分為基本類型和引用類型,多出引用同一處數(shù)據(jù)源,并加以修改,就會(huì)出現(xiàn)不可預(yù)測(cè)的問(wèn)題。

  • 那就再每次修改數(shù)據(jù)源的時(shí)候,深拷貝一份數(shù)據(jù)源,在拷貝的數(shù)據(jù)上做操作? 浪費(fèi)內(nèi)存,消耗性能。

  • 所以在 2014 年,facebook 的 immutable-js 橫空出世,即保證了數(shù)據(jù)間的 immutable ,在運(yùn)行時(shí)判斷數(shù)據(jù)間的引用情況,又兼顧了性能。

  • Immutable 實(shí)現(xiàn)的原理是 Persistent Data Structure(持久化數(shù)據(jù)結(jié)構(gòu)),也就是使用舊數(shù)據(jù)創(chuàng)建新數(shù)據(jù)時(shí),要保證舊數(shù)據(jù)同時(shí)可用且不變。同時(shí)為了避免 deepCopy 把所有節(jié)點(diǎn)都復(fù)制一遍帶來(lái)的性能損耗,Immutable 使用了 Structural Sharing(結(jié)構(gòu)共享),即如果對(duì)象樹中一個(gè)節(jié)點(diǎn)發(fā)生變化,只修改這個(gè)節(jié)點(diǎn)和受它影響的父節(jié)點(diǎn),其它節(jié)點(diǎn)則進(jìn)行共享。

  • immer與 immutable-js 最大的不同,immer 是使用原生數(shù)據(jù)結(jié)構(gòu)的 API 而不是像 immutable-js 那樣轉(zhuǎn)化為內(nèi)置對(duì)象之后使用內(nèi)置的 API。所有具有副作用的邏輯都可以放進(jìn) produce 的第二個(gè)參數(shù)的函數(shù)內(nèi)部進(jìn)行處理。在這個(gè)函數(shù)內(nèi)部對(duì)原來(lái)的數(shù)據(jù)進(jìn)行任何操作,都不會(huì)對(duì)原對(duì)象產(chǎn)生任何影響

-immersed原理:Immer 源碼中,使用了一個(gè) ES6 的新特性 Proxy 對(duì)象。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容