javascript - JSON在反应中没有正确处理并且没有保存在状态中
问题描述
我在获取 JSON 数据时遇到问题。
有问题的代码是:
constructor(props, context) {
super(props);
this.state = {anchorEl: null,
showJoin: false,
classDetailsInfo: {
classpic: [],
reviews: []
},
onError: false
}
};
componentDidMount = () => {
const queryString = window.location.search;
const urlParams = new URLSearchParams(queryString);
const id = urlParams.get('id')
console.log("this is my id: " + id)
if(urlParams.has('id') && (id !== '')) {
this.setState({userInfo: ClassDataUseCase.getClassDetails(id)})
this.setState({onError: false})
console.log(this.state.userInfo)
} else {
this.setState({onError: true})
}
}
这ClassDataUseCase
只是一个“获取正确数据的抽象层。
class ClassDataUseCase {
static getClassDetails(id) {
var jsonClasses = JSON.parse(JSON.stringify(ClassDetailsData.Classes));
console.log(jsonClasses)
for(let k=0;k< jsonClasses.length;k++){
if(jsonClasses[k].id === id){
console.log(jsonClasses[k])
return jsonClasses[k];
}
}
console.log("We are f***ed up")
}
}
JSON 已正确返回,但是当我尝试检查 的内容时this.state.classDetailsInfo
,我刚刚进入undefined
控制台。起初我以为我必须通过a JSON.parse
,但它也失败了。
我可能没有在该州正确保存它。
解决方案
正如@k-wasilewski 在评论中指出的那样,您正在设置状态userInfo
,而不是classDetailsInfo
。因此,根据这是否只是您问题中的错字,它可能会解释您要解决的问题。
但是,如果您实际上是在尝试检查 的值userInfo
,则这些行可能存在问题:
this.setState({userInfo: ClassDataUseCase.getClassDetails(id)})
this.setState({onError: false})
console.log(this.state.userInfo)
setState
更改可能不会立即应用,因此可能console.log
在 setState 完成之前被调用。您可以传递一个回调来setState
保证执行顺序:
this.setState({userInfo: ClassDataUseCase.getClassDetails(id)}, () => console.log('updated userInfo:', this.state.userInfo))
推荐阅读
- firebase - 如何乘以 Cloud Functions 超时时间?
- python - 在 Trimesh 中旋转网格
- android - 渲染像素流错误即将到来。但我的应用程序在颤振中运行良好
- javascript - 使用 if else 状态创建显示可用性的服务
- vb.net - 创建一个事件。此事件应在某个字符串已更改时发生
- javascript - 在javascript中获取文件夹大小
- c# - 使用 write XML 创建 XML 文件并将数据集写入其中
- php - 我无法回显 PHP cURL 响应的第一个索引
- php - 使用标头位置时获取 HTTP ERROR 500
- regex - 如何借助正则表达式在电子邮件中获取特定单词并使用 Outlook VBA 将该单词插入文件名中?