我尝试使用createProtal在react应用中呈现动态生成的react组件。当我从类中调用createProtal时,组件没有呈现。Handler.ts
包含业务逻辑的类
export class Handler {
private element: HTMLElement | null;
constructor(selector: string) {
this.element = document.getElementById(selector);
}
attachedEvent() {
this.element?.addEventListener("mouseenter", () => {
let cancel = setTimeout(() => {
if (this.element != null)
this.attachUi(this.element)
}, 1000)
this.element?.addEventListener('mouseleave', () => {
clearTimeout(cancel)
})
})
}
attachUi(domNode: HTMLElement) {
createPortal(createElement(
'h1',
{className: 'greeting'},
'Hello'
), domNode);
}
}
Main.tsx
使用Handler.ts
的React组分
const handler = new Handler("test_comp");
export default function Main() {
useEffect(() => {
// @ts-ignore
handler.useAddEventListeners();
});
return (
<>
<div id="test_comp">
<p>Detect Mouse</p>
</div>
</>
)
}
但是,当我用下面的函数替换attachUi
函数时,它可以工作
attachUi(domNode: HTMLElement) {
const root = createRoot(domNode);
root.render(createElement(
'h1',
{className: 'greeting'},
'Hello'
));
}
我错过了什么?
1条答案
按热度按时间von4xj4u1#
React使用一种叫做虚拟DOM的东西。只有包含在那个VDOM中的组件才会显示在屏幕上。一个组件返回React理解并包含到VDOM中的东西。
createPortal(...)
返回与<SomeComponent ... />
完全相同的值所以如果你这么做:
const something = <SomeComponent />
,如果你没有在任何地方使用这个变量,你就不能显示它。createPortal
.const something = createPortal(...)
也是一样。如果你想显示它,就在任何地方使用这个变量。把它添加到VDOM,让你的一些组件返回它。你的结构是
你的门户在其他地方,没有连接到那个VDOM。如果你想显示,你必须把它包含在那里。
在下一个使用root.render的示例中,您将创建一个新的VDOM,它与主VDOM是分开的,这就是显示它的原因