我尝试使用从String
转换为Number
的变量重新分配targetRow的字段,但Chrome的控制台给了我一些奇怪的输出:
targetRow[fieldName] = Number(value);
console.log(targetRow[fieldName]); // => 12
console.log(targetRow[fieldName]===Number(value)); // => true
console.log(targetRow);
当此对象传递给状态时,其行为类似于字段的值undefined
。
let execPlanTmp = this.state.execPlan.slice();
execPlanTmp[rowIdx] = targetRow;
this.setState({execPlan: execPlanTmp});
console.log(this.state.execPlan);
UPD:
JSON.stringify(targetRow)
返回正确的字符串,该字符串将传递给服务器,但js对象的字段仍被React和Chrome视为未定义。
更新2 这是整个功能:
onCellEdit = (row, fieldName, value) => {
let rowId = this.state.execPlan.indexOf(row);
if (rowId >= 0) {
let execPlanTmp = this.state.execPlan.slice();
execPlanTmp[rowId][fieldName] = Number(value);
this.setState({execPlan: execPlanTmp});
fetch("http://localhost:8080/api", {
method: "PUT",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(execPlanTmp[rowId]),
mode: "cors"
});
}
};
答案 0 :(得分:1)
我曾经遇到过这个问题。这是因为当你执行console.log(someVar)
时,它不是字面意思是“从someVar中创建文本并打印它”,它会向您显示单击折叠时存储在内存中的值({...}
)数组,所以如果在您单击之前值已更改但在console.log()
之后它在控制台中更改。
在控制台中运行下一个代码,您将理解:
var arr = [];
for (var i = 0; i < 1000; i++) {
arr.push({a: i, b: 0});
}
console.log(arr);
console.log(JSON.stringify(arr).substr(0, 700));
for (var j in arr){
arr[j].b=Math.random();
}
输出: the result