Javascript 如何在JSS中使用主题功能?
在使用react jss的next.js项目中集成主题化功能有一个问题。我试过在文档中找到的ThemeProvider。 每次,我的首页都会刷新两次。第一次,我可以看到CSS主题是apply,但几毫秒后,页面刷新和主题消失。 你有办法解决我的问题吗?这是我的档案: \u document.jsxJavascript 如何在JSS中使用主题功能?,javascript,reactjs,next.js,jss,Javascript,Reactjs,Next.js,Jss,在使用react jss的next.js项目中集成主题化功能有一个问题。我试过在文档中找到的ThemeProvider。 每次,我的首页都会刷新两次。第一次,我可以看到CSS主题是apply,但几毫秒后,页面刷新和主题消失。 你有办法解决我的问题吗?这是我的档案: \u document.jsx import React from 'react'; import Document, { Head, Main, NextScript } from 'next/document'; import {
import React from 'react';
import Document, { Head, Main, NextScript } from 'next/document';
import {
SheetsRegistry,
JssProvider,
ThemeProvider,
} from 'react-jss';
const theme = {
colorPrimary: 'green',
};
export default class JssDocument extends Document {
static getInitialProps(ctx) {
const registry = new SheetsRegistry();
const page = ctx.renderPage(App => props => (
<ThemeProvider theme={theme}>
<JssProvider registry={registry}>
<App {...props} />
</JssProvider>
</ThemeProvider>
));
return {
...page,
registry,
};
}
render() {
return (
<html lang="en">
<Head>
<style id="server-side-styles">
{this.props.registry.toString()}
</style>
</Head>
<body>
<Main />
<NextScript />
</body>
</html>
);
}
}
import React from 'react';
import injectSheet from 'react-jss';
import PropTypes from 'prop-types';
const styles = theme => ({
myButton: {
backgroundColor: 'black',
color: theme.colorPrimary,
},
});
const Index = ({ classes }) => (
<div className={classes.myButton}>Welcome to Novatopo website!</div>
);
Index.propTypes = {
classes: PropTypes.shape({
myButton: PropTypes.string,
}).isRequired,
};
export default injectSheet(styles)(Index);
import App from 'next/app';
export default class MyApp extends App {
componentDidMount() {
const style = document.getElementById('server-side-styles');
if (style) {
style.parentNode.removeChild(style);
}
}
}
这里有一个代码沙盒来重现这个问题:您可以做两件事:
我解决了这个问题。您需要在
\u app.jsx
文件中集成ThemeProvider逻辑
就像这样:
export default class MyApp extends App {
render() {
const { Component, pageProps } = this.props;
return (
<ThemeProvider theme={theme}>
<Component {...pageProps} />
</ThemeProvider>
);
}
}
导出默认类MyApp扩展应用程序{
render(){
const{Component,pageProps}=this.props;
返回(
);
}
}
我在JssProvider中切换了EProvider,但没有任何变化。我将准备一个codesandbox示例,谢谢。这里是我的codesandbox:你有什么想法吗?我的页面呈现了两次。我认为在服务器端渲染过程中会应用主题样式,但在浏览器渲染过程中会立即被组件样式替换。你对此有什么感觉?我怎样才能解决我的问题?