Javascript 无法在React中分派两个操作,状态更新不正确
在一个组件中,我试图从两个不同的还原器分派两个不同的操作。他们正在更新我的应用程序中的不同状态。以下是组件的部分代码:Javascript 无法在React中分派两个操作,状态更新不正确,javascript,reactjs,redux,dispatch,Javascript,Reactjs,Redux,Dispatch,在一个组件中,我试图从两个不同的还原器分派两个不同的操作。他们正在更新我的应用程序中的不同状态。以下是组件的部分代码: onSubmit = e => { e.preventDefault() const food = { date: this.state.date, mealCategory: this.state.mealCategory } this.props.a
onSubmit = e => {
e.preventDefault()
const food = {
date: this.state.date,
mealCategory: this.state.mealCategory
}
this.props.addFood(food) //from mapDispatch to props updates the food state, viewing in redux tools shows proper state for food
const meal = this.props.food //comes from mapStateToProps
console.log(meal, 'in form') //logging this shows it's not the updated state I am expecting
this.props.addMeal(meal) //trying to update state from food reducer to the meal reducer, meal reducer is not updated via redux tools
}
.
.
...
const mapDispatchToProps = (dispatch) => ({
addFood: food => dispatch(addFood(food)),
addMeal: meal => dispatch(addMeal(meal))
})
const mapStateToProps = state => ({
food: state.food
})
export default connect(mapStateToProps, mapDispatchToProps)(AddFoodForm)
当我检查redux工具时,我的食物状态显示正确。但是,将该状态添加到我的函数中的fineconst-fine=this.props.food
会显示一个状态,该状态不会随着调用this.props.addFood(food)而更新,该调用会从我的food reducer发送一个操作。我知道更新是异步的。如何正确更新状态
只是为了澄清一下,我的foodReducer负责抓取,并通过表单向foodReducer的状态添加其他属性。一旦按下submit按钮,我就拥有了状态以及我需要的所有属性。我想把最后的状态传给我的米尔斯基特。我不能使用food变量,因为它只是我想要的状态属性的子集。不确定,如果我完全理解你的建议
我的食品制造商案例:
case 'ADD_FOOD':
{
const { date, mealCategory } = action.payload
const itemDetails = {
date,
mealCategory
}
return { ...state, ...itemDetails }
}
const mealReducer = (state = [], action) => {
switch (action.type) {
case 'ADD_MEAL': {
console.log(action.payload);
const meal = action.payload
console.log(meal);
return [...state, meal]
}
default:
return state
}
}
这带来了我想通过mealReducer案例添加的最终状态:
case 'ADD_FOOD':
{
const { date, mealCategory } = action.payload
const itemDetails = {
date,
mealCategory
}
return { ...state, ...itemDetails }
}
const mealReducer = (state = [], action) => {
switch (action.type) {
case 'ADD_MEAL': {
console.log(action.payload);
const meal = action.payload
console.log(meal);
return [...state, meal]
}
default:
return state
}
}
根据你的评论,我想出了一个解决办法。我将addFood操作导入到膳食操作文件中,并使用Thunk获取调用addFood操作的状态
export const addFoodToMeal = (food) => {
return (dispatch, getState) => {
dispatch(addFood(food))
const meal = getState().food
return dispatch(addMeal(meal))
}
}
这回答了你的问题吗?你好,Emile,我怀疑状态是异步更新的,但我不知道如何使用回调调用它,我已经研究了redux thunk以返回一个承诺,但是编写代码使其有意义有点困难。将使用更新的值调用呈现函数,所以你真的不需要在
onSubmit
中担心它。如果确实需要在那里添加一顿饭,直接使用food
变量,但老实说,这应该在商店逻辑中完成。“foodReducer负责抓取”减量器不应该有任何副作用,因此应该转移到商店操作逻辑中。在相同的addFood
操作逻辑中,在发生一些API调用时,在响应成功时,直接从那里调用您的addFood
操作。React组件应该只关心呈现,而不应该实现所有业务逻辑。Redux操作是同步的。如果您想要异步,请使用redux thunk。这个问题非常不清楚,但是如果您希望const-mein=this.props.food
成为this.props.addFood(food)
的结果,则不能在相同的渲染中执行此操作此.props.food
将在下一次渲染中更新。创建一个新的redux操作,将两个操作的逻辑结合起来,这样做更有意义。