javascript - 如何根据变量值使 useEffect react 钩子(Hook)重新渲染?

标签 javascript reactjs axios react-hooks use-effect

所以我得到了这个组件:

export default function () {
    const [todos, setTodos] = useState([]);


    useEffect(() => {
        function populateTodos () {
            axios.get(`http://localhost:8000/api/all-todos`)
                .then(res => setTodos(res.data))
                .catch(err => console.log(err));
        }

        populateTodos();
    }, []);

    console.log(todos);

    return (
        <div>
            ...
        </div>
    );
}

我正在使用 useEffect Hook 从数据库中获取所有待办事项,并且工作正常。问题是我不知道如何使用 useEffect 在对 todos 数组进行修改(例如添加、删除或更新)时触发重新渲染。如果我为 useEffect 的依赖数组提供 todos 变量,我会在控制台中得到无限循环日志记录。 如何在 todos 数组更新时使用 useEffect 触发重新渲染?

最佳答案

问题是 useEffect 内部没有逻辑,请参见下面的代码

    const [todos, setTodos] = useState([]);

    useEffect(() => {
        setTodos([1])
    }, [todos])

这也会产生无限循环。但我们始终赋予相同的值(value)。问题是,当它更新时,依赖关系为 true,因此它再次开始执行 useEffect()。您必须想出一些具体的逻辑,例如更改长度,或者您可以采用如下所示的新状态

    const [todos, setTodos] = useState([]);
    const [load, setLoad] = useState(false);

    useEffect(() => {
        function populateTodos () {
            axios.get(`http://localhost:8000/api/all-todos`)
                .then(res => setTodos(res.data))
                .catch(err => console.log(err));
        }

        populateTodos();
    }, [load])

    console.log(todos)
    return (
        <div>
            <button
            onClick={() => {
                todos.push(1)
                setLoad(!load)
            }}
            >cilck</button>
        </div>
    );

关于javascript - 如何根据变量值使 useEffect react 钩子(Hook)重新渲染?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60709740/

相关文章:

javascript - 添加动态行无法获取对创建的选择输入的引用

javascript - 使用 `object` 创建 `createElement` 标签会返回一个函数而不是对象

javascript - UI 自动化中的应用程序切换

javascript - 通过拖放响应大日历

http - 在 axios 中设置授权 header

javascript - OPTIONS 为 CORS 返回 200 后,Axios 不处理来自 POST 的 500

javascript/css transform + z-index 问题与谷歌浏览器

javascript - 状态更新但 react 组件不更新

javascript - 为浏览器编写 TSX 单元测试(JSX/React 的 TypeScript)

javascript - 带有 node.js 的 Axios - ReferenceError : XMLHttpRequest is not defined