reactjs useReducer在第二次尝试编辑值后无法设置undefined的属性

bttbmeg0  于 2023-01-12  发布在  React
关注(0)|答案(3)|浏览(156)

由于某种原因,useReducer和useContext的组合不适合我,正如你可以从代码中看到的,我试图使用onChange来更改值,它第一次工作,但第二次一切崩溃。这里有代码https://codesandbox.io/s/billowing-field-k7lif?file=/src/App.css Ps的链接:js和Surcharge是要 checkout 的文件。(忽略注解)

6za6bjd0

6za6bjd01#

问题是Reducer从不返回更新的状态,而是隐式返回undefined

function reducer(state, newState) {
  switch (newState.type) {
    case "calcCartValue":
      state.cartValue = newState.value;
  }
}

应该是

function reducer(state, action) {
  switch (action.type) {
    case "calcCartValue":
      return { ...state, cartValue: action.value };
    default:
      throw new Error(`${action.type} action is not supported`);
  }
}

我建议你再看看这里的文件

68de4m5k

68de4m5k2#

〈ContextOne.Provider value={{ initialState,dispatch }}〉当然,initialState永远不会改变,事实上,它只是初始状态,所以都是零。我需要做的是:
〈ContextOne.提供程序值={{状态,调度}}〉

f5emj3cl

f5emj3cl3#

在app.js中,您应该更改这一行:

const [state, dispatch] = useReducer(reducer, initialState);
<ContextOne.Provider
    value={{ initialState: initialState, dispatch: dispatch }}
  >
.....

到这个

const [state, dispatch] = useReducer(reducer, initialState);
<ContextOne.Provider
    value={{ initialState: state, dispatch: dispatch }}
  >
.....

此外,在Surcharge.js中,在输入值prop处更改以下内容:

<input
    value="0"
.....

到这个

<input
    value={surContext.initialState.cartValue}
.....

相关问题