reactjs - TypeError:无法读取未定义的属性“nam”
问题描述
我正在寻找有关 React 问题的答案。单击复选框时出现此错误:
TypeError: Cannot read property 'nam' of undefined
Checkbox._this.change
:42
39 | let na=[event.target.name]
40 | for(let i=0; i<=this.state.data.length;i++){
41 |
> 42 | if(na==this.state.data[i].nam){
| ^ 43 |
44 | this.setState({
45 | [this.state.data[i].che]:!this.state.data[i].che
我有三个组件:
- 应用程序
- 复选框
- 查看
这是“检查”组件的代码:
import React from 'react'
class Check extends React.Component {
constructor(props) {
super(props)
}
render() {
return (
<div>
{this.props.name}<input type="checkbox" checked={this.props.checked}
onChange={this.props.onChange} name={this.props.name} /><br />
</div>
)
}
}
export default Check;
这是 Checkbox 组件的代码:
import React from 'react';
import Check from './Check.js';
class Checkbox extends React.Component {
constructor(props) {
super(props)
this.state = {
data: [{
nam: "jill",
che: false
},
{
nam: "jon",
che: false
}
]
}
console.log(this.state.data)
this.change = this.change.bind(this);
let d = this.state.data
}
change = (event) => {
let na = [event.target.name]
for (let i = 0; i <= this.state.data.length; i++) {
if (na == this.state.data[i].nam) {
this.setState({
[this.state.data[i].che]: !this.state.data[i].che
})
}
console.log(na)
console.log(event.target.checked)
}
}
render() {
let d = [{}];
d = this.state.data;
console.log(this.state.data)
// console.log(this.listar(d))
return (
<div className="prova">
{this.state.data.map(v => {
return (
<Check name={v.nam} checked={v.che} onChange={this.change} />
)
})}
</div>
)
}
}
解决方案
请在检查长度时尝试仅使用“小于”运算符,如下所示
for(let i=0; i < this.state.data.length;i++)
问题应该与 for 循环中的条件有关。
for(let i=0; i<=this.state.data.length;i++)
在这里,循环代码即使在 时也会被执行i = 2
,在你的情况下这是数组的长度,但是由于数组索引是0
基于的,所以
this.state.data[2] = undefined
因此,当我们尝试访问其中的“nam”属性时,我们会收到上述错误,因为我们基本上是在尝试nam
在undefined
.
我希望这有帮助。
推荐阅读
- c# - 如何在 C# 中以编程方式确定 Windows 7 的子版本?
- python - manage.py runserver后如何自动执行代码
- android - 尝试将 Content Uri 从活动传递到服务时出现权限错误
- macos - 子目录项目的 Composer 卸载 (Mac)
- excel - Excel VBA 中有没有办法检查一个工作簿中的数字序列,找到最后一个,然后在另一个工作簿中继续?
- node.js - 一段时间后,Socket io 连接断开
- c# - 如何访问从asp.net核心中的jquery文件上传发送的附加表单数据?
- r - 如何在 R 中重现以下涉及 for 循环的 matlab 代码?
- php - 过滤 Laravel 资源集合有没有更好的方法
- cordova - 如何修复 Phonegap 中的“FCMPlugin Ready ERROR”?