跳转至

MonacoEditor在mounted周期执行无效

通过定时器延时正常

在Vue中,mounted 钩子表示组件已经被挂载到DOM上,但这并不保证所有的子组件也已经渲染完毕。如果你尝试在mounted钩子中初始化Monaco Editor,并且该编辑器需要被挂载到一个子组件的DOM元素上,那么可能会发现在mounted钩子执行时,对应的DOM元素尚未准备好。

这就解释了为什么直接在mounted钩子中调用editInit方法可能无效,因为this.$refs.codeEditContainer可能还未真正存在于DOM中。

使用setTimeout创建一个定时器,即使是延迟0毫秒,也会将编辑器的初始化代码推迟到当前执行栈清空后的事件循环中,这通常意味着DOM更新已经完成,因此可以确保引用的DOM元素this.$refs.codeEditContainer已经可用。

然而,这并不是一个推荐的解决方案,因为它引入了不必要的异步性和潜在的不确定性。更好的做法是使用Vue的$nextTick方法,这个方法用于延迟执行代码直到下次DOM更新循环结束之后,确保DOM的改变已经应用。

修改后的代码如下:

mounted() {
  this.$nextTick(() => {
    this.editInit();
  });
},
methods: {
  editInit() {
    if (this.$refs.codeEditContainer) {
      this.monacoEditor = monaco.editor.create(this.$refs.codeEditContainer, {
        value: "内容",
        automaticLayout: true,
        scrollBeyondLastLine: false,
        quickSuggestions: false,
        suggestOnTriggerCharacters: false,
        contextmenu: false
      });
    }
  }
}

在上述代码中,this.$nextTick确保editInit方法在DOM元素确实被挂载之后才被调用。这样可以保证Monaco Editor正常初始化,无需依赖于不确定的定时器。