gpt4 book ai didi

reactjs - Material 用户界面 : Styles flicker in and disappear

转载 作者:行者123 更新时间:2023-12-03 14:11:06 25 4
gpt4 key购买 nike

样式可能会出现 50 毫秒,然后在此 SSR 应用程序的以下代码中消失。我很好奇是什么原因造成的。

// This component is a child of index.tsx in the /pages folder
<Button
color="primary"
variant="outlined"
size="large"
>Test Button</Button>

样式消失后,留下一个纯 HTML 按钮。

我相信 Next.js 是造成这种情况的原因。我检查了 Next.js 文件并将 next/babel 加载器添加到 .babelrc 中。除此之外我只看到了其他相关的变化。这是在/pages/_document.js 中:


MyDocument.getInitialProps = async ctx => {
const sheets = new MuiServerStyleSheets();
const originalRenderPage = ctx.renderPage;

ctx.renderPage = () =>
originalRenderPage({
enhanceApp: App => props => sheets.collect(<App {...props} />),
});

const initialProps = await Document.getInitialProps(ctx);

return {
...initialProps,
// Styles fragment is rendered after the app and page rendering finish.
styles: [...React.Children.toArray(initialProps.styles), sheets.getStyleElement()],
};
};

尝试解决的事情

  1. 重新启动服务器

问题没有变化。

  • 强制刷新 Chrome 78 (CTRL + F5)
  • 没有变化。

    理论

    我认为存在服务器端问题。客户端和服务器应该在同一台机器上,即 localhost。这可以解释正确的初始结果(客户端初始 UI)然后被服务器更新覆盖。

    更新1

    忘记提及我也更新了 /pages/_app.js。这是更新的部分:

    class MyApp extends App {
    componentDidMount() {
    // Remove the server-side injected CSS.
    const jssStyles = document.querySelector('#jss-server-side');
    if (jssStyles && "parentElement" in jssStyles) {
    (jssStyles.parentElement as HTMLElement).removeChild(jssStyles);
    }
    }

    最佳答案

    对我来说,这个错误的根本原因是在文档的服务器端渲染期间生成的类与水合作用后生成的样式不匹配。

    解决此问题的一种方法是在隐藏后强制重新渲染。

    实现此目的的一种方法是更新组件上的 key prop。

    // inside your component
    const [key, setKey] = React.useState(0);

    React.useEffect(() => {
    setKey(1);
    }, []);

    return (<MyComponent key={}key />)

    我的完整_app.tsx文件:

    import React from 'react';
    import {
    ThemeProvider,
    createGenerateClassName,
    StylesProvider
    } from '@material-ui/core/styles';
    import CssBaseline from '@material-ui/core/CssBaseline';

    import { darkTheme } from '../theme';

    const generateClassName = createGenerateClassName({
    productionPrefix: 'myclasses-'
    });

    export default function MyApp(props) {
    const { Component, pageProps } = props;

    const [key, setKey] = React.useState(0);

    React.useEffect(() => {
    setKey(1);
    }, []);

    React.useEffect(() => {
    const jssStyles = document.querySelector('#jss-server-side');
    if (jssStyles) {
    jssStyles.parentElement.removeChild(jssStyles);
    }
    }, []);

    return (
    <StylesProvider key={key} generateClassName={generateClassName}>
    <React.Fragment>
    <ThemeProvider theme={darkTheme}>
    <CssBaseline />
    <Component {...pageProps} />
    </ThemeProvider>
    </React.Fragment>
    </StylesProvider>
    );
    }

    关于reactjs - Material 用户界面 : Styles flicker in and disappear,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58791674/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com