问题描述
在过程中,我使用如下类的组件:
class Car extends React.Component {
testing = () => {
console.log(this.props.brand);
}
render() {
testing();
return <h2>I am a {this.props.brand}!</h2>;
}
}
现在,我需要将它们转换为如下所示的功能组件:
function Car(props) {
const testing = () => {
console.log(this.props.brand);
}
testing();
return (
<h2>I am a {this.props.brand}!</h2>
);
}
从功能组件的方式可以看到,testing
方法在每个渲染周期内重复创建,而类组件的方法则在渲染函数之外声明。
我试图像这样将其移至外部:
const testing = () => {
console.log(this.props.brand);
}
function Car(props) {
testing();
return (
<h2>I am a {this.props.brand}!</h2>
);
}
这不起作用,因为我需要props
值。我知道我可以在方法参数中传递props
,但是我有很多要转换的方法,我不想更改方法签名。
我指的是这个doc,它说:
由于在render中创建函数,钩子变慢了吗?不,在现代 浏览器,与类相比,闭包的原始性能没有 除了极端情况外,差异很大。
这听起来没有回答这个问题,它比较了创建闭包和类的性能,而我并不是这种情况。就我而言,它更多地是指在功能组件中重复创建相同的方法,而不是在类组件中重复创建。
解决方法
在现代计算机上,在块中创建函数的开销基本上没有。就像您阅读的文档说的那样,在极端情况下,可能会(虽然不太可能)出现问题(例如,可能不存在),例如,如果有1000个此类组件并且它们每秒被更新多次-而不是创建每个渲染器的功能可能会使应用程序更快一点。但是这种情况不太可能。
更好地争取代码的清晰度和可读性。 如果您发现某个特定组件的运行速度太慢,并且已经进行了性能测试以识别其中的瓶颈,请继续尝试并根据需要对其进行优化-但是在那之前可能不值得。
,您实际引用的文档正在解决您的确切问题。答案是否定的,与带有方法的类组件相比,您不必担心带有封闭函数的功能组件的性能。
,尝试使用useEffect挂钩。
import { useEffect } from 'react';
function Car(props) {
const testing = () => {
console.log(this.props.brand);
}
useEffect(()=>{
testing();
},[])
return (
<h2>I am a {this.props.brand}!</h2>
);
}