Reactjs 我如何做出反应';s使用Effect停止无限循环中的重新加载程序,即使指定了依赖项?

Reactjs 我如何做出反应';s使用Effect停止无限循环中的重新加载程序,即使指定了依赖项?,reactjs,react-hooks,Reactjs,React Hooks,我正在使用react和mongodb开发一个小型CRUD fullstack应用程序,我遇到了一个问题,我使用useffect向服务器发出axios get请求,以获取我的所有TODO。问题是,useffect完成了它的工作,但它也会无限重复。这是我的组件: export default function () { ... const [todos, setTodos] = useState([]); const currentUser = JSON.parse(loca

我正在使用react和mongodb开发一个小型CRUD fullstack应用程序,我遇到了一个问题,我使用
useffect
向服务器发出axios get请求,以获取我的所有TODO。问题是,
useffect
完成了它的工作,但它也会无限重复。这是我的组件:

export default function () {
    ...
    const [todos, setTodos] = useState([]);
    const currentUser = JSON.parse(localStorage.getItem('user'))._id;

    useEffect(() => {
        async function populateTodos () {
            try {
                const res = await axios.get(`http://localhost:8000/api/all-todos/${currentUser}`);
                setTodos(res.data);
            } catch (err) {
               if (err.response) {
                    console.log(err.response.data);
                    console.log(err.response.status);
                    console.log(err.response.headers);
               } else if (err.request) {
                   console.log(err.request);
               } else {
                   console.log('Error: ', err.message);
               }
            }
        }

        populateTodos();
    }, [todos]);

    console.log(todos);

    return (
        ...
    );
}

所以我期望发生的是,
console.log
仅在todo更改时打印,比如添加新todo等,但它会永远打印。

您说过,您需要首先获取
todo
,并且在
todo
更改时获取。我可以建议您使用另一种方法,使用另一个变量,如下所示:

const TodosComponent = (props) => {
    const [todos, setTodos] = useState([]);
    const [updatedTodos, setUpdatesTodos] = useState(true);

    const fetchFunction = () => {
        // In here you implement your fetch, in which you call setTodos().
    }

    // Called on mount to fetch your todos.
    useEffect(() => {
        fetchFunction();
    }, []);

    // Used to updated todos when they have been updated.
    useEffect(() => {
        if (updatedTodos) {
            fetchFunction();
            setUpdatesTodos(false);
        }
    }, [updatedTodos]);

    // Finally, wherever you update your todos, you also write `updateTodos(true)`. 
}

想想这个流程:当
todos
发生变化时运行效果。在效果中更新
todo
的值。确实要在
todo
更改时运行效果吗?或者axios请求应该只发生一次吗?我想以初始值运行effect来填充状态(todos),然后todos中发生每一次时间更改。我明白你的意思,我更新setTodos,然后把todos作为依赖项,它就一直这样循环。这意味着我必须定义一个新变量,并将其设置为useEffect依赖项,并在每次更改TODO时更新新的状态。Idk。我会尝试一下,它会无限地运行,因为每次TODO改变时,useEffect都会运行,而useEffect也会改变TODO,从而使它自己一次又一次地运行。注意:为了避免使用useEffect的无限循环,useEffect不能更改/变异其依赖项。