使用自定义数据属性或将数据绑定到处理程序来处理事件
Handling event using custom data attributes or binding data to the handler?
我正在使用React,但这不一定是React特有的问题。
在事件处理程序中获取自定义数据属性之间有主要区别吗
<MyElement greeting="hello" farewell="goodbye" />
//MyElement component
handleClick(event) {
console.log(event.currentTarget.dataset.myData);
}
...
<li data-my-data={this.props.greeting} onClick={this.handleClick}>Click Greeting</li>
<li data-my-data={this.props.farewell} onClick={this.handleClick}>Click Farewell</li>
并将值绑定到事件处理程序
<MyElement greeting="hello" farewell="goodbye" />
//MyElement component
handleClick(myData) {
console.log(myData);
}
...
<li onClick={this.handleClick.bind(this, this.props.greeting)}>Click Greeting</li>
<li onClick={this.handleClick.bind(this, this.props.farewell)}>Click Farewell</li>
这只是个人偏好的问题,还是每一个都有实际的利弊?
简单回答:这是个人偏好的问题,每个解决方案都有Pro和Con。IMHO选项1是反作用设计原则的捷径,这可能会让你以后遇到很多麻烦
PRO选项1:将数据"存储"在DOM数据集中:
- 在组件中绑定内容不那么繁琐
- 数据集也可以从react组件外部访问;其他组件/代码可以直接读取/更新数据集
PRO选项2:将数据"存储"在react javascript组件中
- 如果传递的目标是正确的DOM节点,那么就不用担心了。(
event.currentTarget
采用具有事件侦听器的第一个更高级别组件,event.target
采用单击的元素) - 数据集只能从react组件内部访问,使代码更干净
我个人的偏好是选项2:它迫使您坚持react数据流和设计原则,并将所有相关代码保持在javascript react组件内的同一位置。
这可以保护您免于以下地狱之路(尤其是在大型项目和大型团队中):
- 新要求:一些远程组件需要访问数据集
- 对react组件树进行适当的重新设计是乏味的:您可能需要将数据集的管理转移到更高的组件来访问数据集,这意味着对react构件树进行修订
- 但是有一个快捷方式可用:远程组件也可以直接从DOM中读取,所以选择快速而肮脏的解决方案
- 新要求:原始组件需要更新
- 现在,无法找出哪些其他组件实际读取/依赖于数据集,因此您的代码实际上变得无法管理
这样做,使用ES6箭头函数:
<li onClick={()=>this.handleClick(this.props.greeting)}>Click Greeting</li>
这比bind
更干净、更高效,并且所需代码比选项(1)少得多。
唯一(潜在的)缺点是,在这种情况下,每次render()过程中都要创建新的函数对象。只有当您将回调传递给依赖shouldComponentUpdate()优化的自定义组件时,才会出现问题。在这种情况下,选项(1)应该效果最好,因为您应该避免动态创建闭包。
相关文章:
- keyup事件处理程序更改焦点不适用于快速键入
- 提示使用服务器端事件处理程序激活JavaScript
- 将事件处理程序绑定到任何可能的事件
- 正在将事件处理程序添加到不存在的类
- 在AJAX回调和呈现PIXIJS之间处理程序流时遇到了问题
- Adobe Edge:动画完成时添加onComplete处理程序
- 是否可以从输入处理程序中确定输入的类型
- 在循环中附加事件处理程序时出现浏览器性能问题
- 在同一个javascript事件处理程序中调用不同的函数
- 有没有一种方法可以让内联事件处理程序在元素创建后立即执行
- 检查事件处理程序参数
- 实现延迟的jquery更改事件处理程序
- 平均值.on(事件[,选择器][,数据],处理程序)
- getSript在同一对象上多次添加处理程序
- 如何使用Node.js在JavaScript模块文件之间使用事件处理程序
- 如何让React JS点击处理程序在执行时更新DOM
- 如何使jQuery的“bind”或“on”事件处理程序幂等
- Backbone listenTo不将jquery函数作为处理程序进行激发
- 带有参数的Javascript事件处理程序
- Jquery事件处理程序仅适用于匿名函数