useEffect 详尽的依赖规则令人困惑

Dar*_*ava 7 reactjs eslint react-hooks

我在 stackoverflow 上发现了一些与此相关的问题,但没有一个能满足我在使用useEffect. 假设我有一些这样的代码:

const ApiViewer = (props) => {
    const [result, setResult] = useState('')

    useEffect(async () => {
        setResult(await callApi(props.valueThatWillChangeButIOnlyCareAboutItsInitialValue))
    }, [])

    return <div>{result}</div>
} 
Run Code Online (Sandbox Code Playgroud)

exhaustive-deps规则将抛出,要求我放入props.valueThatWillChangeButIOnlyCareAboutItsInitialValue依赖项数组。我不想这样做,因为我只想要初始值。我可能会在某个地方的单独效果中使用该道具。

我也想不出另一种写法。

我也遇到其他人似乎遇到的问题,即使用我知道永远不会改变的功能/等。我不想将它们添加到这个数组中,看起来很愚蠢。

Dan Abramov 表示,通常禁用它是一个错误,并且稍后会严重影响您。我多年来一直以这种方式使用它,直到这个规则开始在新项目中出现之前我没有发现任何问题。

我使用 React 完全错误吗?

Ros*_*len 6

将“详尽的依赖”视为真正的规则将确保组件按预期更新。

如果您想忽略对给定 prop 的更新,您可以通过使用useRef. 您不会在 a 中收到任何警告,useEffect因为从 中返回的基础对象useRef永远不会改变。使用initial前缀也会让下一个开发人员明白这一点。

const ApiViewer = (props) => {
    const [result, setResult] = useState('')
    const initialValueThatWillChangeRef = useRef(props.valueThatWillChange);

    useEffect(async () => {
        setResult(await callApi(initialValueThatWillChangeRef.current))
    }, [])

    return <div>{result}</div>
} 
Run Code Online (Sandbox Code Playgroud)

您可以通过忽略“详尽的依赖项”规则来构建一切按预期工作的示例,但您最终会遇到由于难以调试的原因而中断的微妙情况。