我想将PureComponent
转换为已记忆的FunctionalComponent
,因此即使道具更改,即使父项重新渲染,它也仅重新渲染。
export class MyComp extends React.PureComponent<{param: string}> {
public render() {
return <div>{this.props.param}</div>;
}
}
我想对其进行更改,以便它成为使用React Hooks的功能组件。
export const MyComp: React.FC<{ param: string }> = useMemo(({param}) => {
return <div>{param}</div>;
}, [param]);
但是上面的方法不起作用,并且有几个问题:
param
的类型为any
,不能正确推断。[param]
作为useMemo
的依赖项列表传递,因为它不是在此上下文中定义的。 拥有这样的东西更有意义吗?
export const MyComp: React.FC<{ param: string }> = (param) => {
return useMemo((param) => {
return <div>{param}</div>;
}, [param]);
};
此组件是否正确记忆?如果我们也有一些内部状态,那么存储中的数据会在这些更改时重新呈现吗?
export const MyComp: React.FC<{ param: string }> = (param) => {
return useMemo((param) => {
// Will it re-render when this changes even if it's memoized?
const fromStore = useSelector((state: IState) => state.myValue));
return <div>{param} {fromStore}</div>;
}, [param]);
};
如果商店价值发生变化,我认为它不会重新呈现。但是在那种情况下,我们必须将fromStore
吊起在useMemo
之外,但这是否意味着该组件不再是纯净的?正如父级重新渲染时一样,MyComp
函数将再次运行(例如,再次计算fromStore
值)。
我确实喜欢使用钩子,但是它们的功能和实现有点抽象。用钩子实现带类型的纯组件的正确方法是什么?
您在这里使用错误的方法,React.memo
等效于React.memo
。
[React.PureComponent
用于记忆功能组件内部的昂贵计算。
React.useMemo
而且,很多人不喜欢不使用React.useMemo
键入组件,您可以阅读为什么import React, { memo } from 'react'
type Props = {
param: string
}
export const MyComp = memo(({ param }: Props) => (
<div>{param}</div>
))