【问题标题】:Using spread operators for redux in react? Array mapping problems?在反应中使用扩展运算符进行redux?数组映射问题?
【发布时间】:2019-04-11 16:30:48
【问题描述】:

我目前正在修改我对 redux 和 react 的理解。 React 组件正在工作,并且我有一个 knex 数据库设置。我有一个使用以下语法的减速器。

import { FETCH_POSTS, NEW_POST } from '../actions/types';

const initialState = {
  items: [],
  item: {}
}

export default function(state = initialState, action) {
  switch (action.type) {
    case FETCH_POSTS:
        return {
        ...state,
        items: action.payload
    };
      case NEW_POST:
      return {
        ...state,
        item: action.payload
     };
    default:
      return state;
  }
}

这是我得到的一个错误。它似乎不喜欢扩展运算符。

bundle.js:445 Uncaught Error: Module build failed (from ./node_modules/babel-loader/lib/index.js):
SyntaxError: C:/workspace/study-related-projects/apistudy7112018/1.0/client/reducers/postReducer.js: Unexpected token (18:8)

它不喜欢我当前使用的语法,该语法来自 Traversy Media here 的此视频教程。导师实现中间件的方式与我的做法不同,但认为这不是问题。所以为了以防万一,我决定在减速器中像这样推送到 items 数组:

import { FETCH_POSTS, NEW_POST } from '../actions/types';

const initialState = {
  items: [],
  item: {}
}

export default function(state = initialState, action) {
  switch (action.type) {
    case FETCH_POSTS:
      return state.items.push(action.payload)
    default:
      return state;
  }
}

用展开运算符代替返回对象。

然后在react中的componentWillMount()函数中调用dispatch..

结果很好,但是现在映射数组以打印出组件中的数据变得更加困难。

如果我通过控制台记录 this.props.payload.posts,我会收到这些项目,但我不确定我是否可以访问它,因为帖子之后的下一个数组没有名称,只有数字 0。我尝试了 this.props.payload。帖子[0],但这似乎不起作用。这给我使用 map 数组函数映射数据带来了麻烦。

一般来说,如果一切顺利,我就可以使用 mapToProps 函数,那么:

this.props.items.posts.map(post) => {
  return post.name
})

但是我在这两个解决方案中遇到了麻烦。这个问题是因为我试图实现一种不同的使用 redux 的方式,而不是我以前习惯的方式。这都是为了我自己的学习和训练。

谁能帮我理解这两个问题?一个是,javascript 不喜欢我正在使用的扩展运算符语法并吐回该错误。其次,尝试通过 items 数组获取原始数据。 如果有人可以帮助我,我将不胜感激。谢谢。

编辑:我可能会稍微建立一个 git repo,以便每个人都可以看到我正在处理的代码。

【问题讨论】:

  • 您问题中发布的代码不会导致我的构建失败。如何概述您的代码向我表明您正在使用记事本或其他东西来编辑您的代码。也许您可以使用 vscode 之类的东西更容易地发现语法错误。此外,你不应该在你的 reducer 中改变状态,所以你不应该在数组中推送项目。
  • 谢谢。我正在使用vscode,除了reducer,其他一切都在工作。还要感谢您提到不要改变状态,我会记住这一点。我应该提一下,我过去已经设法创建了一个 reducer,但它没有扩展运算符,所以我这次尝试使用扩展运算符。
  • 在您的原始减速器中,您在一种情况下分配给items,在另一种情况下分配给item,这与错误消息相结合,告诉您错误在第18行。我建议您需要在第 18 行使用items。
  • 能否添加 git repo 以便我们查看代码?
  • 你好。我的时间已经不多了,但我仍然打算上传一个精简版,因为这仍在进行中。非常感谢。

标签: javascript reactjs redux


【解决方案1】:

例如,从第一个代码中我冒昧地建议 action.payload 是一个数组,所以在第二种情况下,您需要推送数组的内容

case FETCH_POSTS:
  return state.items.push(...action.payload)

但我也建议不要使用改变状态

【讨论】:

    【解决方案2】:

    假设您使用 Babel 和 webpack 分别对源代码进行转译和捆绑,请务必注意,默认情况下,ES2015 中的扩展运算符不支持对象,仅支持数组;对对象扩展运算符的支持仍然是Stage 3 proposal in TC39。

    要支持对象,您需要使用 Babel 插件 @babel/plugin-proposal-object-rest-spread(适用于 Babel 7)。这应该会处理 Unexpected token 错误。

    对于您使用push 的另一个示例,我建议不要使用改变数组的数组方法。关于pure functions,它违背了 Redux 的三个基本原则之一。你的 reducer 应该是纯粹的,以保持你的状态不可变,因为对你的状态的每次更改(调度的操作)都代表你的状态的快照。

    您可以使用扩展运算符,而不是对数组使用 push:

    return {
      ...state,
      items: [
        ...state.items,
        action.payload,
      ],
    };
    

    (或类似的东西)

    另外注意:不要太长时间依赖componentWillMount();它在 React 16.3 中已被弃用,并将在 React 17 中完全删除。有关更多信息,请参阅https://reactjs.org/docs/react-component.html#unsafe_componentwillmount。如果您通过 AJAX 或其他异步方法获取数据,最好使用componentDidMount()。

    【讨论】:

    • 非常感谢。这解释了很多。最初我之前的代码只有一个数组作为初始状态,并且由于我只遵循上面教程的部分内容,所以我有一个对象作为初始状态,我可能错过了关于 redux 的那方面。我仍然在思考 redux,redux 的原理让我有些摸不着头脑。我的时间不多,但我仍然打算发布更新,向人们展示我的位置。
    • 我目前有一个正常的 get 和 post 使用 redux,然后添加到 db。现在我还有一些关于 db 的其他问题,但我会再等一下。另外,感谢您更新我的反应。很高兴知道。我使用的是旧版本的 react,我相信是的,我会处理新版本的代码,以便保持最新状态。
    猜你喜欢
    • 2020-05-09
    • 2023-01-25
    • 2017-03-16
    • 2018-10-04
    • 2017-09-23
    • 2017-01-11
    • 2020-04-06
    • 1970-01-01
    • 2020-12-20
    相关资源
    最近更新 更多