redux-presist 不更新本地存储
redux-presist not updating local storage
我有一个篮子减速器,里面装着我的购物篮,篮子里的东西是这样的:
basket: {
32012: {
title: "foo",
count: 1
},
32013: {
title: "bar",
count: 1
}
}
我用 redux-persist 坚持它,当一个新的 object 被添加或从篮子数组中删除时它工作得很好,但是当我像这样更新 child 时:
basket: {
32012: {
title: "foo",
count: 4
},
32013: {
title: "bar",
count: 5
}
}
刷新页面后,每项计数为 1!
这是我的 rootReducer:
import {combineReducers} from 'redux';
import {persistReducer} from 'redux-persist';
import storage from 'redux-persist/lib/storage';
import basketReducer from '../ducks/basket/reducers';
const basketPersistConfig = {
key: 'basket',
storage: storage,
};
const rootReducer = combineReducers({
basket: persistReducer(basketPersistConfig, basketReducer)
});
export default rootReducer;
由于您的 basket
reducer 具有嵌套属性,可能是 redux-persist
在水合时没有正确合并对象。
在您的 rootReducer
中尝试添加:
//...previous code
import autoMergeLevel2 from 'redux-persist/lib/stateReconciler/autoMergeLevel2'
const basketPersistConfig = {
key: 'basket',
storage: storage,
stateReconciler: autoMergeLevel2
};
所以这个问题的原因是当我们只更新一个对象的一部分时,持久化不会更新本地存储,所以我应该更新整个对象而不是计数属性。
所以我改变了我的 basket reducer 的结构,并将计数和产品彼此分离到两个不同的子 reducer 中,分别称为产品和徽章,并通过密钥将产品计数映射到徽章中的产品
basket: {
badges: {
3201: 3.
3202: 4
},
products: {
3201: {
id: 3201,
title: "foo"
}
3202: {
id: 3202,
title: "bar"
}
}
}
//State shape
{
'A':{},
'B':{}
}
在我的例子中,诀窍在于 const newState = Object.assign({},state);
switch(action.type){
case DELETE_CODE:
const newState = Object.assign({},state);
delete newState[action.payload.code];
return newState;
...
...
我有一个篮子减速器,里面装着我的购物篮,篮子里的东西是这样的:
basket: {
32012: {
title: "foo",
count: 1
},
32013: {
title: "bar",
count: 1
}
}
我用 redux-persist 坚持它,当一个新的 object 被添加或从篮子数组中删除时它工作得很好,但是当我像这样更新 child 时:
basket: {
32012: {
title: "foo",
count: 4
},
32013: {
title: "bar",
count: 5
}
}
刷新页面后,每项计数为 1!
这是我的 rootReducer:
import {combineReducers} from 'redux';
import {persistReducer} from 'redux-persist';
import storage from 'redux-persist/lib/storage';
import basketReducer from '../ducks/basket/reducers';
const basketPersistConfig = {
key: 'basket',
storage: storage,
};
const rootReducer = combineReducers({
basket: persistReducer(basketPersistConfig, basketReducer)
});
export default rootReducer;
由于您的 basket
reducer 具有嵌套属性,可能是 redux-persist
在水合时没有正确合并对象。
在您的 rootReducer
中尝试添加:
//...previous code
import autoMergeLevel2 from 'redux-persist/lib/stateReconciler/autoMergeLevel2'
const basketPersistConfig = {
key: 'basket',
storage: storage,
stateReconciler: autoMergeLevel2
};
所以这个问题的原因是当我们只更新一个对象的一部分时,持久化不会更新本地存储,所以我应该更新整个对象而不是计数属性。 所以我改变了我的 basket reducer 的结构,并将计数和产品彼此分离到两个不同的子 reducer 中,分别称为产品和徽章,并通过密钥将产品计数映射到徽章中的产品
basket: {
badges: {
3201: 3.
3202: 4
},
products: {
3201: {
id: 3201,
title: "foo"
}
3202: {
id: 3202,
title: "bar"
}
}
}
//State shape
{
'A':{},
'B':{}
}
在我的例子中,诀窍在于 const newState = Object.assign({},state);
switch(action.type){
case DELETE_CODE:
const newState = Object.assign({},state);
delete newState[action.payload.code];
return newState;
...
...