关于异步渲染,读取文件时还未读取完导致渲染为空

来源:8-9 由一个 Bug 引发的思考

小月肖

2020-06-29

问题描述:
我使用的是开源的编辑器vditor,渲染采用异步模式

<div id="vditor" ref={(ref) => {
                                console.log("这是激活的文件:", activeFile)
                                const vditor = new Vditor('vditor', {
                                    toolbarConfig: {
                                        pin: true,
                                    },
                                    cache: {
                                        enable: false,
                                    },
                                    minHeight: 600,
                                    after() {
                                        vditor.setValue(activeFile ? activeFile.body : '')
                                    },
                                    input(value, previewElement) {
                                        fileChange(activeFile.id, value)
                                    }
                                })

当我点击左侧文件时候,由于异步读取文件内容还来不及读取完,页面进行渲染将节点渲染出来导致body不存在。
通过async/await来解决

const fileClick = async (fileID) => {
        //

        const currentFile = files[fileID]

        if (!currentFile.isLoaded) {
            await fileHelp.readFile(currentFile.path).then(value => {
                const newFile = {...files[fileID], body: value, isLoaded: true}
                setFiles({...files, [fileID]: newFile})
            })
        }

        if (!openFileIDs.includes(fileID)) {
            setOpenFileIDs([...openFileIDs, fileID])
        }
        setActiveFileID(fileID)
    }
写回答

1回答

张轩

2020-06-30

同学 请问你是已经解决了对嘛?下面是你自己提出的解决方案?

0
1
小月肖
是的,就是使用ref渲染节点的时候,读取文件还没完读取不到activeFile.body, 采用的是async、await 同步的方式结果有了才往下走
2020-06-30
共1条回复

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

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

1253 学习 · 463 问题

查看课程