反应:无法访问父级事件处理程序中的子道具
React: Unable to access child props in parent's event handler
我正在使用 React 创建一个 UI,我有一个父组件和一个子组件,大致如下:
// Child component
var ListItem = React.createClass({
render: function() {
var link_details = (
<div>
Start Date: {this.props.my_data.start_date}<br/>
End Date: {this.props.my_data.end_date}<br/>
</div>
);
return (
<li>
<a onClick={this.props.clickHandler}>
{ this.props.my_data.name }
</a>
{link_details}
</li>
)
}
});
// Parent component
var Sidebar = React.createClass({
getInitialState: function() {
return {
my_data: [],
};
},
handleListItemClick: function(e){
console.log(e.target);
console.log(e.target.props);
},
render: function() {
var myLinks = this.state.my_data.map(function(mylink) {
return (
<ListItem key={mylink.id} my_data={mylink} clickHandler={this.handleListItemClick} />
);
}.bind(this));
return (
<div>
<ul className="nav nav-sidebar">
{ myLinks }
</ul>
</div>)
}
});
我希望子项上的单击事件触发父项的处理程序,以便父项可以根据子项中单击的内容更新其状态。虽然我上面的代码有效,并且调用了父组件的处理程序,但我无法访问子组件的任何 props。我不确定这是否是设计使然,我应该以不同的方式将数据从孩子传递给父母,或者我是否做错了什么。我对 React 还很陌生,所以任何建议都值得赞赏。谢谢!
你不能这样做,但你可以通过回调将数据从子级传递到父级
<li>
<a onClick={this.props.clickHandler.bind(null,this.props.my_data.name)}>
{ this.props.my_data.name }
</a>
{link_details}
</li>
如果您使用的是 es6,则使用箭头功能
<li>
<a onClick={() => this.props.clickHandler(this.props.my_data.name)}>
{ this.props.my_data.name }
</a>
{link_details}
</li>
编辑
为什么要传递空值?
要记住的事情:组件挂载时,会自动将方法绑定到"this"。
有两个条件
1.调用从父组件传递到子组件的回调
当我们直接传递函数(例如 this.clickHandler
) 到子组件,而不必担心实际调用函数时 'this' 的值。
然后 React 用自己的函数替换标准 Function.prototype.bind
方法,以帮助阻止你做任何愚蠢的事情(比如尝试更改 'this' 的已绑定值),所以你必须传递 'null' 说"我知道这只会改变参数"。
2.调用同一组件中定义的函数
React 不会对同一组件中的函数调用执行此操作
约束规则
如果要通过在函数上调用 .bind 来设置第一个参数...
通过 props 传入,将 null 作为第一个参数传递,例如
this.props.funcName.bind(null, "args")
取自"this",传递"this"作为第一个参数,例如
this.funcName.bind(this, "args")
你可以这样做:
var ListItem = React.createClass({
clickItem: function (e) {
this.props.clickHandler(e, this.props.my_data); // now you can pass any data to parent
},
render: function() {
var link_details = (
<div>
Start Date: {this.props.my_data.start_date}<br/>
End Date: {this.props.my_data.end_date}<br/>
</div>
);
return (
<li>
<a onClick={this.clickItem}>
{ this.props.my_data.name }
</a>
{link_details}
</li>
)
}
});
我查看了 React 中将 props 传递给父组件的答案.js并得出了以下内容:
// Parent component
var Sidebar = React.createClass({
getInitialState: function() {
return {
my_data: [],
};
},
handleListItemClick: function(data_passed, e){
console.log(data_passed);
},
render: function() {
var myLinks = this.state.my_data.map(function(mylink) {
return (
<ListItem key={mylink.id} my_data={mylink} clickHandler={this.handleListItemClick.bind(null, mylink.id)} />
);
}.bind(this));
return (
<div>
<ul className="nav nav-sidebar">
{ myLinks }
</ul>
</div>)
}
});
这似乎确实有效 - 我有兴趣看到其他解决方案以及哪一个是"最好的"以及为什么。
- keyup事件处理程序更改焦点不适用于快速键入
- 提示使用服务器端事件处理程序激活JavaScript
- 将事件处理程序绑定到任何可能的事件
- 正在将事件处理程序添加到不存在的类
- 在循环中附加事件处理程序时出现浏览器性能问题
- 在同一个javascript事件处理程序中调用不同的函数
- 有没有一种方法可以让内联事件处理程序在元素创建后立即执行
- 检查事件处理程序参数
- 实现延迟的jquery更改事件处理程序
- 如何使用Node.js在JavaScript模块文件之间使用事件处理程序
- 如何使jQuery的“bind”或“on”事件处理程序幂等
- 带有参数的Javascript事件处理程序
- Jquery事件处理程序仅适用于匿名函数
- 如何从另一个处理程序内部取消JavaScript事件处理程序函数的执行
- 如何在jQuery事件处理程序中存储和重用超时
- 如何向onClick事件处理程序传递一个接受参数的函数,并且仍然将该函数绑定到组件's”;这个“;上下文
- 异步处理所有事件处理程序的方法
- jsplumb中的Click事件处理程序丢失“;这个“;对象
- 构造函数中的事件处理程序与构造函数外的事件处理函数的行为不同
- 如何在事件处理程序的回调中防止Default