由于react钩子,我决定放开反应类组件。我现在只处理钩子和功能组件。
简单问题:
我了解使用箭头功能而不是类主体内部的常规功能之间的区别。箭头函数将自动绑定(词汇,这(与我的类实例绑定,我不必在构造函数中绑定它。这很好。
但是,由于我不再与课程打交道,所以我想知道在功能组件的内部执行以下内容有什么区别:
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>
);
}
问题
两个都很好。
是否有性能差异?我是否应该偏爱而不是另一种方式?strong>
请注意可能的重复项
我真的不认为这是一个重复的问题。我知道关于箭头和常规量之间的差异有很多问题,但是我想从反应功能组件的角度了解以及对其的反应如何处理。我环顾四周,没有找到一个。
测试代码段
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>
在您已经指出的差异(词汇范围(,箭头函数(和函数表达式( noted hueristed
反应真的不在乎您使用的是哪一个(也无法检测到(。
const A = () => {
const name = getName();
function getName() {
return 'praffn';
}
// Will not work
// const getName = () => 'praffn';
return <p>Hi, {name}</p>;
}
ReactDOM.render(<A/>, document.getElementById('root'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="root"></div>
由于您无法访问this
上下文,因此两者都表现相同的。
要了解更多,您可以检查Babel如何将ECMA蒸蒸日上:
const handleClick2 = () => {
console.log('handleClick2 executed...');
this.x=3
}
将被转移为:
"use strict";
var _this = void 0;
var handleClick2 = function handleClick2() {
console.log('handleClick2 executed...');
_this.x = 3;
};
链接到Babel Notepad