gpt4 book ai didi

javascript - ReactJS - 使用 Mutation Observer 检测第三方 DOM 插入

转载 作者:行者123 更新时间:2023-12-05 05:59:30 26 4
gpt4 key购买 nike

在组件内部,第三方 JavaScript 库在 React 渲染后将一些内容注入(inject)到特定的 DIV (voice-service) 中。当使用 Mutation Observer 注入(inject) DOM 时,我想在该 DIV (voice-service) 上添加或删除一些 CSS 类,例如 -

当 DOM 注入(inject)时 -

<div id="maxVoiceContainer" class="voice-service service--active">
// third-party content
</div>

当 DOM 未注入(inject)时 -

<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;

想知道-

  1. 我需要断开观察者吗?
  2. 看起来不错?最佳实践?
  3. 另外,我不想在状态更新时重新渲染!

最佳答案

问:我需要断开观察者吗?它不是直接需要的,但我用 mutationObserver.disconnect() 推荐它方法,因为你在 ComponentDidMount 上调用了一次。第二个参数的空数组表示它。 Ref

好看吗?最佳实践?是的,看起来不错。避免嵌套 forEach。最好先使用 map 而不是 forEach

 mutations.map(mutation => mutation.addedNodes).forEach(node => {
if (node.classList && node.classList.contains('pocket-sphinx-container')) {
setVoiceAvailability(status => !status);
}
});

此外,我不想在更新状态时重新渲染!React 的生命周期就是为此而构建的。有两种可能性。首先,您可以使用 Redux 或创建一个在 forEach 中设置的局部变量。但是通常不要在 forEach 中使用 setState 钩子(Hook)

关于javascript - ReactJS - 使用 Mutation Observer 检测第三方 DOM 插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68126486/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com