首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >React.js使用基于路由的ThemeProvider

React.js使用基于路由的ThemeProvider
EN

Stack Overflow用户
提问于 2022-01-31 15:33:57
回答 1查看 497关注 0票数 0

嗨,按照标题,我想根据使用不同主题提供者的路线,我的代码如下所示:

代码语言:javascript
复制
const rootElement = document.getElementById('root');
 ReactDOM.render(
  <ThemeProvider theme="MyThemes.default">
      <CssBaseline />
       <App />

、rootElement,);

哪里

代码语言:javascript
复制
const myThemes= {
 default: createMuiTheme({ ...defaultTheme, ...typography, overrides: { ...muiCssBaseline, 
  ...muiTableOverrides } }),
 myother_theme: createMuiTheme({ ...myOtherTheme, ...typography, overrides: { 
 ...muiCssBaseline, ...muiTableOverrides } }),

};

所以,当我在一个特定的路线上,我想使用myother_theme

我正在制作一个包装组件,以便像这样调用index.js

代码语言:javascript
复制
const ThemeProviderChange = ({ children }) => {
 const [theme, setTheme] = useState(Themes.default);
 const isMyLocation= window.location.pathname === "/MYlOCATION/PATH"?? true;
 
 const url = window.location.pathname.split('/').pop();

  useEffect(() => {
    if (isMyLocation) {
     setTheme(MyThemes.myother_theme);
 
    } else {
     setTheme(MyThemes.default);
    }

   }, [url]);
  return <ThemeProvider theme={theme}>{children}</ThemeProvider>;
   };

  export default ThemeProviderChange;

但是要想工作,需要用户进行手动刷新。有什么建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-01 04:37:09

useEffect钩子中的数组依赖不使用窗口进行调度。为此,您应该使用useLocation的react路由器-dom。

我用这个例子https://codesandbox.io/s/custom-theme-provider-mui-based-in-routes-tt1d4来解决这个问题。

代码语言:javascript
复制
const location = useLocation();
  const isMyLocation = location.pathname === "/MYlOCATION/PATH";

  useEffect(() => {
    if (isMyLocation) {
      setTheme(MyThemes.myother_theme);
    } else {
      setTheme(MyThemes.default);
    }
  }, [location.pathname, isMyLocation]);

此外,您还需要在app中添加BrowserRouter包装器上下文,以侦听状态路由中的更改。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70928581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档