gpt4 book ai didi

javascript - 什么时候使用没有依赖关系的 useEffect 与直接赋值?

转载 作者:行者123 更新时间:2023-12-05 01:30:48 25 4
gpt4 key购买 nike

我正在编写一个 React Hook ,它允许我在我的组件中使用 setInterval。为此,我需要在 ref 中保留最新版本的回调,以便稍后可以从间隔范围访问它。

到目前为止,这是我的代码:

import { useRef, useEffect } from 'react'

export default function useInterval(
callback: () => void,
delay: number | null,
) {
const callbackRef = useRef(callback)

// Remember the latest callback.
useEffect(() => {
callbackRef.current = callback
})

useEffect(() => {
// Don't schedule if no delay is specified.
if (delay === null) {
return
}

const id = setInterval(() => callbackRef.current(), delay)

return () => clearInterval(id)
}, [delay])
}

我的问题是关于 useEffect 的第一个实例,其中最新值被传递给 ref。根据 React 文档,此代码将在我的组件呈现后执行。

我可以想象这在将 ref 传递给元素时很有用,因此您可以确保它在呈现后具有值。但是,如果我的代码不关心组件何时呈现,将其保留在 useEffect 中是否仍然有意义?

我重写代码如下是否有意义:

import { useRef, useEffect } from 'react'

export default function useInterval(
callback: () => void,
delay: number | null,
) {
const callbackRef = useRef(callback)

// Remember the latest callback.
callbackRef.current = callback

useEffect(() => {
// Don't schedule if no delay is specified.
if (delay === null) {
return
}

const id = setInterval(() => callbackRef.current(), delay)

return () => clearInterval(id)
}, [delay])
}

最佳答案

什么时候使用没有依赖的 useEffect 还是直接赋值?

来自文档:

The Effect Hook lets you perform side effects in function components

  • 没有依赖项(或 undefined 作为依赖项)的 useEffect 将在第一次渲染和每次后续重新渲染时运行,但是总是作为副作用,即组件呈现之后。
  • 直接分配(同步操作)将在第一次渲染和每次 后续重新渲染时运行,但总是在渲染周期中运行。它可能会影响性能或延迟渲染。

那么,什么时候使用哪一个?这取决于您的用例。

在这个(有问题的)用例中使用哪个?

我会说都不是

useEffect(() => {
callbackRef.current = callback
})

也不

callbackRef.current = callback

在这个用例中似乎是正确的。

因为我们不想在每次重新渲染时都进行分配 - callbackRef.current = callback。但我们希望在 callback 发生变化时执行此操作。所以,下面的看起来更好:

useEffect(() => {
callbackRef.current = callback
}, [callback])

您可能会看到 this blogthis related post .


一个演示,显示一个效果作为副作用运行(Log inside effect 总是最后一个):

function useInterval(callback, delay) {
const callbackRef = React.useRef(callback)

React.useEffect(() => {
callbackRef.current = callback
}, [callback])

React.useEffect(() => {
if (delay !== null) {
const id = setInterval(() => callbackRef.current(), delay)
return () => clearInterval(id)
}
}, [delay])
}

function Demo() {
const [count, setCount] = React.useState(0)

function doThis() {
setCount(count + 1)
}

useInterval(doThis, 1000)

console.log('log - before effect')
React.useEffect(() => {
console.log('log inside effect')
})
console.log('log - after effect')

return <h1>{count}</h1>
}

ReactDOM.render(<Demo />, document.getElementById('root'))
<script crossorigin src="https://unpkg.com/react@17/umd/react.production.min.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.production.min.js"></script>
<body>
<div id="root"></div>
</body>

关于javascript - 什么时候使用没有依赖关系的 useEffect 与直接赋值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66803614/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com