- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
考虑以下模式:
const Comp = ({ handler })=> {
// handler is some callback of the form ( ) => void
useSomeHook(handler);
//...
}
function useSomeHook(cb) {
const ref = useRef()
useEffect(() => {
ref.current = cb; // update ref before second useEffect
})
useEffect(() => {
// use the current (most recent) ref value
const iv = setInterval(() => { ref.current() }, 3000)
return () => { clearInterval(iv) };
}, []) // run only after first render
}
问题:我可以相信这个事实吗?首先 useEffect
总是在第二秒之前执行 useEffect
,所以ref
已经更新了吗?
背景:我的目的是避免记住Comp
中传入的回调。 ( useCallback
) 并设置 cb
作为部门我特别感兴趣的是,这个可变引用模式在 React 世界中是否有效 - 上面只是一个人为的示例。
我想,读完 a tweet from Dan Abramov 后,答案将是明确的“是!” 。不过,following issue状态:
We do not make guarantees about sibling order, whether within a component or between siblings. This is because strong guarantees there hinder refactoring. Within a component, you should be able to re-order Hooks—especially, custom ones.
我对上述陈述的解释是否错误 - 或者链接有点矛盾?感谢任何澄清。
PS:我知道linked post 。这个问题更多的是关于一般模式、官方文档以及与提到的矛盾(?)陈述相关的问题。
谢谢!
最佳答案
调用它们的顺序很重要,据我所知,组件中的两个 useEffect 调用将始终以相同的顺序运行。这就是 React 识别哪个钩子(Hook)是哪个钩子(Hook)的方式(基于顺序)。
出于上述原因,您不能做的主要事情之一是有条件地运行钩子(Hook):React 会根据钩子(Hook)在组件中调用的顺序(索引)来跟踪调用的钩子(Hook)。
这句话讨论的是组件中以及父组件和子组件之间的清理调用顺序。通常,您在清理部分所做的事情不应影响其他 Hook 。通常你要做的就是清除钩子(Hook)中任何持久的副作用。诸如取消 API 调用和清除间隔之类的事情。
We guarantee that parent effects are destroyed before the child ones. The reason for this is that parents often tend to depend on some resource created by the child. Such as removing a listener from a DOM node managed imperatively by a child. If the child disposes its resources first, the parent might not be able to properly clean itself up. This is not specific to Hooks — it’s how componentWillUnmount works as well.
We do not make guarantees about sibling order, whether within a component or between siblings. This is because strong guarantees there hinder refactoring. Within a component, you should be able to re-order Hooks—especially, custom ones. Between siblings, it is expected that you can re-order them safely too. It is also common that only one sibling updates or unmounts, so dependencies between siblings cannot be reliable anyway.
父子之间的顺序已设置。例如,渲染 2 个子组件的父组件。
<Parent>
<Child/>
<Child/>
</Parent>
编辑:这就是我重构代码的方式:
我会确保在初始 useRef 中包含 cb,然后使用第一个效果的依赖数组中的 cb 来更新引用。
然后你要确保清除第二个效果中的间隔。
const Comp = ({ handler }) => {
// handler is some callback of the form ( ) => void
useSomeHook(handler);
//...
};
function useSomeHook(cb) {
const ref = useRef(cb);
useEffect(() => {
ref.current = cb; // update ref before second useEffect
},[cb]);
useEffect(() => {
const id = setInterval(() => {
ref.current();
}, 3000); // use the current (most recent) ref value
return () => {
clearInterval(id);
};
}, []); // run only after first render
}
关于reactjs - 我可以依赖组件中的 useEffect 顺序吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61121856/
我知道没有数组的 useEffect() 只在第一次渲染时运行回调。 那么useEffect(()=>{},[])和没有useEffect()的区别是什么。 我的意思是: function myCom
我的场景很少,我想了解渲染和性能方面的差异。 下面显示的示例是一个简单的函数,但请考虑一个更复杂的函数以及一个异步函数。 场景 1:定义函数并在 useEffect 中调用它。 useEffect((
我需要添加一些与 React 之外的对象交互的事件处理程序(以 Google map 为例)。 在这个处理函数内部,我想访问一些可以发送给这个外部对象的状态。 如果我将状态作为依赖项传递给效果,它可以
要限制 useEffect 在第一个渲染上运行,我们可以这样做: const isFirstRun = useRef(true); useEffect (() => { if (isF
我有一个产品组件,它显示某个类别的产品。CategoryId 从路由参数中获取,然后用户可以对产品进行分页。所以有2个useEffect,一个是改变categoryId的时候,另一个是改变当前页码的时
我有一个产品组件,它显示某个类别的产品。CategoryId 从路由参数中获取,然后用户可以对产品进行分页。所以有2个useEffect,一个是改变categoryId的时候,另一个是改变当前页码的时
我的状态宽度随着窗口大小的调整而变化,showFilters作为 Prop 从true变为false。我想在卸载时删除监听器。因此,我为每个条件使用了三个 useState。那么,我可以做任何重构来在
我正在开发一个基于对象键管理字符串数组的函数。假设它看起来像这样: import React, { useState, useEffect } from "react"; import FieldCo
新的 React Hooks 功能很酷,但有时会让我感到困惑。特别是,我将此代码包装在 useEffect Hook 中: const compA = ({ num }) => { const [
我想将其转换为 useEffect钩: 代码 componentDidMount () { this.messagesRef.on('child_added', snapshot => {
这是我的代码部分。一切正常,但 eslint 给出错误。 React Hook useEffect has missing dependencies: 'dispatch' and 'getData'
当组件安装时,我需要从两个 API 端点获取数据。现在我有: useEffect(() => { dispatch(loadSomeDataOne()); }, [dispatch])
当组件安装时,我需要从两个 API 端点获取数据。现在我有: useEffect(() => { dispatch(loadSomeDataOne()); }, [dispatch])
在 React DOCs 中,关于 useEffect() 钩子(Hook),我们得到: “使用 useEffect 安排的效果不会阻止浏览器更新屏幕。” Tip Unlike componentDi
我一直试图了解何时取消订阅(useEffect 中的回调)被准确调用。 这是codepen链接:https://codepen.io/deen_john/pen/eYmNdMy 代码 : const
当对状态、效果、上下文等使用钩子(Hook)时,我这样做: import React, { useState, useEffect, useContext } from 'react'; 但是,我注意
我正在尝试像下面这样的 useEffect 示例: useEffect(async () => { try { const response = await fetch(`ht
我在我的 React 应用中构建了一个简单的点赞、书签功能。 const [liked, setLiked] = useState(); const [bookmarked, setBookmarke
我想了解为什么在代码块的底部使用 useEffect,以及它的用途。我认为它与组件生命周期和避免无限循环有关,但我无法完全理解它并全面了解这一切。如果有人能向我解释幕后发生的事情,以及 useEffe
useEffect(() => { return history.replace({ pathname: "path/A", }); }, []); useEffe
我是一名优秀的程序员,十分优秀!