2 回答
TA贡献1856条经验 获得超11个赞
问题1: 每次深拷贝是可以的,但是会浪费性能,因为不管你做了任何操作都会创立一个新的对象,特别是内容很多的对象,内存占用负担很大。
问题2:你说的没错,就是可以用Object. freeze来保证immutable,这也是很多轻量级的immutable库内部的实现方式,可以看 seamless-immutable,immutable-helper这类库。
题外话,immutable 保证了 reducer 在内部数据变化后,返回一个新对象,用处是判断两次数据时,只需要进行一次 reference 判断,而不用 deepEqual 判断,从而节省性能开销。
TA贡献1995条经验 获得超2个赞
不知道我跟你想的一不一样,可以看下combineReducers的源码:
var hasChanged = false
var nextState = {}
for (var i = 0; i < finalReducerKeys.length; i++) {
var key = finalReducerKeys[i]
var reducer = finalReducers[key]
var previousStateForKey = state[key]
var nextStateForKey = reducer(previousStateForKey, action)
if (typeof nextStateForKey === 'undefined') {
var errorMessage = getUndefinedStateErrorMessage(key, action)
throw new Error(errorMessage)
}
nextState[key] = nextStateForKey
hasChanged = hasChanged || nextStateForKey !== previousStateForKey
}
return hasChanged ? nextState : state
关键点在于每次reducer返回新的state会跟旧的state做===对比,如果false认为store改变,从而触发页面重绘,如果true,则认为不变,不会触发重绘。所以reducer返回新的state是为了通知redux让页面重绘。
添加回答
举报
