Как смонтировать стили внутри теневого корня, используя cssinjs / jss - PullRequest
0 голосов
/ 30 января 2019

Я пытаюсь использовать компоненты https://material -ui.com / внутри shadow dom, и мне нужен способ внедрить эти стили внутри shadow dom.по умолчанию material-ui, который использует jss под капотом, вставляет стили в заголовок страницы.

Возможно ли это вообще?Кто-нибудь может привести пример?

Ответы [ 2 ]

0 голосов
/ 26 июля 2019

Используя https://github.com/Wildhoney/ReactShadow для создания shadow dom (вы также можете сделать это вручную, как shonw в предыдущем ответе), я создал небольшой WrapperComponent, который инкапсулирует логику.

import root from 'react-shadow';
import {jssPreset, StylesProvider} from "@material-ui/styles";
import {create} from 'jss';
import React, {useState} from "react"

const WrappedJssComponent = ({children}) => {
  const [jss, setJss] = useState(null);

  function setRefAndCreateJss(headRef) {
    if (headRef && !jss) {
      const createdJssWithRef = create({...jssPreset(), insertionPoint: headRef})
      setJss(createdJssWithRef)
    }
  }

  return (
    <root.div>
      <head>
        <style ref={setRefAndCreateJss}></style>
      </head>
      {jss &&
      <StylesProvider jss={jss}>
        {children}
      </StylesProvider>
      }

    </root.div>
  )
}

export default WrappedJssComponent

Тогда вам просто нужно обернуть ваше приложение или ту часть приложения, которую вы хотите скрыть внутри <WrappedJssComponenent><YourComponent></YourComponent></WrappedJssComponenent>.

Будьте осторожны, некоторые компоненты материала-пользовательского интерфейса выигралине работает как обычно (у меня были некоторые проблемы с

  • ClickAwayListener, возможно, потому что он использует родительский домен, не исследовал больше, чем это, чтобы быть честным.
  • Поппер, и всекоторый попытается использовать document.body, так как контейнер не будет иметь доступа к jss, определенному в теневом узле. Вы должны задать элемент внутри теневого домена как контейнер.
0 голосов
/ 09 июня 2019

Вот так выглядит мой веб-компонент, это веб-компонент, который отображает приложение реагирования, содержащее стили Material-UI.

import * as React from 'react';
import { render } from 'react-dom';
import { StylesProvider, jssPreset } from '@material-ui/styles';
import { create } from 'jss';

import { App } from '@myApp/core';

class MyWebComponent extends HTMLElement {
  connectedCallback() {
    const shadowRoot = this.attachShadow({ mode: 'open' });
    const mountPoint = document.createElement('span');
    const reactRoot = shadowRoot.appendChild(mountPoint);
    const jss = create({
      ...jssPreset(),
      insertionPoint: reactRoot
    });

    render(
      <StylesProvider jss={jss}>
        <App />
      </StylesProvider>,
      mountPoint
    );
  }
}
customElements.define('my-web-commponent', MyWebComponent);

Установка insertionPoint в jss для фактического корня реакциивнутри теневого корня скажет jss вставить эти стили в этот теневой корень.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...