У меня только что возникла та же проблема с текущим проектом, но я использую последние версии. Мое решение состоит в том, чтобы использовать FrameContextConsumer
и ввести jss
внутри обратного вызова. В этом примере также определяется новая тема материала, отличная от темы родителя фрейма, она может вам не понадобиться для использования.
Вот ссылка на мою песочницу: https://codesandbox.io/s/react-frame-component-with-material-ui-6tqg5
Важным моментом, который следует учитывать, является использование любого компонента пользовательского интерфейса для материала, у которого Modal
в качестве родительского элемента (а это довольно много компонентов, включая вариант Drawer
). В моем примере я добавил Button
, который открывает Dialog
, а в Dialog
включено свойство disablePortal
. Это обеспечит открытие Dialog
во фрейме, а не в родительском, где все стили потеряны, так как они были введены в фрейм.
import React from "react";
import { create } from "jss";
import { jssPreset } from "@material-ui/core/styles";
import { createMuiTheme } from "@material-ui/core/styles";
import { ThemeProvider, StylesProvider } from "@material-ui/core/styles";
import Frame, { FrameContextConsumer } from "react-frame-component";
const theme = createMuiTheme({
palette: {
primary: {
main: "#556cd6"
},
secondary: {
main: "#19857b"
},
background: {
default: "#dedede",
paper: "#ffffff"
}
}
});
const CustomHead = props => {
return (
<>
<meta charSet="utf-8" />
<title>Previewer</title>
<meta name="viewport" content="width=device-width,initial-scale=1" />
<base target="_parent" />
<link
rel="stylesheet"
href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap"
/>
</>
);
};
const PreviewFrame = ({ children, ...props }) => {
return (
<Frame frameBorder={0} {...props} head={<CustomHead />}>
<FrameContextConsumer>
{({ document, window }) => {
const jss = create({
plugins: [...jssPreset().plugins],
insertionPoint: document.head
});
return (
<StylesProvider jss={jss}>
<ThemeProvider theme={theme}>{children}</ThemeProvider>
</StylesProvider>
);
}}
</FrameContextConsumer>
</Frame>
);
};
export default PreviewFrame;