javascript - 数组类型变量在 setState 上更改为字符串
问题描述
如何让状态和数组始终如一地工作?
结果如此混乱和不一致。
这是状态:
this.state = {
tutorSubjects: [],
};
这是设置状态;第一个 console.log 将主题记录在一个数组中,第二个日志和空数组:
const name = target.name;
if (name === "tutorSubjects") {
let subjects = this.state.tutorSubjects.concat(value);
console.log(subjects)
this.setState({
tutorSubjects: subjects
}, console.log(this.state.tutorSubjects))
}
这将提交和记录主题作为没有数组的字符串:
handleSubmit = e => {
console.log(this.state.tutorSubjects)
}
我的主要目标是向服务器发送一个数组,现在它正在发送一个字符串。
我不知道为什么,但是现在我已经将状态更改为subjects
并更新了如下状态,它可以完美运行。
if (name === "tutorSubjects") {
let subjects = this.state.subjects.concat(value);
console.log(subjects)
this.setState({
subjects
}, console.log(this.state.subjects))
}
解决方案
回调参数setState
应该是一个回调函数,但您没有以这种方式提供它,而是您立即评估并在被调用之前console.log(...)
显示它。 setState
通过确保它在以下之后运行来修复它:
this.setState({ subjects }, () => console.log(this.state.subjects));
您的原始代码大致相当于:
let v = console.log(this.state.subjects);
this.setState({ subjects }, v);
当以这种方式表达时,显然这是不正常的。
推荐阅读
- python-3.x - Django 动态模型抛出编程错误
- c - 使用 for 循环的数组输入
- c++ - Tic-Tac-Toe 的 Minimax 实现有什么问题?
- node.js - 错误:npm install 错误“没有适用于 dateFormat 的有效版本”?
- vim - 是否可以在不将文字控制字符输入源代码的情况下表达 Control-V 进行比较?
- javascript - 防止输入双字节字符
- google-chrome - 每次在谷歌搜索时打开不同的网站
- react-native - 使用 await/asnc 时,我的按钮不会重新渲染
- django - 我试图实现一个将 +1 添加到特定整数字段的更新视图。在视图函数中,出现了一个未定义的错误
- html - 为什么水平调整屏幕大小时上/下边距设置为 % 变化?