reactjs - 协程作为对 useEffect 的依赖

标签 reactjs

当前我有以下自定义钩子(Hook):

function useSecurity() {
  const { getAccessTokenSilently } = useAuth0()

  const getAccessToken = async () => {
    return await getAccessTokenSilently()
  }
  
  const getAuthHeader = async () => {
    return { Authorization: `Bearer ${await getAccessToken()}` }
  }
   
  return { getAuthHeader }
}
在我使用它的页面中,我有:
const { getAuthHeader } = useSecurity()

useEffect(() => {
  async function fetchData() {
    ...
    }
  }
  fetchData()
}, [getAuthHeader])
这段代码会导致无限循环页面加载,我假设是因为 getAuthHeader 是一个协程。我知道我不必将它包含在 deps 中(并忽略 eslint 警告),但是有没有办法可以将它包含在 deps 中而不触发无限循环?

最佳答案

您的代码的问题是 getAuthHeader像钩子(Hook)一样使用,但它实际上是异步方法。您可以尝试这样设置:

function useSecurity() {
  const [token, setToken] = useState('');
  const { getAccessTokenSilently } = useAuth0();

  useEffect(() => {
    getToken = async () => {
      const token = await getAccessTokenSilently();
      setToken(token)
    }

    getToken();
  }, []);
   
  return { token }
}
这是您将 token 存储在 useSecurity 的状态下。钩子(Hook),然后像这样使用它:
const { token } = useSecurity()

useEffect(() => {
  async function fetchData() {
    ...
    }
  }
  fetchData()
}, [token])

关于reactjs - 协程作为对 useEffect 的依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64201918/

相关文章:

javascript - react 键盘和输入之间的原生边距

javascript - 默认根据id打开可折叠菜单

javascript - ReactJS:需要使用 onClick 函数更改卡片样式

javascript - 如何以这种方式设计/显示这个数组? - CSS/Javascript

javascript - 防止 parent 被点击,同时允许 child 捕捉触摸

reactjs - React-Admin:如何访问没有 `source` 的值?

javascript - 从对象数组中的数组中选择组件的值

javascript - React 组件内部函数的条件渲染不起作用

reactjs - 在yarn.lock中发现serialize-javascript漏洞

reactjs - Electron react 设置文件下载路径