对组件上的点击事件做出反应
React onClick event on component
我有一个名为 <SensorList />
的 React 组件,它有许多子<SensorItem />
(另一个 React 组件)。我希望能够在<SensorList />
内在每个<SensorItem />
上声明一个onClick
事件。我尝试执行以下操作:
sensorSelected: function(sensor) {
console.log('Clicked!');
},
render: function() {
var nodes = this.state.sensors.map(function(sensor) {
return (
<SensorItem onClick={ this.sensorSelected } />
);
}.bind(this));
return (
<div className="sensor-list">
{ nodes }
</div>
);
}
不用说,我的控制台中没有出现任何"点击!Chrome 中的 React 检查器指示已注册onClick
事件,上述函数体应如此。
因此,我得出的结论是,我无法在实际的<SensorItem />
标签上注册onClick
事件(但是,我不确定为什么会这样)。否则我该如何实现这一目标?
这取决于 SensorItem 组件的定义。因为 SensorItem 不是原生 DOM 元素,而是另一个 React 组件,所以这里定义的 onClick 只是该组件的一个属性。你需要做的是,在 SensorItem 组件内部,将 onClick 属性传递给 DOM 组件的 onClick 事件:
var SensorItem = React.createClass({
render: function() {
return (
<div className="SensorItem" onClick={this.props.onClick}>
...
</div>
);
}
});
问题
正如另一个答案所解释的那样,问题在于<SensorItem>
React组件上的onClick
(与<div>
或<p>
等本机DOM元素相反)被视为组件属性的传递,而不是DOM事件处理程序的传递。而且,由于您的<SensorItem>
组件很可能没有声明onClick
属性,因此该属性值只会丢失。
溶液
最直接的解决方案是在组件上显式添加onClick
属性SensorItem
然后将其传递给该组件的根 DOM 元素:
function SensorItem({ prop1, prop2, onClick }) {
(...)
return (
<p onClick={onClick}>
(...)
</p>
);
}
但是通常最适合我的解决方案是使用对象解构符号对所有未定义组件的属性进行分组,然后将它们全部传递给该组件中的根 DOM 元素。这样,您可以传递onClick
、onHover
、className
等,而无需为每个属性定义单独的属性:
function SensorItem({ prop1, prop2, ...rootDOMAttributes }) {
(...)
return (
<p {...rootDOMAttributes}>
(...)
</p>
);
}
无论您使用这两种方法中的哪一种,处理程序现在都可以工作,因为它现在将附加到SensorItem
的根 DOM 元素:
<SensorItem onClick={...} />
- 如何向onClick事件处理程序传递一个接受参数的函数,并且仍然将该函数绑定到组件's”;这个“;上下文
- 单元测试:使用酶模拟父组件中子组件的点击事件
- React/flux - 子组件用户事件 - 是否应通过调度程序路由所有内容
- React:如何侦听子组件事件
- 将事件绑定到其他UI组件's函数,在Kendo MVVM中
- 如何更新angular2中组件之间的事件数据
- 点击tpl链接时,ExtJS 4.2自定义组件触发事件
- 反应:在嵌套组件上冒泡点击事件
- 如何根据其他组件中的事件更新组件URL
- 使用Ember中的组件生命周期事件
- 如何将事件绑定到模式对话框上的组件
- 将事件处理程序推送到父组件
- 通知全局事件组件的最佳方式
- React 渲染一个组件会触发 onClick 事件
- Web组件,添加Shadow DOM事件
- Extjs 4,事件处理,范围,自定义组件
- Gwd自定义组件及其事件处理程序
- 处理Twitter Flight组件的多个实例的事件
- React鼠标事件在没有监听它们的组件上触发
- Angular 2 ES6/7事件发射器更新其他组件