reactjs - createPortal 不会覆盖 div 内容(如 ReactDOM.render)
问题描述
我正在尝试ReactDOM.createPortal
覆盖我正在安装的容器的内容。但是它似乎附加了Child。
是否可以覆盖内容?类似于ReactDOM.render
?
这是我的代码:
import React from 'react';
import { createPortal } from 'react-dom';
class PrivacyContent extends React.Component {
render() {
return createPortal(
<div>
<button onClick={this.handleClick}>
Click me
</button>
</div>,
document.getElementById('privacy')
)
}
handleClick() {
alert('clicked');
}
}
export default PrivacyContent;
解决方案
如果您知道自己在做什么,这里有一个<Portal />
组件,它在后台创建一个门户,清空目标 DOM 节点并使用任何道具安装任何组件:
const Portal = ({ Component, container, ...props }) => {
const [innerHtmlEmptied, setInnerHtmlEmptied] = React.useState(false)
React.useEffect(() => {
if (!innerHtmlEmptied) {
container.innerHTML = ''
setInnerHtmlEmptied(true)
}
}, [innerHtmlEmptied])
if (!innerHtmlEmptied) return null
return ReactDOM.createPortal(<Component {...props} />, container)
}
用法:
<Portal Component={MyComponent} container={document.body} {...otherProps} />
这清空了 的内容,然后在传递的同时document.body
挂载。MyComponent
otherProps
希望有帮助。
推荐阅读
- python - 如何修复添加两个函数输出,然后将组合输出实现到 Python 中的文本文件?
- ruby-on-rails - 如何在 Ruby 中将独占范围转换为包含范围?
- autohotkey - SHIFT 的 AutoHotKey 修饰符符号“+”不起作用
- javascript - 我可以让 JSON.stringify 包含值未定义的键吗?
- php - 如何一次在不同的 2 div 中获取数据?
- c++ - QSvgGenerator 在生成 Svg 时将 QSvgGraphicsItem 转换为图像
- blender - 让一个对象模仿另一个动画对象的旋转
- php - 通过键查询对象
- javascript - JS ES6 通过键数组过滤对象的正确方法
- python - Python - 从分叉的 GitHub 存储库安装