React.js:将事件从父级附加到子级
React.js: attach event from parent to children
如下面的示例所示,我希望MyComponent动态地将"onClick"事件附加到其子级。onClick事件应该触发alertView,它应该能够调用单击的元素方法"getValue"。
JSFiddle:http://jsfiddle.net/2g638bp8/
如何做到这一点?感谢
var MyComponent = React.createClass({
alertValue: function () {
// RETRIEVE THE CHILD HERE
alert(child.getValue());
},
render: function () {
var children = React.Children.map(this.props.children, function (c, index) {
return React.addons.cloneWithProps(c, {
ref: 'child-' + index
});
});
return (
<div>
{children}
</div>
);
}
});
var MySubComponent = React.createClass({
getValue: function () {
return this.props.val;
},
render: function () {
return (
<div>{this.props.val}</div>
);
}
});
React.render(
<div>
<MyComponent>
<MySubComponent val="1" />
<MySubComponent val="2" />
<MySubComponent val="3" />
</MyComponent>
</div>,
document.getElementById('container')
);
React中不能调用子组件上的方法。您只能设置属性。(child
实际上是一个ReactElement
,它包含有关类和相关属性的信息。它不是您创建的组件的实例)。
所以,你可以用一种稍微不同的方式来思考这个问题,并将onClick
移动到MySubComponent
:
var MyComponent = React.createClass({
onHandleGiveValue: function (value) {
alert(value);
},
render: function () {
const children = React.Children.map(this.props.children, child => React.cloneElement(child, { onGiveValue: this.onHandleGiveValue.bind(this) }));
return (
<div>
{children}
</div>
);
}
});
var MySubComponent = React.createClass({
handleClick: function() {
this.props.onGiveValue(this.props.val);
},
getValue: function () {
return this.props.val;
},
render: function () {
return (
<div onClick={ this.handleClick } >{this.props.val}</div>
);
}
});
React.render(
<div>
<MyComponent>
<MySubComponent val="1" />
<MySubComponent val="2" />
<MySubComponent val="3" />
</MyComponent>
</div>,
document.getElementById('container')
);
通过这样做,代码可以将当前值作为事件传递给父组件。我已经从MySubComponent
类创建了一个名为onGiveValue
的新事件。目前,它只是传递this.props.val
的值。但是,它当然可以是任何东西。
- 将父回调传递给子组件,子组件不需要引用
-
React更喜欢组合设计模式,所以你的父组件应该包含这三个子组件。JS Fiddle:http://jsfiddle.net/68vt3umg/
var MyComponent = React.createClass({ handleChildClick: function (e, childValue) { alert(childValue); }, render: function () { return ( <div> <MySubComponent val="1" onSubClicked={this.handleChildClick}/> <MySubComponent val="2" onSubClicked={this.handleChildClick}/> </div> ); }}); var MySubComponent = React.createClass({ getValue: function () { return this.props.val; }, handleOnClick: function (e, value) { this.props.onSubClicked(e, this.props.val); }, render: function () { return ( <div onClick={this.handleOnClick}>{this.props.val}</div> ); } }); React.render( <div> <MyComponent /> </div>, document.getElementById('container') );
相关文章:
- 为什么js事件消失了
- 使用onkeyup JS事件检查输入的值是否唯一
- JS事件未更改输入禁用属性
- jQuery的等价物's$(this)在Ractive.js事件代理中
- Raphael JS事件未开火
- Ajax 请求正在取消页面上的其他 JS 事件
- 当多个 JS 事件调用同一个函数时,如何处理它们
- 主干.js事件处理程序命名的最佳做法
- js事件,用于函数内部的when语句变为true
- React.js事件需要点击2次才能执行
- 单击文档时的Backbone JS事件
- 在添加元素时激发JS事件
- 作为自动化测试的一部分,监控特定的js事件以及执行它们所需的时间
- JS事件CTRL+鼠标悬停+隐藏文本
- Backbone.js事件未启动
- JS调试器是否挂起整个JS事件循环
- js事件循环是否意味着可以为临时暂存空间使用全局变量
- 在Backbone.js视图中拖动gabilly.js事件
- 从本机 java 代码调用 JS 事件
- 主干网.js事件和内存管理