每次使用 redux 在反应中分派动作时,状态是否会重新初始化为初始状态?
Does state reinitialize to initial state everytime an action is dispatched in react using redux?
例如在下面的代码中(注意:这段代码没有什么特别的,只是作为一个例子):
const INITIAL_STATE = {
hidden: true,
cartItems: []
};
const cartReducer = (state = INITIAL_STATE, action) => {
switch (action.type) {
case CartActionTypes.TOGGLE_CART_HIDDEN:
return {
...state,
hidden: !state.hidden
};
case CartActionTypes.ADD_ITEM:
return {
...state,
cartItems: addItemToCart(state.cartItems, action.payload)
};
case CartActionTypes.REMOVE_ITEM:
return {
...state,
cartItems: removeItemFromCart(state.cartItems, action.payload)
};
case CartActionTypes.CLEAR_ITEM_FROM_CART:
return {
...state,
cartItems: state.cartItems.filter(
cartItem => cartItem.id !== action.payload.id
)
};
default:
return state;
}
};
Q1:状态是否恢复到 INITIAL_STATE 即
{
hidden: true,
cartItems: []
};
每次向这个减速器发送一个动作?
Q2:那么combinereducer中的状态也会重新初始化为初始状态,也就是说reducer中返回了默认状态?或者换句话说:
Q3:combinereducer 中与特定 reducer 对应的状态不断 reinitialized/set 到最近调度的 action 定义的状态,例如在上面的代码中,if CartActionTypes.ADD_ITEM 是最近发送给 reducer 的 action
case CartActionTypes.ADD_ITEM:
return {
...state,
cartItems: addItemToCart(state.cartItems, action.payload)
};
那么 combinereducer 中的状态将是(基于上述情况):
{
hidden: true,
cartItems: addItemToCart(state.cartItems, action.payload)
};
并且 hidden 将被重新初始化为 true,而不管它的值可能由于较早的调度操作而处于什么状态?所以基本上最新的动作决定了哪些当前状态值将被改变,而不管之前的动作是否被调度,并且最新的动作没有改变的状态值被重新初始化到初始状态?
问:如果我的理解是正确的,那么 React 中调用状态值的各种组件(例如使用 mapStatetoProps)是否只能访问最新调度定义的状态值?
当你调度一个动作时,它将被发送到减速器以根据当前状态和动作计算下一个状态已派出。
现在您的函数 cartReducer
接受 2 个参数,state
和 action
。您实际上是在告诉 reducer 函数,如果未提供状态,则使用 INITIAL_STATE
。所以当你的 reducer 函数执行时,它会查看 state 的值是否为 undefined
。如果是这样,它将使用 INITIAL_STATE
否则它将使用提供的状态值,即您的当前状态。
您可以在 JavaScript here. You can go over the redux core principles here
中查看更多关于默认参数的信息
例如在下面的代码中(注意:这段代码没有什么特别的,只是作为一个例子):
const INITIAL_STATE = {
hidden: true,
cartItems: []
};
const cartReducer = (state = INITIAL_STATE, action) => {
switch (action.type) {
case CartActionTypes.TOGGLE_CART_HIDDEN:
return {
...state,
hidden: !state.hidden
};
case CartActionTypes.ADD_ITEM:
return {
...state,
cartItems: addItemToCart(state.cartItems, action.payload)
};
case CartActionTypes.REMOVE_ITEM:
return {
...state,
cartItems: removeItemFromCart(state.cartItems, action.payload)
};
case CartActionTypes.CLEAR_ITEM_FROM_CART:
return {
...state,
cartItems: state.cartItems.filter(
cartItem => cartItem.id !== action.payload.id
)
};
default:
return state;
}
};
Q1:状态是否恢复到 INITIAL_STATE 即
{
hidden: true,
cartItems: []
};
每次向这个减速器发送一个动作?
Q2:那么combinereducer中的状态也会重新初始化为初始状态,也就是说reducer中返回了默认状态?或者换句话说: Q3:combinereducer 中与特定 reducer 对应的状态不断 reinitialized/set 到最近调度的 action 定义的状态,例如在上面的代码中,if CartActionTypes.ADD_ITEM 是最近发送给 reducer 的 action
case CartActionTypes.ADD_ITEM:
return {
...state,
cartItems: addItemToCart(state.cartItems, action.payload)
};
那么 combinereducer 中的状态将是(基于上述情况):
{
hidden: true,
cartItems: addItemToCart(state.cartItems, action.payload)
};
并且 hidden 将被重新初始化为 true,而不管它的值可能由于较早的调度操作而处于什么状态?所以基本上最新的动作决定了哪些当前状态值将被改变,而不管之前的动作是否被调度,并且最新的动作没有改变的状态值被重新初始化到初始状态?
问:如果我的理解是正确的,那么 React 中调用状态值的各种组件(例如使用 mapStatetoProps)是否只能访问最新调度定义的状态值?
当你调度一个动作时,它将被发送到减速器以根据当前状态和动作计算下一个状态已派出。
现在您的函数 cartReducer
接受 2 个参数,state
和 action
。您实际上是在告诉 reducer 函数,如果未提供状态,则使用 INITIAL_STATE
。所以当你的 reducer 函数执行时,它会查看 state 的值是否为 undefined
。如果是这样,它将使用 INITIAL_STATE
否则它将使用提供的状态值,即您的当前状态。
您可以在 JavaScript here. You can go over the redux core principles here
中查看更多关于默认参数的信息