React w/ Redux/React-Redux 和 Redux-Persist 仅保留对本地存储的第一个更改

React w/ Redux/React-Redux and Redux-Persist only persisting first change to local storage

我在使用 React-ReduxRedux-Persist.

在 React 中坚持 Redux 时遇到了一些问题

减速器示例:

export default (state = {}, action) => {
    switch (action.type) {
      case "SET_FOO":
        return action.payload
      default:
        return state;
    }
  };

操作示例:

const setFooAction = (payload) => {
    return {
      type: "SET_FOO",
      payload
    }
  }
  export default setFooAction;

Index.js

import { createStore, combineReducers } from "redux";
import { persistStore, persistReducer } from "redux-persist";
import storage from "redux-persist/lib/storage";
import { PersistGate } from 'redux-persist/integration/react'
import fooReducer from "redux/reducers/setFooReducer";

const persistConfig = {
  key: "root",
  storage
};

const rootReducer = combineReducers({
  foo: fooReducer 
});

const persistedReducer = persistReducer(persistConfig, rootReducer);

let state = {
  foo: {}
}

let store = createStore(
    persistedReducer, 
    state, 
    window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()
);
let persistor = persistStore(store);

ReactDOM.render(
  <Provider store={store}>
    <PersistGate loading={null} persistor={persistor}>
      <App />
    </PersistGate>
  </Provider>,
  document.getElementById("root")
);

在组件中的用法:

import { connect } from "react-redux";
import setFoo from "redux/actions/setFooAction";

class Main extends Component {        
    //... More Code
    componentDidMount() {
        let foo = this.getFoo() //Gets foo, doesn't really exist but just for context
        this.props.setFoo(foo); //Works fine, all gets set, data is persisted
    }    
    addNewFoo = () => {    
        //Called after functions runs somewhere    
        let newFoo = this.getNewFoo() //Gets newFoo, doesn't really exist but just for context
        foo.push(newFoo)
        this.props.setFoo(foo); //Sets Redux store, on refresh, doesn't persist    
    }
    //...More Code    
}

const mapStateToProps = (state) => ({
  ...state,
});

const mapDispatchToProps = (dispatch) => ({
   setFoo: (payload) => dispatch(setFoo(payload)) 
});

export default connect(mapStateToProps, mapDispatchToProps)(Main);

最初,一切正常:

然而...

如果我决定向我的对象中添加任何新内容并将它们 set/update 添加到 Redux 存储中...

... 刷新时,只有最初保留的内容在 REHYDRATE 期间仍然存在(如果我正确理解 Redux 事件)。

现在我相信这与我的对象不可变性有关,Redux 因此没有接受更改,但我尝试更改我的减速器但没有任何运气:

Reducer 尝试:

export default (state = {}, action) => Object.assign(state, {
   foo: action.payload !== "SET_FOO" ? state.foo : action.payload
});

我尝试了上面的方法(以及这个和我的原始方法的组合,但刚刚破坏了东西)。这种方法有效,但我的状态设置如下:

state {
    foo: {
        foo: {
           //Foo data
        }
    }
}

我知道它只是再次分配给 foo 因为在 reducer 中添加 foo:...

...但是,我不确定如何在不可能在 Redux!

中做错事的情况下更正此问题

所以,我的谨慎占了上风,我想最好问问是否有人有任何建议或线索我可以提出来!

提前感谢您的帮助!!!

乍一看一切都很好。

reducer 中的 Object.assign 可能是导致嵌套 foo 对象的原因,因为 Redux 的原则是不变性,因此您应该始终 return 一个新状态,相反,你直接改变 state.

您可以再添加一个第一个参数,以创建一个具有新 foo 状态属性的新对象:

export default (state = {}, action) => Object.assign({}, state, {
   foo: action.payload !== "SET_FOO" ? state.foo : action.payload
});

您会经常看到的更好的方法是:

export default (state = {}, { type, payload }) => {
  switch (type) {
    case 'SET_FOO': {
      return { ...state, payload }
    }

    default: {
      return state
    }
  }
}

在最后一个示例中,您可以清楚地看到我正在 return创建一个具有状态所具有的所有属性的新对象,以及新的有效载荷。

祝你好运!