【发布时间】:2020-01-07 11:21:30
【问题描述】:
我正在开发一个将 React 组件转换为 Web 组件的包装器。当组件在 shadow DOM 中呈现时,我需要应用哪些样式?
我正在尝试将 material-ui 反应组件(按钮)包装在 Web 组件中,但是当我将组件附加到影子 DOM 时,不会应用样式。
//包装器
import ReactDOM,{ render } from 'react-dom';
import Button from '@material-ui/core/Button';
class ButtonWrapper extends HTMLElement {
constructor() {
super();
}
connectedCallback() {
const mountPoint = document.createElement('span');
this.attachShadow({ mode: 'open' }).appendChild(mountPoint);
ReactDOM.render(
<Button variant="contained" color="primary">
Material Button
</Button>
, mountPoint);
}
}
customElements.define('button-material-wrapper', ButtonWrapper);
//HTML
<button-material-wrapper></button-material-wrapper>
//Webpack.config
...
module: {
rules: [
{
test: /\.js$/,
use: {
loader: 'babel-loader',
options: { presets: ['@babel/preset-env', '@babel/preset-react'] }
}
},
{
test:/\.(s*)css$/,
use: ['style-loader', 'css-loader', 'sass-loader']
}
]
}
....
预期输出: material-ui 按钮正确渲染
实际输出: material-ui 按钮被正确渲染为 shadow-root 的子节点,但不应用材质样式。
【问题讨论】:
标签: javascript reactjs components web-component