【问题标题】:Can a useMemo memoized value be updated with useEffect from within the component?可以使用组件内的 useEffect 更新 useMemo 记忆值吗?
【发布时间】:2022-04-15 18:32:25
【问题描述】:

我正在尝试呈现必须通过useMemo 传递的数据。我从 api 调用中获取数据,所以我调用useEffect。初始渲染工作返回一个空数组,但是一旦我调用 api,数据就不会更新。

import React from 'react'
import {fetchAccounts} from '../utils/api'

export default function Accounts() {
    const [accounts, setAccounts] = React.useState([])

React.useEffect(() => {
    setLoading(true)
    fetchAccounts().then((data) => {
        setAccounts(data)
    })
}, [])
const data = React.useMemo(() => accounts, [])

return <p>{JSON.stringify(data)}</p>}

那么这可以在单个组件中工作吗?还是必须创建自定义挂钩?

【问题讨论】:

    标签: reactjs use-effect react-usememo


    【解决方案1】:

    数据未更新,因为您缺少依赖数组中的值。

    const data = React.useMemo(() => accounts, [accounts]);
    

    因此在这种情况下,使用useMemo 没有意义,因为无论如何状态都是稳定的,直到您更改状态。

    【讨论】:

      【解决方案2】:

      您使用 useMemouseEffect 与 [] 的依赖关系意味着它在安装期间运行意味着它运行一次

      让我们看看 useMemo() 是如何工作的

      1. 如果发生任何变化,它将每次运行

        useMemo(()=>{

        })

      2. 它会在组件安装期间运行一次

        useMemo(()=>{

        },[])

      3. 如果 arr

        中发生任何更改,它将每次运行

        useMemo(()=>{

        },[arr])

      如果你有疑惑,useEffect() 和 useMemo() 有什么区别

      useMemo() 仅在发现任何更改时运行,如果发现任何更改,则将最新更改与以前的更改进行比较,然后 useMemo 运行

      如果更新的状态与之前的状态相同,则每次更改都会运行 useEffect() useEffect don't care it start re render the component.

      【讨论】:

        猜你喜欢
        • 2021-09-29
        • 2021-07-05
        • 2019-09-25
        • 2019-11-16
        • 1970-01-01
        • 1970-01-01
        • 2021-05-23
        • 2021-06-09
        • 1970-01-01
        相关资源
        最近更新 更多