reactjs - 卸载组件时无法执行“removeChild”
问题描述
我目前正在集成一个视频聊天,人们可以在其中切换不同的房间。那部分效果很好。现在我想添加一个额外的组件。如果我在加载 Daily 组件时单击“另一个组件”,则会收到错误消息:
在“节点”上执行“removeChild”失败:要删除的节点不是该节点的子节点。
错误视频示例:https ://www.loom.com/share/e9b03203fe42458f8b0abd44d250517b
我创建了以下沙箱来演示问题:https ://codesandbox.io/s/agitated-blackburn-oorng?file=/src/App.js
问题似乎与dailyRef.current.destroy();
. 如果视频未处于“加载完成”状态,则无法执行。
解决方案
这是daily.destroy
方法的实现
async destroy() {
try {
"joined-meeting" === this._meetingState && (await this.leave());
} catch (t) {}
let t = this.iframe();
if (t) {
let e = t.parentElement;
e && e.removeChild(t);
}
window.removeEventListener("message", this._messageListener);
}
您可以从必要的位中提取并且仅清理事件侦听器
return () => {
try {
"joined-meeting" === daily._meetingState && (await daily.leave());
} catch (t) {}
window.removeEventListener("message", daily._messageListener);
};
推荐阅读
- postgresql - 如何在只读事务中不执行 INSERT
- assembly - 为什么mov图灵完整?
- postgresql - postgresql 11 - 使用 ICU 语言环境创建数据库
- android - Android Studio 是否自动使用正确的布局
- xpath - 在 Puppeteer 中使用 XPath 获取元素
- python - 在 Python 中将 JSON 转换为数据框?
- c# - 我无法发出正确的 linq 请求
- java - 如何将动作监听器添加到按钮以刷新图像?
- c# - 我正在努力让 foreach 循环工作以遍历 LinkedList 的每个元素
- c - 如何为 kotlin native 创建 void* 指针