为什么console.log未返回预期值1?JS日志输出异常排查
问题描述
数据库中已将1名用户设置为banned(封禁)状态,但代码执行时console.log并未打印出预期值1,输出为空;即便banned对应值为0时,输出结果依旧为空。
相关实现代码
for (const dataItem of res.data.data) { var IsBanned = 0 ; if(dataItem.banned === true){ this.setState({IsBanned: this.state.count +1}) console.log("Local", IsBanned); } }
排查解决建议
- 优先排查字段类型匹配问题:当前判断条件用了严格相等
=== true,绝大多数场景下数据库返回的banned字段是数字类型的1/0,不是布尔类型的true/false,类型不匹配会导致判断永远不成立,自然不会进入分支执行打印。可以先在循环起始位置加console.log(dataItem.banned, typeof dataItem.banned),确认接口返回的banned字段实际值和对应类型,再把判断条件调整为匹配实际类型的写法,比如返回数字1代表封禁的话,判断条件改为if(dataItem.banned === 1)即可。 - 修正变量作用域与逻辑错位问题:当前代码在循环内部每次迭代都会重新用
var声明局部变量IsBanned并赋值为0,哪怕进入if分支,打印的也是这个局部变量的初始值0,根本无法得到统计后的封禁用户数;另外setState中累加的是this.state.count,和要统计的封禁用户数IsBanned是完全无关的两个变量,逻辑完全不对应。 - 调整状态更新逻辑:不要在循环内部反复调用
setState,会触发多次不必要的重渲染,正确做法是先遍历完所有数据计算出最终的封禁用户总数,再一次性调用setState更新状态,参考修正代码:
// 遍历统计封禁用户总数 let bannedTotal = 0 for (const dataItem of res.data.data) { // 注意替换为匹配接口实际返回类型的判断条件 if (dataItem.banned === 1) { bannedTotal++ } } // 统计完成后一次性更新状态 this.setState({ IsBanned: bannedTotal }) console.log("Local 封禁用户数", bannedTotal)
- 注意
setState异步特性:setState本身是异步执行的,如果在调用setState之后立刻读取this.state.IsBanned,拿到的会是更新前的旧值,需要拿到更新后状态值的话,要把逻辑写在setState的第二个回调参数里,写法参考:
this.setState({ IsBanned: bannedTotal }, () => { console.log("状态更新完成后的IsBanned值", this.state.IsBanned) })
内容的提问来源于stack exchange,提问作者deluez01
相关产品推荐
相关产品推荐

