反应只在加载时调用方法一次

Posted

技术标签:

【中文标题】反应只在加载时调用方法一次【英文标题】:React calling a method on load only once 【发布时间】:2020-01-25 19:13:20 【问题描述】:

我是 Hooks 的新手,遇到了一些让我追尾的案例。

希望有人可以解释或提供对我有意义的解决方案:

    在安装组件时仅加载一次方法会令人困惑。我试过这个方法,它有效,但不明白它。谁能给我解释一下:

    const useMountEffect = fun => useEffect(fun, [])
    
    useMountEffect(() => 
      if (!isEdit) handleAddRow()
    )
    
    const handleAddRow = () => 
      let appendArr = [...listArr, '']
      setListArr(appendArr)
    
    

关注这个话题: How to call loading function with React useEffect only once

我尝试只使用不依赖的 useEffect,而 eslint 不喜欢这样,他们建议添加一个跳过下一行,这看起来有点 hacky:

// eslint-disable-next-line

【问题讨论】:

【参考方案1】:

如果我是正确的,你想要类似于componentDidMount 生命周期方法的东西。 这样做的方法是

function MyComponent(props)
    useEffect(()=>
        // do stuff here...
    , []) // <-- empty dependency array
    return <div></div>

要了解发生了什么,您需要了解 useEffect 挂钩的工作原理。 使用没有任何依赖关系的 useEffect 挂钩将在每次某些状态或道具更改并导致重新渲染时触发效果。 但是如果我们将一个空数组作为依赖传递,它将作为效果不依赖于其他任何东西,所以它只会在组件挂载时触发。

【讨论】:

为什么这么多人提出问题然后不费心返回并通过单击答案作为“已回答”来奖励正确答案?问别人的时间而不奖励/感谢他们似乎不太好。我经常看到这种情况。回到问题并标记它有多难? 这不允许我运行一次外部函数,因为我必须将函数放在依赖数组中......在这些情况下我该怎么办? @KyleCalica-St 如果你的函数是在你的组件之外定义的,你不需要将它传递给依赖数组。【参考方案2】:

空数组 [] 参数告诉 useEffect() 只运行一次

它只会在挂载时运行一次,就像以前的 componentDidMount 一样

解释:

useEffect() 接受 2 个参数 - 你的函数和一个依赖数组

useEffect(
    yourFunction, // <- function that will run on every dependency update
    [] // <-- empty dependency array
) 

依赖数组参数告诉它何时运行你的函数。如果依赖项没有改变,它将不会再次运行。如果依赖项确实更新了,它将再次运行您的函数。

如果你传入一个空数组(没有依赖关系),那么函数只会在挂载时运行。

ESLint 缺少依赖错误

React Hook useEffect has a missing dependency: 'xxx'. Either include it or remove the dependency array  react-hooks/exhaustive-deps

ESLint 规则的原因是 useEffect() 设计为在每次依赖项更新时运行,它希望您将所有依赖项添加到该数组中。

要忽略这一点,您可以在依赖数组行上方添加:

// eslint-disable-next-line react-hooks/exhaustive-deps

【讨论】:

感谢您的回复。 1. 如果你离开 useEffect() 没有依赖,你会收到一个 eslint 错误。 2. 当我使用const useMountEffect = fun =&gt; useEffect(fun, []) 方法时,我没有收到 eslint 错误。有人能解释一下为什么吗? @DavidPell 依赖项参数不是必需的(我们可以在此处的源代码中看到 - github.com/facebook/react/blob/master/packages/react/src/…)。 ESLint 规则只是为了帮助您,因为您可能确实希望您的函数仅在输入更改时运行。 Dan Abv 在这里更深入地解释overreacted.io/a-complete-guide-to-useeffect 感谢乔纳森的文章! @DavidPell 这回答了你的问题吗?如果可以,您可以将其标记为已接受吗?

以上是关于反应只在加载时调用方法一次的主要内容,如果未能解决你的问题,请参考以下文章

从后台调用应用程序时调用方法

js页面加载时调用函数方法

怎么在页面加载时调用action中的方法

React + redux:连接组件加载时调用调度

Java类 初始化块

RecyclerView分页不起作用