reactjs - 防止在使用 useState 的功能组件中将新函数作为道具传递
问题描述
我知道将每个渲染的新函数作为道具传递给反应组件会影响性能(例如传递箭头函数)。在类组件中,我通常通过传递类的方法来解决这个问题。但是假设我们有一个使用 say 的功能组件,useState
我想创建一个闭包来调用从useState
. 该函数将在每次渲染时重新创建,因此它传递给的任何组件都将被重新渲染。有没有办法避免传递引用某个变量的新函数,函数组件内部的函数?
import React from 'react'
import IDontWantToRerender from './heavyComputations';
export default function IneffectiveFunctionalComponent() {
const [value, setValue] = useState(1);
const valueChanger = () => {
setValue(Math.random());
}
return (
<IDontWantToRerender valueChanger={valueChanger} value={value} />
)
}
解决方案
您可以使用useCallback
挂钩。
const valueChanger = useCallback(
() => {
setValue(Math.random());
},[setValue]); // you need some other dependencies for when it should change
正如评论中所说
我想知道,是否真的有必要传递 setValue 因为它不会改变?
是的,如果您查看文档,它会说
笔记
依赖项数组不会作为参数传递给回调。但是,从概念上讲,这就是它们所代表的:回调中引用的每个值也应该出现在依赖项数组中。将来,一个足够先进的编译器可以自动创建这个数组。
我们建议在我们的 eslint-plugin-react-hooks 包中使用exhaustive-deps 规则。当依赖项指定不正确时,它会发出警告并建议修复。
推荐阅读
- java - java.util.Base64 无法用 OpenJ9 解析
- php - Laravel 我在一个字段中保存了位置表中的多个 id 数据
- python - 嵌套 for 循环和 PANDAS 的替代品
- tensorflow - 如何降低文档嵌入的维度?
- elasticsearch - 使用 Apache Benchmark 进行弹性搜索负载测试
- html - 使标签背景颜色占据 div 的所有高度
- c - 数组中素数的总和
- react-native - undefined 不是对象(评估 'this.props.navigation.navigate) React Native 模块
- flask - Flask 下载有时无法在 Firefox 中启动
- c# - WPF Grid 内容未显示在 Expander 中