【问题标题】:React useSelector first returns undefined, then returns objectReact useSelector 先返回 undefined,再返回 object
【发布时间】:2019-11-25 19:56:45
【问题描述】:

我正在尝试从状态中提取数据。我正在使用 redux。

const {currentPost } = useSelector(state => state.posts)

我希望得到一个具有属性的对象。相反,我得到了几个未定义的,然后我得到了一个对象。 开始时这些未定义导致我无法像const {currentPost: {id} } = useSelector(state => state.posts) 那样进一步解构,并返回无法读取未定义属性的错误。 这些帖子是通过API获取的。

我试图通过使用一个函数来解决这个问题,该函数检查这个currentPost 是否未定义,然后将 null 传递给这些属性。但是它不适合项目,而且这种解决方案容易出错。

【问题讨论】:

  • useSelector(state => state ? state.posts : {})?
  • 问题是我必须从中获取一些属性才能在组件中创建一些逻辑
  • state.posts是在申请开始后填写的吗?如果它在启动时存在,那么useSelector 应该立即返回那里的任何内容。
  • 但是创建一个单独的选择器函数并检查 state.posts 是否存在有什么问题?它必须是一个班轮吗?
  • @ArcMech 如果 state.posts.currentPost 仅在调用了一些 api 后可用,则需要在 reducer 中使用 null(不是 undefined)或 {} 对其进行初始化。在 react 组件中,您需要编写条件来检查 currentPost 何时可用,然后才能进一步解构并渲染内容。这在 react/redux 应用中很常见。

标签: javascript reactjs redux react-redux


【解决方案1】:

随着我获得更多经验,我想为未来的年轻前端开发人员分享我的知识

我正在使用redux-toolkit https://redux-toolkit.js.org/ 这些未定义的值来自异步操作,因此它们的行为有时在承诺完成之前返回未定义的值。

要克服它并编写稳定的代码,需要添加默认值。在 redux-toolkit 中你可以使用

const slice = createSlice({
  name: 'posts',
  initialState: {
    currentPosts: {
      value: {
        name: ''
      }
    },
    posts: []
  },
  reducers: {
    ...reducers
    },
})

在这种情况下,您将获得 Object currentPosts,它不是未定义的。

【讨论】:

  • 您好@ArcMech,晚了一年多,但我似乎无法找到解决方案的方法。你介意看看吗?我正在使用传统的 Redux。 stackoverflow.com/questions/68018044/…
  • 当然@domster 但链接已过期/已删除。您的问题仍然有效吗?
  • 谢谢!我找到了解决方法!太感谢了! :)
猜你喜欢
  • 1970-01-01
  • 2022-01-01
  • 2016-09-13
  • 2020-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多