【问题标题】:React useEffect is not triggering on link to route changeReact useEffect 不会在链接到路由更改时触发
【发布时间】:2021-09-10 00:22:05
【问题描述】:

我在一个名为 AllJobs 的组件中有以下代码

                            <TableCell>
                                    <Link
                                        to={`/job/${item.id}`}
                                        style={{ textDecoration: 'underline', color: 'black' }}
                                    >             
                                     {item.id}
                                    </Link>
                            </TableCell>

当用户点击此链接时,它会在我的 App.js 文件中按照以下路由调用组件 JobDetails

<Router>
  <Switch>
    <Route exact path="/job/:id">
      <JobDetails />
    </Route>
  </Switch>
</Router>

我的问题是,在我的 JobDetails 组件中,我有一个未触发的 useEffect 并且不确定为什么它不是我需要它来调用我的 getJob() 函数?

export default function JobDetails() {

const { id } = useParams();

const [currentJob, setCurrentJob] = useState([]);

const getJob = async () => {
    console.log("Inside JobDetails for id:", id)
    try {
      const response = await fetch(`http://localhost:3000/get-job/${id}`);
      const currentJobRec = await response.json();
      console.log("current-job", currentJobRec)
          
      setCurrentJob(currentJobRec);
    } catch (err) {
      console.error(err.message);
    }
  }; 

  useEffect(() => {
    getJob();
  }, []);  

由于我需要触发 useEffect(),任何人都可以帮助我解决我所缺少的内容。

【问题讨论】:

标签: javascript reactjs react-router react-hooks


【解决方案1】:

这是经典的陷阱。您可以像这样触发getJob

// IIFE
useEffect(() => {
    (async () => await getJob())();
}, []); 

现在说说为什么异步调用在 useEffect 中不起作用?

首先,让我们看看 React 文档中的 useEffect。

useEffect(() => {
  const subscription = props.source.subscribe();
  return () => {
    // Clean up the subscription
    subscription.unsubscribe();
  };
});

注意,这会返回一个函数(清理函数)。该函数在组件卸载时执行(如果依赖数组为空)。

现在回到你的例子

useEffect(() => {
    getJob();
}, []);

getJob 被定义为async 函数,因此必然返回Promise。因此,不是清理,而是返回 Promise 导致这个混乱。

【讨论】:

  • 欣赏解释,但不幸的是这仍然没有奏效。函数 getJob() 仍未通过 useEffect 调用。会不会和link to路由过程有关?
  • 我在 IIFE 中添加了await。如果这仍然没有任何效果,请检查 JobDetails 是否正在挂载。
  • 这根本不准确。请参阅:React Hook Warnings for async function in useEffect 以获得对 useEffect 中异步的清晰解释
  • @pilchard 很遗憾地通知您,丹的方式只是另一种方式。两者都是正确的。想象一下,您有 5 个异步调用要在 useEffect 内触发,它们甚至可能在其他模块中被调用(因此是导出函数)。现在,您认为在其中定义整个函数是个好主意吗?没错,不是。因此,根据用例,我们可以做出决定。另外,我会鼓励你不要盲目地继续你看到的例子。 React 旨在通过多种方式实现一个结果。
  • 你看答案了吗?它还介绍了使用 useCallback() 并将其添加到依赖数组中。关键是,如果您已经在 useEffect 内部或外部定义了函数,则不需要 IIFE。另外,OP 的问题与异步无关,而是与路由/挂载有关。
【解决方案2】:

看来您设置路线和链接的方式非常正确。老实说,我并不完全确定确切的问题是什么,但我建议这样做:

每当id 参数更改时再次重新运行效果/getJob():将id 添加到您的依赖关系数组中:

useEffect(() => {
    getJob();
  }, [id]);

【讨论】:

  • 很遗憾这并没有触发效果。
猜你喜欢
  • 2020-01-19
  • 2018-08-22
  • 1970-01-01
  • 2021-10-12
  • 1970-01-01
  • 2020-01-25
  • 2021-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多