右键菜单选择open和常规点击 调用同样的onFileClick, 表现不同的问题

来源:9-4 添加上下文菜单第二部分

lewis0077

2024-10-14

老师,你好,这个问题困扰了我好久了,请帮忙看看
A. 正常点击 file item, console里正常线上files的内容
图片描述
关闭右侧的tab
正常点击调用的是onFileClick函数
图片描述

B. 然后右键,在弹出的菜单窗口上点击open按钮,console里却显示files: {}, 然后报错如下:
图片描述
图片描述

右键->再弹出的菜单里选择open调用还是onFileClick函数
图片描述
如果再操作上面A的正常点击,结果还是正常的; 就是执行B的时候,报上面的问题,真不知道是什么原因导致的了,请老师帮忙看下,
代码地址为: https://github.com/minghzhang/cloud-doc-landon

写回答

1回答

张轩

2024-10-17

同学你好

这里的问题出在 闭包陷阱件监听器可能捕获了 files 的旧值(在初始化时可能是空对象)。所以当调用的时候拿到的一直是一个空的对象,所以这里我们需要一个响应式的对象。

可以这么做:

App.js 当中

const filesRef = useRef(files);

// Update filesRef whenever files state changes
useEffect(() => {
    filesRef.current = files;
}, [files]);

const fileClick = useCallback((fileId) => {
    // 从这个对象里面取值,而不是原来的 files 当中
    setActiveFileId(fileId);
    console.log("files", filesRef.current);
    const currentFile = filesRef.current[fileId];
    console.log(currentFile);
}, [])

亲测有效~


1
1
lewis0077
非常感谢老师的解答,让我体验到了传说中的闭包陷阱
2024-10-17
共1条回复

2024更新 Electron+React+七牛云实战跨平台桌面应用

开发一款自动云同步的 Markdown 文件管理软件

1253 学习 · 463 问题

查看课程