【发布时间】:2021-06-25 06:35:29
【问题描述】:
在组件内部,第三方 JavaScript 库在 React 渲染后将一些内容注入特定的 DIV (voice-service)。当使用 Mutation Observer 注入 DOM 时,我想在该 DIV (voice-service) 上添加或删除一些 CSS 类,例如 -
当 DOM 注入时 -
<div id="maxVoiceContainer" class="voice-service service--active">
// third-party content
</div>
当 DOM 未注入时 -
<div id="maxVoiceContainer" class="voice-service service--inactive">
// third-party content
</div>
heroVoice 组件:
import React, { useRef, useState, useEffect } from 'react';
const heroVoice = (props) => {
const elementRef = useRef();
const [voiceAvailability, setVoiceAvailability] = useState(false);
useEffect(() => {
const config = { attributes: false, characterData: false, childList: true, subtree: true, attributeOldValue: false, characterDataOldValue: false };
const observer = new MutationObserver(mutations => {
mutations.forEach(mutation => {
const newNodes = mutation.addedNodes;
newNodes.forEach(node => {
if (node.classList && node.classList.contains('pocket-sphinx-container')) {
setVoiceAvailability(status => !status);
}
});
});
});
observer.observe(elementRef.current, config);
}, []);
return (
<div
ref={elementRef}
id="maxVoiceContainer"
className={`voice-service ${voiceAvailability ? ' service--active' : 'service--inactive'}`}
>
// third-party content
</div>
);
}
export default heroVoice;
想知道-
- 我需要断开观察者的连接吗?
- 看起来不错?最佳做法?
- 另外,我不想在状态更新时重新渲染!
【问题讨论】:
标签: javascript reactjs