自从出现 React Hooks 之后,我决定放弃使用 React 类组件,现在只处理 hooks 和函数式组件。
简单的问题:
我理解在类体内使用箭头函数和普通函数的区别。箭头函数会自动绑定 (词法 this) 到我的类实例上,我不必在构造函数中绑定它。这很好。
但既然我不再处理类了,我想知道在函数式组件内部执行以下操作的区别是什么:
function App() {
// REGULAR FUNCTION
function handleClick1() {
console.log('handleClick1 executed...');
}
// ARROW FUNCTION
const handleClick2 = () => {
console.log('handleClick2 executed...');
}
return(
<React.Fragment>
<div className={'div1'} onClick={handleClick1}>
Div 1 - Click me
</div>
<div className={'div2'} onClick={handleClick2}>
Div 2 - Click me
</div>
</React.Fragment>
);
}
问题
两者都可以正常工作。
它们的性能有区别吗?应该偏爱一个而不是另一个吗?它们在每次渲染时都会被重新创建,对吗?
关于可能重复的说明
我真的不认为这是一个重复的问题。我知道有很多关于箭头函数和普通函数之间差异的问题,但我想从 React 函数组件的角度和 React 如何处理它来了解。我已经找过了,没有找到一篇相关的答案。
测试用代码片段
function App() {
function handleClick1() {
console.log('handleClick1 executed...');
}
const handleClick2 = () => {
console.log('handleClick2 executed...');
}
return(
<React.Fragment>
<div className={'div1'} onClick={handleClick1}>
Div 1 - Click me
</div>
<div className={'div2'} onClick={handleClick2}>
Div 2 - Click me
</div>
</React.Fragment>
);
}
ReactDOM.render(<App/>, document.getElementById('root'));
.div1 {
border: 1px solid blue;
cursor: pointer;
}
.div2 {
border: 1px solid blue;
cursor: pointer;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.3/umd/react-dom.production.min.js"></script>
<div id="root"></div>
this
,那么函数内部的差异完全无关紧要。外部的区别在于函数声明被提升到作用域的顶部,将箭头函数分配给变量(var、const、let)则不会。var与const和let之间还有进一步的差异,但只有在引用尚未分配的内容时才会有影响。 - Jared Smith