我使用的是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>
这仅仅是个人偏好的问题,还是每个人都有实际的利弊?
答案 0 :(得分:0)
简短回答:这是个人偏好的问题,每种解决方案都有Pro和Con。 恕我直言选项1是反应设计原则的捷径,可以在以后遇到很多麻烦。
PRO选项1:将数据“存储”在DOM数据集中:
PRO选项2:将数据“存储”在反应javascript组件中
event.currentTarget
使用事件侦听器获取第一个更高的组件,event.target
获取单击的元素)我个人的偏好是选项2:它强迫您坚持反应数据流和设计原则,并将所有相关代码保存在javascript react组件内的相同位置。
这可以保护您免受下列地狱之路的影响(特别是在大型项目和大型团队中普遍存在):
答案 1 :(得分:0)
使用ES6箭头功能这样做:
<li onClick={()=>this.handleClick(this.props.greeting)}>Click Greeting</li>
这比bind
更干净,更高效,并且所需的代码少于选项(1)。
只有(潜在)缺点是在这种情况下,每次在render()期间创建新的函数对象。当您将回调传递给依赖于shouldComponentUpdate()优化的自定义组件时,这只会是问题所在。在这种情况下,选项(1)应该是最好的,因为你应该避免动态创建的闭包。