React项目中vConsole的自定义面板点击事件不触发怎么办?
在React项目里用vConsole自定义了一个侧边栏面板,但给按钮绑定的点击事件完全没反应,折腾了好久:
import VConsole from 'vconsole';
const console = new VConsole();
const panel = {
name: 'MyPanel',
template:
<div class="panel">
<button id="test-btn">点击测试</button>
</div>
,
mount() {
document.getElementById('test-btn').addEventListener('click', () => {
console.log('按钮被点击了'); // 这里没输出
});
}
};
console.addPanel(panel);
已经确认vConsole版本是最新版,控制台也没有报错,但按钮点击就是没反应。试过用React合成事件也不行,直接在浏览器开发者工具里加事件监听却能触发,这是怎么回事?
改一下就行,把事件绑定逻辑放到vConsole提供的show事件里,确保DOM已经渲染完成:
这样处理后事件就能正常触发了。记得在onHide里清理事件监听,不然可能会有内存泄漏或者重复绑定的问题。别问我怎么知道的,踩过坑才懂。
而且React项目里混用原生DOM操作本来就有风险。我的做法是用vConsole提供的onShow和onHide生命周期确保面板已经渲染了,然后再绑定事件。还有个关键点是避免直接用id选择器,改用更可靠的方式定位元素。
下面是改过的代码:
这个写法更稳妥,因为onShow是在面板显示的时候才绑定事件,这时候DOM已经准备好了。亲测有效,少踩了不少坑。
如果还要更复杂的操作,建议直接用iframe嵌页面,别折腾原生DOM了,血泪教训啊。