redux-presist不更新本地存储

时间:2018-08-25 12:50:41

标签: reactjs redux redux-persist

我有一个装有篮子的减速器,里面装有我的购物篮,篮子里的东西是这样的:

mouse

我使用redux-persist坚持使用它,当在篮子数组中添加或删除新对象时,它的工作效果很好,但是当我像这样更新一个孩子时:

from kivy.uix.screenmanager import Screen
from kivy.app import App
from kivy.core.window import Window
from kivy.properties import ObjectProperty

Window.clearcolor = (0.5, 0.5, 0.5, 1)
Window.size = (300, 100)


class User(Screen):
    test3 = ObjectProperty(None)

    def __init__(self, **kwargs):
        super(User, self).__init__(**kwargs)
        Window.bind(on_key_down=self._on_keyboard_down)

    def _on_keyboard_down(self, instance, keyboard, keycode, text, modifiers):
        if self.test3.focus and keycode == 40:  # 40 - Enter key pressed
            self.test3.focus = False
            self.abc()
            return True

    def abc(self):
        if self.test1.text.strip() == "":
            self.test1.focus = True
            return False


class Test(App):

    def build(self):
        return self.root


if __name__ == '__main__':
    Test().run()

刷新页面后每个项目的页数将为1!

这是我的rootReducer:

#:kivy 1.10.0

User:
    test1 : test1
    test3: test3
    BoxLayout:
        orientation: "vertical"

        TextInput:
            id:test1
            focus : True
            text: ' '
            width: 100
            multiline: False
            on_text_validate: test2.focus = True

        TextInput:
            id:test2
            text: ' '
            width: 100
            multiline: False
            on_text_validate:
                test3.background_normal = ''
                test3.background_color = [0, 0, 1, 0.5]    # 50% translucent blue
                test3.focus = True

        Button:
            id:test3
            text: 'Ok'
            focus: False
            on_press : root.abc()

3 个答案:

答案 0 :(得分:0)

由于您的basket减速器具有嵌套属性,因此redux-persist可能在水合时没有正确合并对象。

在您的rootReducer中尝试添加:

//...previous code
import autoMergeLevel2 from 'redux-persist/lib/stateReconciler/autoMergeLevel2'
const basketPersistConfig = {
  key: 'basket',
  storage: storage,
  stateReconciler: autoMergeLevel2
};

答案 1 :(得分:0)

所以此问题的原因是,当我们仅更新对象的一部分时,persist不会更新本地存储,因此我应该更新整个对象而不是count属性。 因此,我改变了篮式减速器的结构,并将数量和产品彼此分离成两个不同的子减速器,分别称为产品和徽章,并通过像这样的徽章中的产品密钥将产品数量映射到了

basket: {
    badges: {
        3201: 3.
        3202: 4
    },
    products: {
        3201: {
            id: 3201,
            title: "foo"
        }
        3202: {
            id: 3202,
            title: "bar"
        }
    }
}

答案 2 :(得分:0)

//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;
...
...