axios 我怎样才能阻止一个函数在ReactJS中执行?

1rhkuytd  于 2023-01-13  发布在  iOS
关注(0)|答案(1)|浏览(132)

我正在尝试停止执行此mutate函数。在我调用List.js中的mutate()之后,当我在浏览器中检查网络时,我可以看到mutate始终在执行。我需要执行一次。这是我输出数据的List.js。

import React, {useEffect} from 'react';
import ListItem from './ListItem'
import FetchData from './FetchData';

    function List() {
      const {
        data,
        loading,
        mutate,
      } = FetchData();
    
      //this needs to stop using interval how?
      mutate();
    
      return (
        <ul>
          {loading && <div>Loading</div>}
          {!loading && (
            <>
              {data.map(item => (<ListItem key={item.id} id={item.id} name={item.name} complete={item.complete} />))}
            </>
          )}
        </ul>
      )
    }
    
    export default List

这是FetchData.js,变异的地方在这里。

import { useEffect, useState} from 'react';
import axios from 'axios';

const FetchData = () => {
  const [data, setData] = useState({});
  const [loading, setLoading] = useState(true);

  const fetchData = async () => {
    try {
      const { data: response } = await axios.get(
        "http://localhost/todolistci/backend/index.php/todos/view",
        { crossDomain: true }
      );
      setData(response);
    } catch (error) {
      console.error(error);
    }
    setLoading(false);
  };

  const mutate = () => fetchData();

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

  return {
    data,
    loading,
    mutate,
  };
};

export default FetchData;

我无法停止执行mutate,我需要它停止使用interval如何?这是应用程序的图像。enter image description here

qxsslcnc

qxsslcnc1#

不知道你想用这个mutate函数做什么,但是我可以解释这个问题:
因为mutate()是在组件内部声明的,而不是在useEffect中声明的,所以它将在组件渲染和重新渲染的任何时候被调用。
所以这里发生的事情,按顺序(有点)是:
1.您的组件呈现数据为空{};
1.你的组件有一个useEffect()来获取数据,所以当它第一次呈现时就会被触发。2这很好。
1.与此同时,mutate()被调用,它也执行与use效果中完全相同的fetch调用。
1.现在您有两个并发的API调用被发送出去。
1.一段时间后,两个API调用中的一个首先响应,这对我们的目的来说并不重要。
1.在这个响应上,我们调用setData(...)并更改状态数据值。
1.因为数据改变了,组件重新呈现,这很好。
1.因为我们的组件重新呈现,mutate()被再次调用。哦,不。我们现在再次获取数据,将再次setData(...),数据状态值被更改,我们的组件再次重新呈现...我们陷入了循环。
最重要的是,当两个fetchData()调用中的第二个调用返回时,组件中有一个额外的rerender,但这并不重要,因为无论如何它都是坏的。
如果你去掉了mutate(),我想它可以正常工作?
我不知道变异的目的是什么,除了引起荒谬的行为,所以我不能建议如何解决这个问题。哈哈。

相关问题