当前位置: 首页 > 知识库问答 >
问题:

React使用效果的更高级比较

陆子默
2023-03-14

我正在寻找一种方法来执行更高级的比较,而不是useffectReact钩子的第二个参数。

具体而言,我正在寻找更像这样的东西:

useEffect(
  () => doSomething(), 
  [myInstance],
  (prev, curr) => { /* compare prev[0].value with curr[0].value */ }
);

关于这一点,我从React文档中错过了什么吗?或者有什么方法可以在已经存在的基础上实现这样的钩子吗?

如果有实现这一点的方法,这就是它的工作原理:第二个参数是一个依赖关系数组,就像来自React的use效应钩子一样,第三个参数是一个带有两个参数的回调:依赖关系数组上一个渲染,以及当前渲染的依赖关系数组。

共有2个答案

松思源
2023-03-14

中,基于类的组件很容易执行深度比较componentDidUpdate提供以前的道具以前的状态快照

componentDidUpdate(prevProps, prevState, snapshot){
    if(prevProps.foo !== props.foo){ /* ... */ }
} 

问题是useffectcomponentdiddupdate不完全一样。考虑以下事项

useEffect(() =>{
    /* action() */
},[props])

调用action()时,您可以断言当前props的唯一一点是它已更改(浅层比较断言为false)。您不能拥有prevProps的快照,因为hooks与常规函数类似,没有生命周期的一部分(也没有实例)可以确保同步性(和注入参数)。实际上,确保价值完整性的唯一因素是执行顺序。

替代use上一页

更新之前,请检查这些值是否相等

   const Component = props =>{
       const [foo, setFoo] = useState('bar')

       const updateFoo = val => foo === val ? null : setFoo(val)
   }

当您需要确保效果只运行一次时,这在某些情况下非常有用(在您的用例中不有用)。

usemo:如果要执行比较以防止不必要的render调用(shoudComponentUpdate),那么usemo就是一种方法

export React.useMemo(Component, (prev, next) => true)

但是当您需要访问已经运行的效果中的值时,就没有其他选择了。因为如果你已经在use效应中,这意味着依赖关系已经更新(当前渲染)。

为什么usePrevious有效useRef不仅仅适用于refs,它是一种非常简单的方法,可以在不触发重新渲染的情况下对值进行变异。因此,循环如下

  • 组件安装

请注意,usePre以往总是在use效应之后调用(请记住,顺序很重要!)。因此,每次你在一个use效应中,useRef当前值总是落后一个渲染。

const usePrevious = value =>{
    const ref = useRef()
    useEffect(() => ref.current = value,[value])
}

const Component = props =>{
    const { A } = props
    useEffect(() =>{
        console.log('runs first')
    },[A])

    //updates after the effect to store the current value (which will be the previous on next render
    const previous = usePrevious(props)
}

云承天
2023-03-14

你可以用React。备忘录功能:

const areEqual = (prevProps, nextProps) => {
  return (prevProps.title === nextProps.title)
};

export default React.memo(Component, areEqual);

或者使用自定义挂钩:

如何在效果上比较旧值和新值?

 类似资料:
  • 我对反应几乎是全新的。我看了留档,看了一些YT的视频。现在我正在尝试将我在网上找到的一些React类组件转换为功能组件。这就是我已经走了多远:我的功能组件(codesandbox)。 它是一个基于用户输入字段使用元素自动包装SVG文本的组件。 我特别是有一个困难的时间与useEffect挂钩。据我所知,它应该充当和的等价物。现在我已经完成了几乎所有的设置,但是每当在文本区域中添加新文本时,它都不会

  • 之所以会出现 React 官方文档中 Advanced Guides 部分的翻译的缘由在于,大部分类似于我这种React新手学习的资料主要集中在于阮一峰老师的 React 教程或者是官方文档, 一般起步都会学习 React官网 中 QUICK START 中的部分,但是对于Advanced Guides部分关注度却不太高。 在我阅读了这部分内容后发现, 这部分其实对于React进阶有着非常重要的帮

  • 我们甚至可以为Vim里面的语法高亮另开一本书了。 我们将在此讲解它最后的重要内容,然后继续讲别的东西。 如果你想要学到更多,去读:help syntax并阅读别人写的syntax文件。 高亮字符串 Potion,一如大多数编程语言,支持诸如"Hello,world!"的字符串字面量。 我们应该把这些高亮成字符串。为此我们将使用syntax region命令。 在你的Potion syntax文件中

  • 高级使用 静态资源映射表 记录文件依赖、打包、URL等信息的表结构,在 FIS2 中统称 map.json。在 FIS3 中默认不产出 map.json,FIS3 中为了方便各种语言下读取 map.json,对产出 map.json 做了优化。 当某个文件包含字符 __RESOURCE_MAP__,就会用表结构数据替换此字符。这样的好处是不再固定把表结构写入某一个特定文件,方便定制。 比如在 ph

  • 其实就是针对一些图片实际使用场景而封装的方法,因为生成结果是图片不方便验证结果,所以请自行肉眼判断 添加水印 添加位置默认提供9个选择: Images.WATERMARK_TOP_LEFT Images.WATERMARK_TOP_CENTER Images.WATERMARK_TOP_RIGHT Images.WATERMARK_CENTER_LEFT Images.WATERMARK_CENT

  • Gradle可以设置多个存储库,例如maven和JCenter。但是我意识到gradle总是首先使用jcenter即使我把maven放在jcenter之前(如下所示)。是否有可能使maven(本地回购,并且更快)具有更高的优先级?