例如,我有一些需要渲染的数据。物品将始终相同,但它们来自道具。
const items = props.data.values.map(value => ({
id: value.id
name: value.name,
rating: Number(value.rating)
}));
return (
{items.map(item => (
<div key={item.id}....
)}
);
我可以像这样使用useState作为items变量:
const [items] = useState(data.values.map(value => ({
id: value.id
name: value.name,
rating: Number(value.rating)
})));
它是否有助于我在下次重新渲染时摆脱多余的“映射”?
不,它没有帮助。
我认为最好完全摆脱第一张地图并在第二张地图上做任何你想做的事情。但如果你认为你的应用程序有必要,你可以使用useMemo
钩子。
此挂钩为您提供了一个memoized值,仅当某些参数发生更改时才会重新计算。
例如:
const items = useMemo(() => {
return data.values.map(...)
}, [data])
此示例仅在数据值更改时计算项目。否则,它返回memoized版本,不会重新计算任何东西。
但是useState
怎么样?每当我们有一些变量时它就会使用,无论何时它发生变化,我们都想重新渲染我们的组件并显示一些新的内容。例如,我们有一个计数器,只要它的值发生变化,我们就想重新渲染组件并显示新的值。所以我们使用这样的东西:
const Counter = (props) => {
const [value, setValue] = useState(0)
return (
<div>
<p>{value}</p>
<button onClick={() => setValue(value + 1)}>Increment</button>
<button onClick={() => setValue(value - 1)}>Decrement</button>
</div>
)
}
因此,每当我们调用setValue时,组件将重新呈现,并且新值将显示给用户。
我想你要找的是Pure Components。他们使用shouldComponentUpdate
来确定组件是否需要重新渲染。在您的情况下,如果道具相同,如果您使用纯组件,组件将不会重新渲染。