React native 无法在Redux中访问切片的初始状态,因此我不得不求助于手动设置状态属性

React native 无法在Redux中访问切片的初始状态,因此我不得不求助于手动设置状态属性,react-native,redux,react-redux,React Native,Redux,React Redux,我有一个名为modal的片段,它负责使用动作showModal和hideModal显示和隐藏一个modal 下面是它的外观: export const modal = createSlice({ slice: "modal", initialState: { visible: false, selectedExpenseId: null }, reducers:{ showModal: (state, { payload }) =>

我有一个名为modal的片段,它负责使用动作showModal和hideModal显示和隐藏一个modal

下面是它的外观:

    export const modal = createSlice({
  slice: "modal",
  initialState: {
      visible: false,
      selectedExpenseId: null
  },
  reducers:{
    showModal: (state, { payload }) => (
      state = {
        visible: true,
        selectedExpenseId: payload
      }
    ), 
    hideModal: (state, {payload}) => (state = state.initialState) 
    //hideModal: (state, {payload}) => (state = {visible: false, selectedExpenseId: null}) 

  }
});
showModal按预期工作,但当我调用Hidemoal时,什么也没有发生,因为我似乎无法以这种方式访问initialState。 当我求助于注释掉的行,该行以预期的方式手动分配值时,它起作用了

我想知道我做错了什么,因为我显然更愿意正确地访问initialState。我是新的反应和重复,所以我肯定我可能只是错过了一些明显的东西


干杯。

Redux文档中没有提到您将收到一个名为initialState的状态属性,该属性将包含初始状态

Redux不会自行填充state对象中的任何属性,除非您在Reducer中或通过initialState进行填充。 您可以通过多种方式实现您在问题1中提到的期望行为。 如果您想通过initialState访问它,则可以遵循以下逻辑:

const initialState = {
  visible: false,
  selectedExpenseId: null
};
export const modal = createSlice({
  slice: "modal",
  initialState: {...initialState},
  reducers:{
    showModal: (state, { payload }) => (
      state = {
        visible: true,
        selectedExpenseId: payload
      }
    ), 
    hideModal: (state, {payload}) => (state = {...initialState}) 
  }
});

我们使用了扩展符号三点{…}来避免原始initialState对象的突变。

您的两个还原符当前都是错误的。您看到showModal的正确行为只是偶然的

看起来您正在使用Redux初学者工具包。由于它在内部使用Immer,因此有两种方法可以更新状态:

改变状态值内的内容 自己创建一个新的不可变更新值,并返回它。 你的两个减速机实际上都做得不对

Assigning state=reducer中的某些内容不会改变state的内容,也不会返回新值。相反,它只是更改此函数中的局部变量状态所指向的对象

此外,没有state.initialState字段

如果showModal正在工作,这只是偶然的,可能是因为赋值语句也隐式返回赋值结果

你应该这样做:

常量初始状态={ 可见:假, selectedExpenseId:null }; export const modal=createSlice{ 切片:模态, 初始状态, 减速器:{ showModalstate,{payload}{ 返回{visible:true,selectedExpenseId:payload}; }, 隐藏状态{ 返回初始状态; } } }; 请注意,您还可以编写类似以下内容的减缩器:

showModalstate,{payload}{ state.visible=true; state.selectedExpenseId=有效载荷; }
资料来源:我是一名Redux维护人员,我编写了Redux初学者工具包。

谢谢你,马克!您的回答@markerikson的后续问题是:在本例中,您会选择两种方法中的哪一种?为什么?鉴于您在状态中只有两个字段,并且隐藏案例涉及重置它,我可能会选择返回新对象方法。如果状态更大,那么直接更新它的时间就会更短。这不是偶然的状态=something,这是javascript多左手赋值的一个特性是的,我知道它的语法是有效的。然而,从OP的观点来看,这是一个意外,因为这是对伊默如何工作的误解。如果不是因为他们使用带有隐式返回的arrow函数,state=函数体中的某些内容将不会起任何作用。