【问题标题】:Reducer doesn´t bring initialStateReducer 不带初始状态
【发布时间】:2021-02-09 04:56:56
【问题描述】:

我正在使用 reducer 来管理我的应用程序的各种状态。但是每次我在初始状态中添加一个新键时,就像这样:

const initialState = {
  loading: false,
  archiveTypes: [],
  archiveType: {
    id: null,
    name: '',
    local: '',
    description: '',
  }
}

在我向 reducer 发送一些信息之前,initialState 永远不会显示新信息。

有没有办法让它从所有信息开始?

我的完整代码:

import * as actionTypes from 'actions';
import produce from 'immer';

const initialState = {
  loading: false,
  archiveTypes: [],
  archiveType: {
    id: null,
    name: '',
    local: '',
    description: '',
  }
}

const archiveTypeReducer = produce((draft, action) => {

  switch (action.type) {

    case actionTypes.ARCHIVE_TYPE_GET_ALL_SUCCESS: {
      draft.loading = false;
      try {
        draft.archiveTypes = action.payload
      } catch (err) {
        console.log(`REDUCER ERROR ${err}`)
      }
      return draft;
    }

    case actionTypes.ARCHIVE_TYPE_GET_BY_ID_SUCCESS: {
      draft.loading = false;
      try {
        draft.archiveType = action.payload
      } catch (err) {
        console.log(`REDUCER ERROR ${err}`)
      }
      return draft;
    }

    case actionTypes.ARCHIVE_TYPE_REQUEST_FAILURE: {
      draft = initialState
      return draft
    }

    default: {
      return draft;
    }
  }
}, initialState);

export default archiveTypeReducer;

【问题讨论】:

    标签: javascript reactjs react-redux


    【解决方案1】:

    比如可以在组件活圈的方法中调用action,比如componentDidMount。或者react hooks,useEffect https://reactjs.org/docs/react-component.html#componentdidmount

    【讨论】:

    • 调用调度?
    • 是的。例如,您有这样的 mapDispatchToProps:setFoo: dispatch({ type: 'SET_FOO' })。如果你使用类组件,请将 setFoo() 放入 componentDidMount。它会在组件挂载时调用您的操作,这意味着组件会显示在视图屏幕中。
    • 是的,在某些页面中我使用了这些技术,但是我需要在没有调度的情况下获得初始状态。就用reducer,有可能吗?
    【解决方案2】:

    在 Redux 应用程序中,您的初始状态正是:您的 initial 状态。如果您想在页面加载后更改您的状态,您必须发送一个操作来执行此操作。

    如果您想要一种方法来完全重置您的状态,那么您需要创建一个 RESET_ALL_STATE 操作(或者在您的情况下,您的 actionTypes.ARCHIVE_TYPE_REQUEST_FAILURE 似乎恢复了初始状态)。但这真的很不正常。通常你只想使用ADD_SPECIFIC_DATA 操作。

    【讨论】:

    • 是的,但是我正在向 initalState 添加字段,但它们没有出现
    • 当你说“添加字段”时,你到底是什么意思?喜欢...initialState.foo = 1?
    • 不,它会像这样向 initialState 添加一个字段:之前:initialState={ a: [], b: [] } 之后:initialState = { a: [], b: [], c: [] }
    • 也就是说,您不是在做initialState.c = [],而是在更改Javascript 代码并刷新页面?在这种情况下,NOTHING 应该保留以前版本的initialState。当浏览器刷新时,它应该以完全干净的initialState 开头,基于您的文件的最新版本。旧版本可以保留的唯一方法(我能想到的)是如果您在使用 Create React App/Webpack 时遇到某种缓存问题,并且它不会在生成新文件时清除旧文件。
    • 也许这就是问题所在。你知道我该如何检查吗?为了获得新的初始状态,我不可能发出调度请求吗?
    【解决方案3】:

    还有一件事,您忘记将 initiasState 设置为默认状态(草稿)。 生产((草稿=初始状态,动作)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-02
      • 2019-05-28
      • 1970-01-01
      • 2019-11-22
      • 2016-02-18
      • 1970-01-01
      相关资源
      最近更新 更多