javascript - 将 onChange 事件从映射的子级传递到父级的状态会返回“未定义”错误
问题描述
你好[来自反应初学者]。试图将孩子的输入值传递给父状态。
所以,App 有一个数组:
export default class App extends React.Component {
state = {
data: [
{id: 1, name: 'john'},
{id: 2, name: 'doe'},
]
}
render() {
return (
<List data={this.state.data}/>
)
}
}
然后 List 将 prop.data 作为 state.data 并在 map 中返回子项:
class List extends React.Component {
constructor(props) {
super(props);
this.state = {
data: this.props.data
};
this.parentChange = this.parentChange.bind(this);
}
renderList() {
const data = this.state.data;
let list = null;
if (data.length) {
list = data.map(function(item, index){
return (<Item key={item.id} data={item} onChange={(e, index) => this.parentChange(e, index)} />)
});
} else {
list = <p>nothing here</p>
}
return list;
}
parentChange(value, index) {
// pls give me anything
console.log('--- value: ', value);
console.log('--- index: ', index);
}
render() {
return (
<div>{this.renderList()}</div>
)
}
}
和项目孩子:
class Item extends React.Component {
render() {
const {id, name} = this.props.data;
return (
<div>
<input id={id} value={name} onChange={(e) => this.props.onChange(e, id)} />
</div>
)
}
}
但是,如果我更改任何输入的值,则会出现错误
Cannot read property 'parentChange' of undefined
感谢您的任何帮助(代码、链接等)
解决方案
您正在使用function关键字声明一个函数:
if (data.length) {
list = data.map(function(item, index){
return (<Item key={item.id} data={item} onChange={(e, index) =>
this.parentChange(e, index)} />)
});
}
使用function关键字声明函数将在其内部创建另一个上下文,因此您的this(上下文)将不再是类上下文。
IDE 可能不会警告您,但是当它运行时,JS 在您的函数内创建另一个上下文会导致未定义的错误。
所以需要改成:
if (data.length) {
list = data.map((item, index) => {
return (<Item key={item.id} data={item} onChange={(e, index) =>
this.parentChange(e, index)} />)
});
}
推荐阅读
- c# - 如何向 EF 核心中的现有数据添加新的外键属性?
- python - 出现错误 AttributeError: 'bool' 对象在尝试拟合机器学习模型时没有属性 'transpose'
- android - 无论设备在空间中的方向如何,如何计算设备的垂直运动?
- python - 如何在 Django v3 中测试相关模型
- ubuntu - taskserver:客户端连接握手失败
- javascript - 从用户输入中获取数字:提交时字符串为空?
- php - 字符编码错误 UTF-8 到 ISO 8859-1
- git - 如何在 git 中提交
- c - 如何在一个索引处将数组中的特定值设置为等于 C 中不同索引处另一个数组中的值
- laravel - 为什么 axios 不能从服务器响应中捕获错误?