PReact useEffect 不会在状态改变时触发

塞尔吉乌·顿茨

我想做一个递归函数,它基本上在每次文件夹下有一个子文件夹时运行,所以我可以从所有可用的子文件夹中获取所有内容。

不确定我在这里缺少什么,但是子文件夹的状态更改不会触发将其作为依赖项的 useEffect:

    const [imageList, setImageList] = useState([]) as any;
    const [subFolders, setSubFolders] = useState([]) as any;

    const getFilesFromFolder = (fileId: string) => {
        let noToken = false;
        
        const requestFunction = ((pageToken?: string) => {
            gapi.client.drive.files.list({
                q: `'${fileId}' in parents`,
                pageToken
            }).execute((res: any) => {    
                const token = res.nextPageToken && res.nextPageToken || null;

                const images = res.files.filter((file: any ) => 
                file.mimeType === 'image/jpeg' ||
                file.mimeType === 'image/png' ||
                file.mimeType === 'image/jpg'
                );
                
                setSubFolders([...subFolders, ...res.files.filter((file: any ) => file.mimeType === 'application/vnd.google-apps.folder')]);
                setImageList([...imageList, ...images])

                if (token) {    
                    requestFunction(token);
                } else {
                    noToken = true;
                }
            }).catch((err: any) => {
                console.log('err', err)
            })
        });

        if (!noToken) {            
            requestFunction();
        }
    }

    useEffect(() => {
        if (subFolders && subFolders.length > 0) {
            subFolders.forEach((subFolder: any) => {
                getFilesFromFolder(subFolder.id);
            });
        }
    }, [subFolders])
德鲁里斯

由于您基本上是在循环文件结构和排队状态更新,因此我将假设您遇到的任何问题都是因为您使用的是正常状态更新。当这些在循环中排队或在渲染周期内多次排队时,它们会覆盖先前排队的更新。

要解决您应该真正使用功能状态更新。这样每次更新都可以正确更新前一个状态,而不是前一个渲染周期的状态。这是一个微妙但重要的区别,并且经常被忽视。

功能更新

setSubFolders(subFolders => [
  ...subFolders,
  ...res.files.filter((file: any ) =>
    file.mimeType === 'application/vnd.google-apps.folder'
  ),
]);
setImageList(imageList => [...imageList, ...images]);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Preact中使用useEffect?

useEffect() 钩子在状态改变时不会更新

为什么useEffect不会在每个渲染上触发?

React useEffect不会在路线更改时触发

React不会在useEffect上更新状态

useEffect不会在路由更改时更新状态

React挂钩:useEffect不会在对象数组上触发

useEffect() 不会在属性对象更改时触发(深度对象)

反应-UseState不会在useEffect钩子内部获取后触发重新渲染

Reactjs 自定义钩子不会在 useEffect 中使用 if/else 触发?

设置状态在react useEffect中不会在到达路由之前发生

同级组件不会在状态更改时重新呈现(使用useEffect,useState和Context)

状态正在改变,但转换不会在Xstate中触发

自定义挂钩中的useEffect不会在删除时重新呈现

UseState不会触发useEffect

来自 firestore 的数据不会在 useEffect 中实时获取

useEffect 不会更新状态

反应:为什么从useRef更改ref的当前值不会在这里触发useEffect

重投时不会触发useEffect

React Hooks - 即使状态没有改变,useEffect 也会触发

在 ReactJS (preact) 中单击按钮时状态更改后,React 不会重新渲染

道具更改不会触发useEffect

使用useeffect卸载时做出反应,数据不会改变

在Preact中的FunctionalComponent中更新状态中的对象

从特定函数更新状态时防止 useEffect 重新触发

渲染组件时,React useEffect 不会触发获取

反应子 useEffect 早于父 useEffect 触发

自定义钩子内的useEffect不会在React中的正确oreder中被调用

简单反应状态不会在第一次请求时改变