当前位置: 首页 > 知识库问答 >
问题:

如何访问React中共享组件中的材料主题?

谭健柏
2023-03-14

我有两个react项目父项目和公共项目(包含公共组件,如页眉、页脚)

我在父级中定义了素材主题,并使用MuithemeProvider以标准方式配置了素材主题。

但是,此主题对象在父级中定义的组件中可用,但在共享项目公共中不可用。

欢迎提出建议。

2020年10月30日更多详情添加如下

父组件

import React from "react";
import "./App.css";
import { BrowserRouter, Switch, Route } from "react-router-dom";
import themeDefault from "./CustomTheme.js";
import { MuiThemeProvider } from "@material-ui/core/styles";
import { createMuiTheme } from "@material-ui/core/styles";
import Dashboard from "./containers/Dashboard/Dashboard";
import { Footer, Header } from "my-common-react-project";

function App() {
  const routes = () => {
    return (
      <BrowserRouter>
        <Switch>
          <Route exact path="/" component={Dashboard} />
        </Switch>
      </BrowserRouter>
    );
  };
  return (
    <MuiThemeProvider theme={createMuiTheme(themeDefault)}>
      <div className="App">
        <Header
          logo="some-logo"
          userEmail={"test@email"}
        />
        ... app components here..
        <Footer />
      </div>
    </MuiThemeProvider>
  );
}

export default App;

共享组件

import React from "react";
import {
  Box,
  AppBar,
  Toolbar,
  Typography,
} from "@material-ui/core/";

import styles from "./Header.styles";
import PropTypes from "prop-types";

const Header = (props) => {
  const classes = styles();
  const { options, history } = props;
  const [anchorEl, setAnchorEl] = React.useState(null);
  const handleCloseMenu = () => {
    setAnchorEl(null);
  };

  const goto = (url) => {
    history.push(url);
  };
  return (
    <Box component="nav" className={classes.headerBox}>
      <AppBar position="static" className={classes.headerPart}>
        <Toolbar className={classes.toolBar}>
          {localStorage && localStorage.getItem("isLoggedIn") && (
            <>
              {options &&
                options.map((option) => (
                  <Typography
                    key={option.url}
                    variant="subtitle1"
                    className={classes.headerLinks}
                    onClick={() => goto(option.url)}
                  >
                    {option.name}
                  </Typography>
                ))}
            </>
          )}
        </Toolbar>
      </AppBar>
    </Box>
  );
};

Header.propTypes = {
  options: PropTypes.array
};
export default Header;

共享组件样式

import { makeStyles } from "@material-ui/core/styles";

export default makeStyles((theme) => ({
  headerPart: {
    background: "white",
    boxShadow: "0px 4px 15px #00000029",
    opacity: 1,
    background: `8px solid ${theme.palette.primary.main}`
    borderTop: `8px solid ${theme.palette.primary.main}`
  }
}));

父组件将theme.Palette.Primary.Main定义为红色,我希望在Header中应用同样的颜色,但它正在选择一个不同的主题(默认)对象,该对象具有theme.Palette.Primary.Main蓝色。

这导致我的头是蓝色的,但正文是读的颜色。

任何关于如何配置此主题对象的建议,以便header也从父主题对象中选择theme.Palette.Primary.Main

共有1个答案

夹谷衡
2023-03-14

您可以使用useThemewithTheme将主题对象注入到ThemeProvider内部的任何嵌套组件。

  • 在功能组件中使用useTheme钩子
  • 在基于类的组件(不能使用钩子)中使用withthemeHOC
function DeepChild() {
  const theme = useTheme<MyTheme>();

  return <span>{`spacing ${theme.spacing}`}</span>;
}

class DeepChildClass extends React.Component {
  render() {
    const { theme } = this.props;
    return <span>{`spacing ${theme.spacing}`}</span>;
  }
}

const ThemedDeepChildClass = withTheme(DeepChildClass);
 类似资料:
  • 问题内容: 我有一个带有.groovy脚本的共享库,可以在jenkinsfile中这样调用: 我要执行的共享库中也有一个.ps1文件。但是,如果当我从jenkinsfile调用共享库函数时从共享库函数中执行该操作,则当前工作目录就是jenkinsfile所在管道的jenkins工作目录(通常是您想要的)。 有没有办法访问共享库中的文件?我想要做 问题答案: 您只能使用内置步骤获得内容。这就是为什么

  • 我有一个网站,在本地主机上运行良好。 在我上传到我的godaddy主机后,我的网站出现了一个bug。结论是,我必须更改php上的内存限制。ini文件,但找不到php。FTP管理器上的ini。 我曾尝试: 找到更改到分类FTP管理器的方法。 创建/上传php.ini文件从本地和不工作。 我的问题是:我如何解决这个问题?我必须换php。ini文件。有人有像我这样的经验吗?

  • 我最近离开了主题。AppCompat到主题。MaterialComponents,但我不懂如何组织颜色。 例如,为什么按钮采用橙色背景颜色,但cardview的背景不采用橙色? 有人能给我解释一下关于这些变量的更多信息吗 有任何官方文件吗?

  • 我有一个react组件,它加载在路由上 我需要从components构造函数中的url访问一个参数 我该怎么做呢? 我可以这样访问它吗:

  • 我使用hostinger,在我的父托管目录中有两个文件夹 my-laravel-app-文件夹 public_html 公开/索引。我变了

  • 问题内容: 我正在开发使用Meteor和React作为视图引擎的应用程序 考虑下图: 从另一个示例反应隐藏组件 当触发C4按钮单击事件时,我需要更改C2组件状态。由于他们没有直接关系,因此我无法直接从C4进入C2状态。 另一个示例是从Component提交表单并获取在另一个Component中声明的数据(输入字段的值)。 我知道可以通过一些技巧来解决此问题(例如,流星会话,通过每个组件传递数据,基