CodeEditor组件中如何监听代码内容变化?
我在用一个第三方的 CodeEditor 组件(类似 Monaco 或 CodeMirror 封装的),想在用户输入时实时获取编辑器里的代码内容,但文档看得有点懵。
试过给组件加 onChange 事件,但好像没触发。也试了通过 ref 拿到实例后调用 getValue(),但不知道该在哪个时机调用才合适。有没有人遇到过类似问题?
我用的是 React,组件大致是这样:
const MyEditor = () => {
const editorRef = useRef(null);
const handleChange = (value) => {
console.log('new code:', value); // 这个没执行
};
return (
<CodeEditor
ref={editorRef}
onChange={handleChange}
language="javascript"
/>
);
};
CodeEditor到底是哪个库封装的,因为不同库的事件名和 API 差别很大。先说常见情况:如果是基于 Monaco(比如
@monaco-editor/react),它压根不叫onChange,而是onChange事件名虽然存在,但得配合onMount才能真正绑定监听器。正确用法是这样:注意看,这里
value是受控的,你得自己维护一个 state,否则光监听没用,页面不更新。如果是 CodeMirror(比如
@uiw/react-codemirror),它的事件是onChange,但参数顺序是(value, viewUpdate),而且必须传state才能触发更新:你刚才那个写法没触发,大概率是以下几种原因之一:
- 这个
CodeEditor组件压根没透出onChange(常见于某些半成品封装)- 你用的是
ref.getValue(),但没在合适的时机调——比如组件挂载完立刻调是拿不到值的,得等用户操作触发一次后才行- 你只监听了
onChange,但没传初始value,编辑器内部根本没状态,自然不触发最靠谱的做法是:查查你用的这个
CodeEditor的源码或者 GitHub issues,搜下onChange有没有人提过类似问题。很多项目里其实是自定义了onCodeChange或者onValueChange这种名字,文档没写清楚。顺便说一句,别死磕
ref.getValue()这种方式,除非你要做保存按钮那种手动触发的逻辑,实时监听还是得靠组件的事件回调。真要用 ref,得配合useEffect和setInterval模拟轮询——这方案我当年写插件时试过,但后来被甲方骂了一顿,性能差还容易丢事件,能不用就别用了。