在 React 中解构状态/道具

新手上路,请多包涵

我正在学习 React,并且在我的项目中安装了 Eslint。它开始给我错误

Use callback in setState when referencing the previous state. (react/no-access-state-in-setstate)
Must use destructuring state assignment (react/destructuring-assignment)

我试着查了一下,但没能正确理解。

有人能用这个给我指出正确的方向吗?

这是我抛出错误的代码:

 class LoginForm extends React.Component {
  state = {
    data: {
      email: "",
      password: "",
    },
    loading: false,
    errors: {},
  };

  onChange = e =>
    this.setState({
      data: { ...this.state.data, [e.target.name]: e.target.value },
    });

  onSubmit = () => {
    const errors = this.validate(this.state.data);
    this.setState({ errors });

    if (Object.keys(errors).length === 0) {
      this.setState({ loading: true });
      this.props
        .submit(this.state.data)
        .catch(err =>
          this.setState({
            errors: err.response.data.errors,
            loading: false,
          }),
        );
    }
  };
}

据我了解,我需要解构 this.statethis.props 但是怎么做?

编辑:遵循以下建议后,我最终得到了这个。我现在需要修复的只是道具。它要求我使用解构道具分配。

 onChange = ({ target: { name, value } }) =>
    this.setState(prevState => ({
        data: { ...prevState.data, [name]: value }
    }));

onSubmit = () => {
    const { data } = this.state;
    const errors = this.validate(data);
    this.setState({ errors });

    if (Object.keys(errors).length === 0) {
        this.setState({ loading: true });
        this.props
            .submit(data)
            .catch(err =>
                this.setState({ errors: err.response.data.errors, loading: false })
            );
    }
};

在此先感谢您,对于新手问题,我们深表歉意。

原文由 dragi 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 749
2 个回答

eslint 通过 react/destructuring-assignments 告诉你的错误是这样的赋值:

 const data = this.state.data;

可以重写为:

 const { data } = this.state;

这也适用于函数参数,因此:

 onChange = e => { ... }

可以写成

onChange = ({target: {value, name}}) => { ... }

react/no-access-state-in-setstate 的下一个错误告诉您您正在编写:

 this.setState({
    data: { ...this.state.data, [e.target.name]: e.target.value }
});

当你应该写:

 this.setState(prevState => ({
    data: { ...prevState.data, [e.target.name]: e.target.value }
}));

或者,如果将它与 react/destructuring-assignments 规则结合使用:

 onChange = ({target: {name, value}}) =>
    this.setState(prevState => ({
        data: { ...prevState.data, [name]: value }
    }));

您可以在此处阅读有关这两条规则的更多信息:

反应/解构赋值

反应/无访问状态-in-setstate

原文由 Joliver 发布,翻译遵循 CC BY-SA 4.0 许可协议

解构基本上是 语法糖 一些 Eslint 配置更喜欢它(我猜你就是这种情况)。

它基本上是声明值并使它们等于您不想重复的语法位,对于 Ex,给定反应道具:

 this.props.house, this.props.dog, this.props.car

解构—>

  const { house, dog, car } = this.props;

所以现在你可以只使用 house 或 dog 或任何你想要的。 它通常与 react 中的 states 和 props 一起使用,这里有更多关于它的文档,希望它有所帮助。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment

原文由 Kay 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题