Как использовать тему в пользовательском интерфейсе материала с React + Next. js? - PullRequest
1 голос
/ 04 апреля 2020

Я создал три файла, показанных ниже.

Цвет Paper изменяется в соответствии со значением palette.type, определенным в theme.js.

Страница с palette.type: 'dark'

Page with palette.type: 'dark'

Страница с palette.type: 'light'

Page with palette.type: 'light'

Однако я не понимаю, как работает переменная theme. Я добавил два console.log(theme) к index.js. Оба показывают palette.type: 'light' независимо от значения в theme.js.

Результат console.log

Result of console.log

Как пройти theme до index.js (без импорта темы)?

компоненты / макет. js - общий компонент для применения одинакового макета ко всем страницам

import React from 'react';
import { MuiThemeProvider } from '@material-ui/core/styles';
import { theme } from '../utils/theme';


class Layout extends React.Component {
    render() {
        return(
            <MuiThemeProvider theme={theme}>
                {this.props.children}
            </MuiThemeProvider>
        )
    }
}

export default Layout;

страниц / индекс. js - Одна специфика c страница

import Layout from '../components/Layout';
import { makeStyles, createStyles, useTheme, Paper } from '@material-ui/core';

const useStyles = makeStyles(theme => {
    console.log('inside makeStyles');
    console.log(theme);
    return createStyles({
        container: {
            margin: '5px 5px 50px 5px'
        }
    })
});

export default function Index(props) {
    const classes = useStyles(props);
    const theme = useTheme();
    console.log('inside Index')
    console.log(theme);

    return(
        <Layout>
            <h2>About</h2>
            <Paper className={classes.container}>
                <p>Sample test</p>
            </Paper>
            <Paper className={classes.container}>
                <p>Sample test2</p>
            </Paper>
        </Layout>
    )
};

utils / theme. js - Отдельный файл для записи theme

import { createMuiTheme } from '@material-ui/core/styles';

export const theme = createMuiTheme({
    palette: {
        type: 'dark'
    }
});

1 Ответ

0 голосов
/ 04 апреля 2020

Попробуйте переместить <MuiThemeProvider theme={theme}> из Макет. js в _app. js.

_app. js

import React from 'react';
import PropTypes from 'prop-types';
import Head from 'next/head';
import { ThemeProvider } from '@material-ui/core/styles';
import CssBaseline from '@material-ui/core/CssBaseline';
import theme from '../src/theme';

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

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

return (
    <React.Fragment>
    <Head>
        <title>My page</title>
        <meta name="viewport" content="minimum-scale=1, initial-scale=1, width=device-width" />
    </Head>
    <ThemeProvider theme={theme}>
        {/* CssBaseline kickstart an elegant, consistent, and simple baseline to build upon. */}
        <CssBaseline />
        <Component {...pageProps} />
    </ThemeProvider>
    </React.Fragment>
);
}

MyApp.propTypes = {
    Component: PropTypes.func.isRequired,
    pageProps: PropTypes.object.isRequired,
};

Тема должна относиться ко всем компонентам, и вы должны увидеть dark в отпечатке console.log().

Официальный материал-UI + Далее. js пример

Если все страницы имеют одинаковый макет, вы можете полностью удалить компонент Layout.

...