reactjs - React Material UI ThemeProvider tillämpas inte


Jag använder @material-ui/core för att hantera teman i min React-app, men av någon anledning tillämpas inte vissa av stilarna.

Här är min sandlåda med hela koden (relevanta utdrag nedan).

Jag följde exemplet i Material UIs dokumentation men det verkar inte fungera.

Det intressanta är att texten faktiskt centreras (vilket jag specificerade i mina stilar), men bakgrundsfärgen förblir standard #fafafa istället för #424242 som specificerat i mitt tema. Så jag antar att stilarna tillämpas men mitt tema tillämpas inte på stilarna.

En annan konstig sak är att jag loggade ut värdet av theme.palette.background.default inom makeStyles-callbacken och det var #424242.

Också, om jag sätter värdet på backgroundColor i useStyles-hooken till en statisk sträng som #f00, så tillämpas det (bakgrundsfärgen ändras till rött).

useStyles-hook:

const useStyles = makeStyles(
  (theme: Theme) =>
    createStyles({
      root: {
        backgroundColor: theme.palette.background.default,
        height: "100%",
        textAlign: "center",
        width: "100%"
      }
    }),
  { name: "App" }
);

App-komponent:

const App = () => {
  const classes = useStyles();
  return (
    <>
      <CssBaseline />
      <ThemeProvider theme={darkTheme}>
        <div className={classes.root}>hello</div>
      </ThemeProvider>
    </>
  );
};

Tema

// NOTE: gray[800] = #424242
export const darkTheme = createTheme({
  palette: { background: { default: grey[800] } }
});

Svar #1

App (och därför ditt useStyles-anrop) ligger utanför elementhierarkin som påverkas av ditt mörka tema ThemeProvider. Om du flyttar din div till sin egen komponent och anropar useStyles därifrån, fungerar det bra.

import React from "react";

import CssBaseline from "@material-ui/core/CssBaseline";
import {
  makeStyles,
  createStyles,
  Theme,
  ThemeProvider
} from "@material-ui/core/styles";

import { darkTheme } from "./DarkTheme";

const useStyles = makeStyles(
  (theme: Theme) =>
    createStyles({
      root: {
        backgroundColor: theme.palette.background.default,
        height: "100%",
        textAlign: "center",
        width: "100%"
      }
    }),
  { name: "App" }
);

const Hello = () => {
  const classes = useStyles();
  return <div className={classes.root}>hello</div>;
};
const App = () => {
  return (
    <>
      <CssBaseline />
      <ThemeProvider theme={darkTheme}>
        <Hello />
      </ThemeProvider>
    </>
  );
};

export default App;

Svar #2

Jag fick det också att fungera genom att uppdatera dina makeStyles från att använda

createStyles({
      root: {
        backgroundColor: theme.palette.background.default,

till :

createStyles({
      root: {
      backgroundColor: darkTheme.palette.primary.main,

och ändrade darkTheme.ts

att följa deras nyckelord:

palette: {
    primary: { main: grey[800] }
  }

Här är den uppdaterade codesandbox: https://codesandbox.io/s/fancy-tdd-p35ld?file=/src/App.tsx