向后端发出请求并使用结果设置状态会创建无限循环 - React hooks useEffect

Making a request to back end and setting state with results creates infinite loop - react hooks useEffect

当用户进入编辑页面时,他们将获得正在编辑的任务的 ID。我需要向后端发出请求并使用任务文本设置一次状态。

我的工作:

let { id } = useParams();
const [task, setTask] = useState({ text: "", id: id });

useEffect(() => {
  axios
    .get(`/find/${id}`)
    .then((res) => {
      setTask({ ...task, text: res.data.text });
    })
    .catch((err) => console.log(err));
  // eslint-disable-next-line
  }, [])

如果我删除 // eslint-disable-next-line,我会收到一条错误消息,告诉我添加任务和 ID 作为依赖项,但是当我这样做时,我陷入了无限循环。

有没有一种方法可以向后端发出请求并设置一次状态,而不必隐藏 eslint 错误。

循环是无限的原因是因为当您使用 spread 参数调用 setTask 时,您使用的是 useState 中的 task

为防止这种情况,请在 useEffect 中调用 setTask(task => ({ ...task, text: res.data.text }));,以便它使用范围内的当前 task 来计算新任务状态。然后你将能够将 [task, id] 作为挂钩依赖项。

我能够通过 props 传递更新方法并将该方法添加为依赖项来使其工作:

useEffect(() => {
const updateEditText = props.updateEditText;

axios
  .get(`/find/${id}`)
  .then((res) => {
    updateEditText({ id: id, editText: res.data.text });
  })
  .catch((err) => console.log(err));

}, [id, props.updateEditText]);