【问题标题】:React respond with multiple console.log使用多个 console.log 响应响应
【发布时间】:2021-09-03 06:12:23
【问题描述】:

我做了一个功能组件,我的 axios 请求响应 2 个未定义和 1 个响应 200。我不明白为什么?

这是我的组件:

import { UidContext } from "../components/AppContext"
import React, { useContext, useEffect, useState } from "react"
import axios from "axios"

export default function Balance() {
    const uid = useContext(UidContext)
    const [userWallet, setUserWallet] = useState()

    useEffect(() => {
        if (uid !== null) {
            axios.get(`${process.env.REACT_APP_API_URL}api/balance/${uid}`)
                .then((res) => (setUserWallet(res.data[0])))
        }
    }, [uid]);

    console.log(userWallet);

    return (
        <section>
            Test
        </section>
    )
}

这是回复: Result

(ps : 我在 App.js 中使用 React Context 来存储用户的 ID)

【问题讨论】:

    标签: reactjs axios react-hooks components console.log


    【解决方案1】:

    console.log 将在您的组件每次渲染时运行,并且您的组件每次或道具更改、状态更改或在这种情况下上下文更改时都会重新渲染。所以我相信这就是正在发生的事情:

    1. 组件的首次渲染(“安装时”),userWallet 未定义。
    2. 组件的第二次渲染(“上下文更改”),uid 由上下文设置,从而触发重新渲染。
    3. 第三次渲染(“因为setUserWallet”),userWallet 不是未定义的。

    我想指出,我相信您的请求只运行了 1 次。如果你把console.log移到axio promise的thencb,那么你会看到它只运行了1次,除非uid对象经常变化,那么每次uid变化都会再次调用请求

    【讨论】:

    • 好的,非常感谢,你说得对。在.then 中,它只显示一个日志。我这样做的方式是好方法吗?还是有更好的优化?
    • 没问题!是的! @JohanBRAZILLIER 我想你可以做的一件事是让你的组件变得更干净一点,就是将所有获取逻辑移动到一个自定义钩子,比如 useUserWallet,你在同一个地方有 useContext、useState 和 useEffect,并且在您将拥有的 Balance 组件:const userWallet = useUserWallet()。这样,获取用户钱包的逻辑不是 Balance 组件的责任
    • 好主意。非常感谢
    猜你喜欢
    • 2016-11-30
    • 2015-04-23
    • 1970-01-01
    • 1970-01-01
    • 2019-08-05
    • 1970-01-01
    • 2019-10-01
    • 2021-05-31
    • 1970-01-01
    相关资源
    最近更新 更多