在React中破坏状态/道具

dra*_*agi 5 javascript destructuring reactjs eslint

我正在学习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)
Run Code Online (Sandbox Code Playgroud)

我试着查看一下,但无法正确理解.

有人能指出我正确的方向吗?

这是我抛出错误的代码:

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,
          }),
        );
    }
  };
}
Run Code Online (Sandbox Code Playgroud)

据我所知,我需要进行结构化this.state,this.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 })
            );
    }
};
Run Code Online (Sandbox Code Playgroud)

提前致谢并抱歉新手问题.

Jol*_*ver 13

什么eslint告诉你react/destructuring-assignments错误的是,分配如:

const data = this.state.data;
Run Code Online (Sandbox Code Playgroud)

可以改写成:

const { data } = this.state;
Run Code Online (Sandbox Code Playgroud)

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

onChange = e => { ... }
Run Code Online (Sandbox Code Playgroud)

可写成

onChange = ({target: {value, name}}) => { ... }
Run Code Online (Sandbox Code Playgroud)

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

this.setState({
    data: { ...this.state.data, [e.target.name]: e.target.value }
});
Run Code Online (Sandbox Code Playgroud)

什么时候你应该写:

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

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

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

您可以在此处详细了解这两条规则:

反应/解构赋值

反应/无存取状态中,setstate这


Kay*_*Kay 5

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

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

this.props.house, this.props.dog, this.props.car
Run Code Online (Sandbox Code Playgroud)

解构--->

 const { house, dog, car } = this.props;
Run Code Online (Sandbox Code Playgroud)

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