我创建了一个定制钩子,它接受一个URL并返回数据

import { useEffect, useState } from "react";

export function useHttp({ url }: { url: string }) {
  const [data, setData] = useState<any>(null);

 useEffect(() => {
    const controller = new AbortController();
    const signal = controller.signal;
    fetch(url, { signal })
      .then((res) => res.json())
      .then((data) => setData(data))
      .catch((err) => {
        if (err.name === "AbortError") {
          console.log("successfully aborted");
        } else {
          // handle error
        }
      });

    return () => {
      // cancel the request before component unmounts
      controller.abort();
    };
  }, []);

  return data ;
}

我正在使用钩子在我的主页中获取数据,这很好用

import { useState } from "react";
import { useHttp } from "./useHttp";
import "./App.css";

type person = { name: string; id: number };
function App() {
  const [selectedId, setSelectedId] = useState<number>(1);
  const people = useHttp({ url: "https://jsonplaceholder.typicode.com/users" });

  return (
    <div className="App">
      {(people as unknown as person[])?.map(({ id, name }) => (
        <button key={id} onClick={() => setSelectedId(id)}>
          {name}
        </button>
      ))}
      <br />
      <InnerComponent selectedId={selectedId} />
    </div>
  );
}

我陷入困境的部分是,我试图在子组件中再次重用挂钩,以获取有关依赖于主组件的一些值的详细信息


const InnerComponent = ({ selectedId }: { selectedId: number }) => {
  console.log(selectedId)
  const person = useHttp({
    url: `https://jsonplaceholder.typicode.com/users/${selectedId}`,
  });

  return <div>{person?.name}</div>;
};

我还可以看到属性值已经更改,我的钩子没有重新运行,我如何才能在不重写useEffect中的逻辑的情况下实现这一点?

我希望钩子在props 更改时重新运行并获取结果,但它在初始渲染中只运行一次

推荐答案

就像另一个答案所说的那样,您的钩子依赖于url个参数,因此它应该包含在useEffect调用的依赖数组中.

useEffect(() => {
  // ...
}, [url]);

此外,您应该花一些时间学习如何在项目中配置eslint.大多数模板中的默认eslint配置将强制您将所有依赖项包括在依赖项数组中.这样,您就不必每次都记住手动执行此操作.

Reactjs相关问答推荐

从另一个组件更改组件中const的状态

使用Thattle和Use Effect setTimeout进行搜索有什么不同

梅X折线图无响应

在动态React组件中删除事件侦听器

这两个子元素在Reaction Native中使用的有什么不同?

Reaction-路由-DOM v6与v5

onClick 事件处理程序未应用于样式组件

Javascript - 正则表达式不适用于 MAC OS - 编码?

Mui Datepicker 设置了错误的日期

React 组件列表中的第一个计时器正在获取值 NaN

单击按钮时如何添加或删除 3d 对象

react 测试库不测试包含 react 路由 dom V6 的组件

页面不显示

React:如何设置光标 Select

antd 找不到 comments

React - 仅在变量为真时显示项目

我刚刚部署了我的 Vite React 站点,但我的图标/图像没有部署

SonarCloud 代码覆盖率不适用于 Github Action

useEffect 仅在跟随链接后有效,不适用于直接链接

添加禁用的默认选项以 Select