Closed Lzw2016 closed 4 months ago
我在项目中通过一下代码简单的解决了这个问题:
watch(
[
() => props.path,
() => props.language,
() => value.value,
() => props.line,
],
([newPath, newLanguage, newValue, newLine], [oldPath, oldLanguage, oldValue, oldLine]) => {
// 读取数据
const { defaultPath, defaultLanguage, defaultValue, saveViewState } = props;
const { monaco, monacoEditor, viewStates } = data;
// 校验
if (!monaco) {
console.warn("Monaco 还未加载完成!")
return;
}
if (!monacoEditor) {
console.warn("MonacoEditor 还未创建!")
return;
}
// 获取当前编辑器Model
const currentModel = monacoEditor.getModel();
const currOrNewModel = getOrCreateModel(
monaco,
newValue ?? defaultValue,
newLanguage ?? defaultLanguage,
newPath ?? defaultPath ?? data.uniquePath,
);
// 创建新的编辑器Model
if (currentModel !== currOrNewModel) {
data.editorModels.add(currOrNewModel);
// 保存编辑器状态
if (saveViewState) viewStates.set(oldPath, monacoEditor.saveViewState());
// 设置新的编辑器Model
monacoEditor.setModel(currOrNewModel);
// 还原编辑器
if (saveViewState) {
const viewState = viewStates.get(newPath) ?? null;
monacoEditor.restoreViewState(viewState);
}
return;
}
// 更新 value
if (monacoEditor.getValue() !== newValue) monacoEditor.setValue(newValue ?? '');
// 更新 language
if (newLanguage !== oldLanguage) monaco.editor.setModelLanguage(currentModel, newLanguage ?? '');
// 更新 line
if (newLine !== oldLine && hasValue(newLine)) monacoEditor.revealLine(newLine);
},
);
源码中的
path
、value
、language
使用了3个不同的 watch 导致更新时存在回调执行顺序问题,editorRef.value!.getModel()
与getOrCreateModel
调用的顺序存在问题!应该使用
其它 props 的 watch 不知道有没有类似问题,需要检查