代码之家  ›  专栏  ›  技术社区  ›  dragi

破坏状态/反应中的道具

  •  1
  • dragi  · 技术社区  · 6 年前

    我正在学习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.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 })
                );
        }
    };
    

    事先谢谢,对新来的问题很抱歉。

    3 回复  |  直到 6 年前
        1
  •  6
  •   Joliver    6 年前

    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 }
    }));
    

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

    react/destructuring-assignment

    react/no-access-state-in-setstate

        2
  •  1
  •   Kay    6 年前

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

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

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment

        3
  •  0
  •   Maciej Wojsław    6 年前

    onChange

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

    https://reactjs.org/docs/state-and-lifecycle.html