根据Reactjs.org处理事件并防止在代码下面使用默认值:
function ActionLink() {
function handleClick(e) {
e.preventDefault();
console.log('The link was clicked.');
}
return (
<a href="#" onClick={handleClick}>
Click me
</a>
);
}
但是,这还需要在构造函数中添加绑定,如:
this.handleClick = this.handleClick.bind(this);
我能够通过以下代码获得所需的行为:
<span>
<a href="#"
onClick={()=>doSomething(arg1,agr2)}>Click here</a></span>
问题:哪一个更好?似乎第一个需要使用有状态组件,第二个选项可以做这些事情而不管组件是有状态的还是无状态的。
答案 0 :(得分:10)
这两个选项产生的结果几乎相同。由于ActionLink是无状态组件,因此将重新创建handleClick
并重新分配onClick
。如果你想获得最佳性能,你可以使用类似的东西:
class ActionLink extends React.Component () {
handleClick = (e) => {
e.preventDefault();
console.log('The link was clicked.');
};
render() {
return (
<a href="#" onClick={handleClick}>
Click me
</a>
);
}
}
在这个例子中。 handleClick
只绑定一次,只执行render方法。如果您愿意,也可以在构造函数中绑定handleClick
。但差异很小,我建议你使用你喜欢的那个,你会发现更清楚。
答案 1 :(得分:2)
在页面加载时修复此重复函数调用的最佳方法是
<a href="#" onClick={() => {this.handleClick}}>click me</a>
答案 2 :(得分:1)
第二个---两个片段都存在轻微的性能问题。每次呈现<a>
标记时,onClick
中的函数都将重新分配。
这是一篇详细的帖子,概述了绑定this
的所有方法。 (https://medium.com/@housecor/react-binding-patterns-5-approaches-for-handling-this-92c651b5af56#.53op90a6w)
编辑。我误解了示例代码,它具有在每个渲染上分配函数作为内联箭头函数代码段的相同问题。请参阅Vincent D'amour已接受的答案。
答案 3 :(得分:0)
我认为您应该绑定当前对象。让它尝试。请参考以下示例:
<a href="#" onClick={this.handleclick.bind(this)}>click me</a>
答案 4 :(得分:0)
使用此代码将产生警告
<a href="#" onClick={() => action()}>Link</a>
有一个解决方法,可以按照react cli建议进行操作,这是如果您不能使用HTTP:etc提供有效的链接地址来将标签更改为按钮。可以使按钮看起来像纯CSS的链接。这是示例。
第一步创建按钮样式
const buttonToLink = {
fontSize: '1em',
textAlign: 'left',
color: 'blue',
background: 'none',
margin: 0,
padding: 0,
border: 'none',
cursor: 'pointer'
}
第2步将样式添加到按钮
<button style={buttonToLink} onClick={() => action()}> This link has no warning</button>
请注意,“ action()”是我们希望按钮遵循的功能。
答案 5 :(得分:0)
就我而言,如果我有href="#"
,无论如何我都会被重定向,所以我就这样留下了链接/按钮:
<a href="" role="button" onClick={this.myAction}>Click here</a>