在 React 中解构 state/props
Destructuring state/props in 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.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 })
);
}
};
提前致谢,抱歉新手问题。
这是您的 onChange
方法的问题。尝试这样的事情:
onChange = e =>
this.setState(prevState => ({
data: { ...prevState.data, [e.target.name]: e.target.value }
}));
中的 "State Updates May Be Asynchronous" 部分
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 }
}));
您可以在此处详细了解这两条规则:
解构基本上是语法糖一些 Eslint 配置更喜欢它(我猜你就是这种情况)。
它基本上是声明值并使它们等于您不想重复的语法位,对于 Ex,给定反应道具:
this.props.house, this.props.dog, this.props.car
解构--->
const { house, dog, car } = this.props;
所以现在您可以只使用房子、狗或任何您想要的东西。
在 React 中它通常与状态和道具一起使用,这里有更多关于它的文档,希望对您有所帮助。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment
我正在学习 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 })
);
}
};
提前致谢,抱歉新手问题。
这是您的 onChange
方法的问题。尝试这样的事情:
onChange = e =>
this.setState(prevState => ({
data: { ...prevState.data, [e.target.name]: e.target.value }
}));
中的 "State Updates May Be Asynchronous" 部分
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 }
}));
您可以在此处详细了解这两条规则:
解构基本上是语法糖一些 Eslint 配置更喜欢它(我猜你就是这种情况)。
它基本上是声明值并使它们等于您不想重复的语法位,对于 Ex,给定反应道具:
this.props.house, this.props.dog, this.props.car
解构--->
const { house, dog, car } = this.props;
所以现在您可以只使用房子、狗或任何您想要的东西。 在 React 中它通常与状态和道具一起使用,这里有更多关于它的文档,希望对您有所帮助。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment