Я работаю над веб-компонентом, разработанным с помощью React. Все шло хорошо, пока я не включил этот веб-компонент для работы на веб-сайте. bootstrap этого веб-сайта меняет стили моего веб-компонента. Я уже пробовал:
1 - добавить all: initial
, но это не имело значения - Стиль Light DOM просачивается в Shadow DOM
2 - пространство имен Bootstrap css. Это решило некоторые проблемы, но не все - Как создать пространство имен Twitter Bootstrap, чтобы стили не конфликтовали | https://www.youtube.com/watch?v=f4fikVsxbzw
3 - используйте пакет classnames
. В этом случае проблема была противоположной, теневой DOM испортил легкий DOM - https://www.npmjs.com/package/classnames
Мне интересно, проблема в том, как я создаю веб-компонент, вот код:
import React from 'react';
import ReactDOM from 'react-dom';
import retargetEvents from 'react-shadow-dom-retarget-events';
import {Provider} from 'react-redux';
import SequenceSearch from 'containers/SequenceSearch/index.jsx';
import configureStore from 'store/configureStore.js';
import bootstrap from 'styles/bootstrap.css';
import sequenceSearchStyles from 'styles/sequence-search.scss';
// Prepare data
export const store = configureStore();
class RNAcentralSequenceSearch extends HTMLElement {
constructor() {
super();
// prepare DOM and shadow DOM
const shadowRoot = this.attachShadow({mode: 'open'});
const mountPoint = document.createElement('html');
shadowRoot.appendChild(mountPoint);
// parse arguments
const databases = JSON.parse(this.attributes.databases.nodeValue);
// render React
ReactDOM.render([
<style key={bootstrap} dangerouslySetInnerHTML={{__html: bootstrap}}/>,
<style key={sequenceSearchStyles} dangerouslySetInnerHTML={{__html: sequenceSearchStyles}}/>,
<body key='body'>
<Provider key='provider' store={store}>
<SequenceSearch databases={databases}/>
</Provider>
</body>
],
mountPoint
);
// retarget React events to work with shadow DOM
retargetEvents(shadowRoot);
}
connectedCallback() {
}
disconnectedCallback() {
let state = store.getState();
if (state.statusTimeout) {
clearTimeout(state.statusTimeout);
}
}
}
customElements.define('rnacentral-sequence-search', RNAcentralSequenceSearch);
Кто-нибудь знает, как это решить? Спасибо!