NextJs + MaterialUI - prop `className` did not match

Viewed 409

I have tried multiple solutions that were suggested in MaterialUI and NextJS official examples and forums with no luck. My page is unable to use my MUI styles on the first render and I keep getting this error:

Warning: Prop `className` did not match. Server: "makeStyles-image-3 makeStyles-image-5" Client: "makeStyles-image-4 makeStyles-image-7"

My _document.tsx:

import React from 'react';
import Document, { DocumentContext, Head, Html, Main, NextScript } from 'next/document';
import { ServerStyleSheets } from '@material-ui/core/styles';

export default class MyDocument extends Document {
    render() {
        return (
            <Html lang="en">
                <Head>
                    <meta charSet="utf-8" />
                    <link rel="icon" href="/favicon.ico" />
                </Head>
                <body>
                    <Main />
                    <NextScript />
                </body>
            </Html>
        );
    }

    static async getInitialProps(ctx: DocumentContext) {
        const sheets = new ServerStyleSheets();
        const originalRenderPage = ctx.renderPage;

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

        const initialProps = await Document.getInitialProps(ctx);

        return { ...initialProps, styles: [...React.Children.toArray(initialProps.styles), sheets.getStyleElement()] };
    }
}

My _app.tsx:

import '../styles/globals.css';
import type { AppProps } from 'next/app';
import React, { useEffect } from 'react';
import { CssBaseline, ThemeProvider } from '@material-ui/core';
import Head from 'next/head';
import { theme } from '../src/app/theme';

const App: React.FC<AppProps> = ({ Component, pageProps }) => {
    useEffect(() => {
        const jssStyles = document.querySelector('#jss-server-side');
        console.log(jssStyles?.parentElement?.removeChild(jssStyles));
        jssStyles?.parentElement?.removeChild(jssStyles);
    }, []);

    return (
        <React.Fragment>
            <Head>
                <title>My App</title>
                <meta name="viewport" content="minimum-scale=1, initial-scale=1, width=device-width" />
            </Head>
            <ThemeProvider theme={theme}>
                <CssBaseline />
                <Component {...pageProps} />
            </ThemeProvider>
        </React.Fragment>
    );
};

export default App;

The solutions I've tried:

https://github.com/mui-org/material-ui/blob/0ff9cb54a9/examples/nextjs-with-typescript/README.md

https://github.com/hadnazzar/nextjs-with-material-ui/blob/master/README.md

Also many from StackOverflow similar posts (though none of the answers helped, so please do not mark this as a duplicate).

Used packages versions:

    "@material-ui/core": "^4.12.3",
    "next": "11.1.2",
    "react": "17.0.2",

Is there anything that I'm missing here?

0 Answers
Related