首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用useFetch钩子在useEffect中

调用useFetch钩子在useEffect中
EN

Stack Overflow用户
提问于 2021-05-28 06:14:23
回答 2查看 2.2K关注 0票数 0

我找到了一个非常有趣的钩子,我想在useEffect中使用这个钩子(这违反了规则)

代码语言:javascript
复制
const useFetch = (url, options) => {
  const [response, setResponse] = React.useState(null);
  const [error, setError] = React.useState(null);
  React.useEffect(() => {
    const fetchData = async () => {
      try {
        const res = await fetch(url, options);
        const json = await res.json();
        setResponse(json);
      } catch (error) {
        setError(error);
      }
    };
    fetchData();
  }, []);
  return { response, error };
};
代码语言:javascript
复制
function App() {
  const res = useFetch("example.com", {});

   useEffect(() => {
       // use the hook and make a secondary request 
   }, [])

为了支持这一点,我需要做什么修改?在useEffect内部不能调用AFAIK钩子

可能是一个新参数,它将setUrl并再次运行它?

EN

回答 2

Stack Overflow用户

发布于 2021-05-28 10:02:34

似乎您希望在某些状态或变量更改时在钩子中执行fetch请求。

您不能有条件地调用钩子,也不能根据文档中提到的钩子规则在另一个钩子中执行它。

要做您想做的事情,您可以修改您的自定义钩子以接受数组作为一个依赖项传递给它内部的useEffect,并且当任何依赖项发生变化时,它都会调用api。

代码语言:javascript
复制
const useFetch = (url, options, deps = []) => {
  const [response, setResponse] = React.useState(null);
  const [error, setError] = React.useState(null);
  React.useEffect(() => {
    const fetchData = async () => {
      try {
        const res = await fetch(url, options);
        const json = await res.json();
        setResponse(json);
      } catch (error) {
        setError(error);
      }
    };
    url && fetchData();
  }, deps);
  return { response, error };
};

然后把它当作

代码语言:javascript
复制
function App() {
  const res = useFetch("example.com", {}, [someVariable]);

  ...
}
票数 2
EN

Stack Overflow用户

发布于 2021-05-28 06:24:47

您不能有条件地调用useFetch,也不能在任何回调(即useEffect回调)中调用它(请参阅钩子规则),但您可以利用这样的事实,即每个呈现都以相同的顺序调用钩子。执行条件测试,并设置传递给第二个useFetch钩子的URL。在发出请求之前,更新useFetch钩子以检查是否是真实的url

代码语言:javascript
复制
const useFetch = (url, options) => {
  const [response, setResponse] = React.useState(null);
  const [error, setError] = React.useState(null);
  React.useEffect(() => {
    const fetchData = async () => {
      try {
        const res = await fetch(url, options);
        const json = await res.json();
        setResponse(json);
      } catch (error) {
        setError(error);
      }
    };
    url && fetchData();
  }, []);
  return { response, error };
};

..。

代码语言:javascript
复制
function App() {
  const res = useFetch("example.com", {});

  let url = "";
  if (someCondition) {
    let url = ""example2.com"";
  }
  const res2 = useFetch("example.com", {});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67733739

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档