demo
这个demo的代码 来自于 https://zh-hans.react.dev/reference/react/useTransition 的示例代码,fork后修改了PostsTab组件的逻辑.
问题: 为什么 requestUrl每次渲染时值相同的情况下 useMemo的参数函数会执行多次?
因该没有重复执行 只是因为你的APP 被 StrictMode严格模式包裹了,去掉就行。
在React中,useMemo
函数的行为可能会受到多种因素的影响,尽管其设计初衷是为了避免在每次渲染时都重新计算某些值,但如果依赖项(dependency)列表中的值在引用上发生变化,或者React的渲染逻辑导致组件被重新渲染,那么useMemo
中的函数仍然可能会被多次调用。
针对你提到的问题,有几个可能的原因导致useMemo
的参数函数执行多次:
依赖项(dependency)的变化:
useMemo
的依赖项列表中包含了会变化的引用(如对象、数组等),即使这些对象的内容保持不变,但由于它们是新的引用,React会认为依赖项已经变化,从而重新执行useMemo
中的函数。requestUrl
是从props或其他状态变量中派生的,并且这些源变量在每次渲染时都是新的引用(例如,通过每次渲染都创建的新对象或数组),那么即使requestUrl
的值看起来相同,useMemo
也会因为依赖项的变化而重新计算。父组件的重新渲染:
PostsTab
组件的父组件因为某些原因(如props变化、state更新、key变化等)被重新渲染,那么PostsTab
组件也会被重新渲染。在React中,组件的重新渲染会重新执行其内部的hooks,包括useMemo
。React的渲染优化和并发模式:
useMemo
中的函数也被多次调用。然而,请注意,这种情况在普通的同步模式下不太常见。为了解决这个问题,你可以:
useMemo
的依赖项是稳定的引用,或者只包含基本数据类型(如数字、字符串等),这样可以避免因为引用变化而导致的重新计算。React.memo
来包装组件,这样可以在组件的props没有实际变化时避免不必要的渲染。如果requestUrl
是直接从props或state中获取的,并且你确信它在渲染之间是稳定的(即内容相同且引用也相同),那么你可以考虑将requestUrl
作为useMemo
的依赖项,并检查其他可能导致组件重新渲染的因素。如果requestUrl
是通过复杂逻辑或计算得出的,那么你可能需要确保这个逻辑或计算本身是稳定的,并且不会在每次渲染时都产生新的引用。
我遇到了这段代码,不知道为什么X在这里工作。
react 18 里的类组件在严格模式下会执行一次模拟渲染, 在类组件的生命周期里表现如下 first.constructor -> second.constructor -> first.componentDidMount -> first.componentWillUnmount -> second.componentDidMount 一个比较简单的例子就是,复现链接(https://play
这是一个快速的问题,但到目前为止我还没有找到解决方案: 我想访问URL参数与react-router v4使用渲染方法。到目前为止,我发现的一切只是像这样传递组件: <代码> 但是我想使用这样的渲染方法: <代码> 但是,当我尝试在我的组件中使用访问参数时,道具是未定义的。 你知道我如何使用渲染函数并仍然访问url参数吗?
react class组件在componentDidMount中调用初始化接口,有些时候会调用两次,通过断点发现顺序是componentDidMount->componentWillUnmount->componentDidMount,但不能稳定复现,调用的组件是页面的主入口,并非某个组件的子组件,请问有知道这个问题的么?
下面的python代码尝试运行同一函数两次并输出运行时: 三次测试的输出如下: 我不知道为什么输出如此不同?为什么第二次执行比第一次快?我也尝试运行五次,结果如下:
我想了解更多关于std::thread的信息,特别是如果我有一个线程向量,并且其中一个线程完成了执行,将会发生什么。 想象一下这个例子: 创建一个线程向量,所有线程都执行以下函数: “char*flag”指向一个标志,表示函数停止执行。 例如,向量包含10个线程,它们都在执行。然后将线程号3的标志设置为零。(向量中的第4个线程,因为向量从零开始。) 好的做法是然后加入线程。 向量现在将包含多少st