1

我正在尝试从我在 Medium 上学到的关于 Redux 的简单示例转变为使用 object.assign 或扩展运算符正确修改不可变状态。但是,在我尝试过之后,它会在原始状态键中创建一个具有相同名称的键。Fe 我有一个状态键searchPage: 1,在转换减速器后我得到了searchPage: {searchPage: 1}. 我打赌这很愚蠢,但我是根据 Redux 文档(我只是假设)这样做的。我已经尝试过 object.assign 和 spread 运算符,它们具有相同的结果。这是我的旧减速器:

export function searchPage(state = 1, action) {
  switch (action.type) {
    case 'SET_SEARCH_PAGE':
      return action.searchPage

    default:
      return state
  }
}

以及带有扩展运算符的新功能:

export function searchPage(state = 1, action) {
  switch (action.type) {
    case 'SET_SEARCH_PAGE':
      return { ...state, searchPage: action.searchPage }

    default:
      return state
  }
}

更新现在,我使用 initialState 对象将所有 reducer 的初始状态设置为默认对象。但是,扩展运算符语法现在与以前完全相同,即在 searchPage 键中插入初始状态键,因此我仍然在我的 searchPage 键中使用对象而不是数字。这是更新的代码,我不知道我是否朝着正确的方向前进:

const initialState = {
  posts: [],
  postsHasErrored: false,
  postsIsLoading: false,
  searchString: '',
  searchCategories: [],
  searchPage: 10
}

export function searchString(state = initialState.searchString, action) {
  console.log(state)
  switch (action.type) {
    case 'SET_SEARCH_STRING':
      return action.searchString

    default:
      return state
  }
}

export function searchCategories(state = initialState.searchCategories, action) {
  switch (action.type) {
    case 'SET_SEARCH_CATEGORIES':
      return action.searchCategories

    default:
      return state
  }
}

export function searchPage(state = initialState.searchPage, action) {
  switch (action.type) {
    case 'SET_SEARCH_PAGE':
      return { ...state, searchPage: action.searchPage }

    default:
      return state
  }
}
4

3 回答 3

1

刚刚得到这个老问题的更新。现在,当我看它时,它是显而易见的。在 reducer 中,初始化state = initialState.searchPage时应该只是state = initialState,整个 reducer 应该只是一个函数,这样我就可以利用 switch 语句的用例。

于 2018-12-03T12:51:34.863 回答
0

这取决于你的action.searchPage价值。我认为这是一个对象。一旦通过调试action对象。

试试这样

export function searchPage(state = {}, action) {
  switch (action.type) {
    case 'SET_SEARCH_PAGE':
      return { ...state, searchPage: action.searchPage };

    default:
      return state
  }
}
于 2017-07-24T07:16:51.143 回答
0

我也有这个问题。通过在线研究,我看到有人说您只需要在操作中初始化您的状态为空,虽然这在我只使用状态中的一个项目时帮助了我,但当我需要两个时它就走下坡路了。

这个新错误发生在我自己的组件文件中,位于mapStateToProps. 因为这行得通...

const mapStateToProps = state => (
   state.posts
);

但这并不...

const mapStateToProps = state => (
   state.posts, state.comments
);

所以我最终会写...

const mapStateToProps = state => ({
   posts: state.posts,
   comments: state.comments
});

这将重复键名,导致数组为posts.posts 和comments.comments。在尝试了许多不同的语法之后,我终于找到了有效的方法:

function mapStateToProps(state){
  const { posts } = state.posts
  const { comments } = state.comments
  return { posts, comments}
}

希望它可以帮助某人!

于 2018-11-10T11:33:09.923 回答