您好,登錄后才能下訂單哦!
這篇文章主要介紹“Proxy的不可變數據優點及使用方法是什么”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Proxy的不可變數據優點及使用方法是什么”文章能幫助大家解決問題。
對象被賦值后,更改對象,兩個都會改變,因為其引用著相同的地址,我們稱這為可變對象
所以這會造成意想不到的修改
React 要求本地組件的狀態保持不可變性,Redux 同樣要求全局狀態保持不可變
Immutable.js 中 對 Immutable 對象 增刪改查都會返回一個全新的 Immutable 對象,保證舊數據的可用不變
Immutable 使用了結構共享,即對象樹中的節點改變只會影響自己和其父節點,其他節點共享
保護數據意外更改,減少bug
方便跟蹤數據變更,便于排錯
調用麻煩
function updateData(obj, key, value) { return { ...obj, [key]: value }; } const obj = { name: "云牧" }; const newObj = updateData(obj, "name", "黛玉"); console.log(newObj); // { name: '黛玉' } console.log(obj); // { name: '云牧' }
自定義新的對象類型,對其操作細節封裝在其內部
著名的 immutable-js
,就是這個思路,定義了List
、 Stack
、 Map
、OrderedMap
、Set
、OrderedSet
和 Record
這么多對象
class MyObject { constructor(obj = {}) { this.obj = { ...obj }; } get(name) { return this.obj[name]; } set(name, value) { return new MyObject({ ...this.obj, [name]: value }); } } const obj = new MyObject({ name: "云牧" }); const newObj = obj.set("name", "黛玉"); console.log(newObj); // MyObject { obj: { name: '黛玉' } } console.log(obj); // MyObject { obj: { name: '云牧' } }
函數調用產生新對象,對其新對象操作之后返回
性能損耗比較大
function produce(obj, recipe) { const newObj = { ...obj }; recipe(newObj); return newObj; } const obj = { name: "云牧" }; const newObj = produce(obj, draft => { draft.name = "黛玉"; }); console.log(newObj); // { name: '黛玉' } console.log(obj); // { name: '云牧' }
function produce(obj, recipe) { const state = { base: obj, // 基礎對象 copy: {}, // 被更改后的對象 draft: {}, // 代理對象 currentKey: 0 // 當前操作的key }; const handlerItem = { get(target, property, receiver) { // 如果更改后的對象存在則使用copy if (state.copy[state.currentKey]) { return state.copy[state.currentKey][property]; } return state.base[state.currentKey][property]; }, set(target, property, value, receiver) { Reflect.set(state.copy[state.currentKey], property, value); } }; const handler = { get(target, property, receiver) { state.currentKey = property; if (!state.draft[property]) { const val = { ...state.base[property] }; const proxy = new Proxy(val, handlerItem); state.draft[property] = proxy; state.copy[property] = val; } return state.draft[property]; }, set(target, property, value, receiver) { return Reflect.set(state.copy, property, value); } }; const proxyObj = new Proxy(obj, handler); recipe(proxyObj); return proxyObj; } const arrObj = Array.from({ length: 100 }, (v, index) => ({ name: "云牧" + index })); const newObj = produce(arrObj, draft => { draft[50].name = "黛玉"; }); console.log(newObj[50].name); // 黛玉 console.log(arrObj[50].name); // 云牧50
JS沒有不可變結構,我們一般可以使用 Immutable.js
和 immerjs
Immutable.js
需要學習他的數據格式操作,且其不可變數據需要 toJS
才能得到原生對象,心智負擔大
immerjs
則沒有這方面的問題,且體積更為小巧
關于“Proxy的不可變數據優點及使用方法是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。