Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用useMediaQuery钩子切换光/暗主题时被覆盖的材质-用户界面风格

使用useMediaQuery钩子切换光/暗主题时被覆盖的材质-用户界面风格
EN

Stack Overflow用户
提问于 2021-08-04 06:52:31
回答 1查看 565关注 0票数 0

我使用next.js和material,并根据用户喜好更改主题。但是当切换到光模式时,我设置的样式(使用JSS)将被覆盖,只有在使用光模式时才会发生这种情况--我甚至试图逆转这两个主题,但是它不起作用。经过大量的尝试,我发现当更改系统/浏览器以使用与useMediaQuery()挂钩中的主题不同的主题时,就会出现问题。const isInDarkMode = useMediaQuery("(prefers-color-scheme: dark)"); (例如,当设置为更喜欢的颜色方案时,光线主题将导致样式被覆盖。)但我还是不知道为什么会这样,也不知道如何避免。

编辑:手动设置isInDarkMode = false之后,不管模式是什么,样式都会被覆盖。所以也许useMediaQuery并没有造成这个问题,但实际上解决了这个问题。

编辑在我尝试将这个应用程序部署到vercel之后,主页在所有颜色模式下都是完全正常的,getStaticPaths()生成的一些页面仍然存在问题。

这在iOS上的Safari上和Windows上的Chrome上都进行了测试,而且所有的问题都会发生。

用于设置主题的代码(在_app.js中设置):

代码语言:javascript
运行
AI代码解释
复制
import Header from "../components/Header";
import React from "react";
import useMediaQuery from "@material-ui/core/useMediaQuery";
import { createTheme, ThemeProvider } from "@material-ui/core/styles";
import CssBaseline from "@material-ui/core/CssBaseline";
import "../styles/global.css";

function MyApp({ Component, pageProps }) {
  const isInDarkMode = useMediaQuery("(prefers-color-scheme: dark)");

  const theme = React.useMemo(
    () =>
      createTheme({
        spacing: 8,

        palette: {
          type: isInDarkMode ? "dark" : "light",
          primary: {
            main: isInDarkMode ? "#8A6BBE" : "#6F3381",
          },
          secondary: {
            main: "#CB4042",
          },
          background: {
            default: isInDarkMode ? "#1c1c1c" : "#fffffb",
          },
        },

        typography: {
          h3: {
            fontFamily: "Source Serif Pro, serif",
            fontWeight: "600",
            fontSize: "2.2rem",
            "@media (min-width:600px)": {
              fontSize: "3rem",
            },
          },
        },
      }),
    [isInDarkMode]
  );

  return (
    <>
      <ThemeProvider theme={theme}>
        <CssBaseline />
        <Header isInDarkMode={isInDarkMode} />
        <Component {...pageProps} />
      </ThemeProvider>
    </>
  );
}

export default MyApp;

(我在没有useMemo的情况下尝试过,但没有解决问题。)

代码语言:javascript
运行
AI代码解释
复制
const useStyles = makeStyles({
  root: {
    maxWidth: 345,
    backgroundColor: "rgba(255, 255, 255, 0)",
    border: "1px solid rgba(138, 107, 190, 0.7)",
    borderRadius: "8px",
  },
});

(就样式而言,问题将导致覆盖所有样式,包括maxWidth、BackgroundColor和边框/边框半径)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-05 22:12:47

问题解决了!这似乎是因为没有删除服务器端的CSS。我遵循了这里教程

供参考,这是我的_document.js

代码语言:javascript
运行
AI代码解释
复制
import React from "react";
import Document, { Html, Head, Main, NextScript } from "next/document";
import { ServerStyleSheets } from "@material-ui/core/styles";

export default class MyDocument extends Document {
  render() {
    return (
      <Html lang="en">
        <Head></Head>
        <body>
          <Main />
          <NextScript />
        </body>
      </Html>
    );
  }
}

// `getInitialProps` belongs to `_document` (instead of `_app`),
// it's compatible with server-side generation (SSG).
MyDocument.getInitialProps = async (ctx) => {
  // Resolution order
  //
  // On the server:
  // 1. app.getInitialProps
  // 2. page.getInitialProps
  // 3. document.getInitialProps
  // 4. app.render
  // 5. page.render
  // 6. document.render
  //
  // On the server with error:
  // 1. document.getInitialProps
  // 2. app.render
  // 3. page.render
  // 4. document.render
  //
  // On the client
  // 1. app.getInitialProps
  // 2. page.getInitialProps
  // 3. app.render
  // 4. page.render

  // Render app and page and get the context of the page with collected side effects.
  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 fragment is rendered after the app and page rendering finish.
    styles: [
      ...React.Children.toArray(initialProps.styles),
      sheets.getStyleElement(),
    ],
  };
};

和_app.js

代码语言:javascript
运行
AI代码解释
复制
import Header from "../components/Header";
import React from "react";
import useMediaQuery from "@material-ui/core/useMediaQuery";
import { createTheme, ThemeProvider } from "@material-ui/core/styles";
import CssBaseline from "@material-ui/core/CssBaseline";

import { lightTheme, darkTheme } from "../utils/themes/Theme";
import "../styles/global.css";

function MyApp({ Component, pageProps }) {
  const isInDarkMode = useMediaQuery("(prefers-color-scheme: dark)");

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

  return (
    <ThemeProvider theme={isInDarkMode ? darkTheme : lightTheme}>
      <CssBaseline />
      <Header isInDarkMode={isInDarkMode} />
      <Component {...pageProps} />
    </ThemeProvider>
  );
}

export default MyApp;

(我更改为在另一个文件中创建主题,但它应该是可选的)

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

https://stackoverflow.com/questions/68653435

复制
相关文章
如何检查 MySQL 中的列是否为空或 Null?
在MySQL数据库中,我们经常需要检查某个列是否为空或Null。空值表示该列没有被赋值,而Null表示该列的值是未知的或不存在的。在本文中,我们将讨论如何在MySQL中检查列是否为空或Null,并探讨不同的方法和案例。
网络技术联盟站
2023/07/14
2.2K0
如何检查 MySQL 中的列是否为空或 Null?
如何检查 MySQL 中的列是否为空或 Null?
在MySQL数据库中,我们经常需要检查某个列是否为空或Null。空值表示该列没有被赋值,而Null表示该列的值是未知的或不存在的。在本文中,我们将讨论如何在MySQL中检查列是否为空或Null,并探讨不同的方法和案例。
网络技术联盟站
2023/08/03
4.6K0
如何检查 MySQL 中的列是否为空或 Null?
如何检查一个对象是否为空
检查一个数组为空很容易,直接调用 length 方法即可,那么如何检查一个对象是否为空呢 ❓
JS菌
2019/04/10
4.1K0
如何检查一个对象是否为空
java判断空对象为空_Java判断对象是否为空(包括null ,””)的方法[通俗易懂]
public static boolean isEmpty(Object obj)
全栈程序员站长
2022/06/25
7.4K0
java 对象为空判断_java中判断对象是否为空的方法
首先,直接使用 object == null 去判断,对象为null的时候返回true,不为null的时候返回false。然后,在object != null 为true的情况下,进一步去判断对象的所有属性是否为null。
全栈程序员站长
2022/08/15
11.9K0
java 对象为空判断_java中判断对象是否为空的方法
python判断是否为空_python 判断对象是否为空
在实际的工作当中,我们难免要与空值打交道,相信不少初学者都会写出下面的代码:if a is None:
全栈程序员站长
2022/07/01
10.9K0
PHP判断是否为空的5种方法
说明:任何一个未初始化的变量、值为 0 或 false 或 空字符串”” 或 null的变量、空数组、没有任何属性的对象, empty(变量) == true。
你的明明呐丶
2022/06/27
2.9K0
vue 对象判断为空_Vue中可用的判断对象是否为空的方法
vue有两个方法可用 1. JSON.stringify(evtValue)=='{}’ 2. Object.keys(xxx).length==0 js判断对象是否为空对象的几种方法 1.将json对象转化为json字符串,再判断该字符串是否为”{}” var data = {}; var b = (JSON.stringify(data) == “{}”); alert(b);//true 2.for in 循环判断 var obj = {}; var b =…
全栈程序员站长
2022/08/12
6.4K0
jq 判断是否为空,为空隐藏指定 div
<style>.mydiv{ width:300px; height:300px; background:red;}</style> <div class="mydiv">     <div class="content">          这是一句话,删除的话会让 mydiv display:none;          </div> </div> <script src="https://lib.baomitu.com/jquery/3.4.1/jquery.min.js"></script> <sc
Savalone
2020/02/11
7.4K0
java判断一个对象是否为空_Java中判断对象是否为空的方法的详解
另一种是org.springframework.util包下的。这两种StringUtils工具类判断对象是否为空是有差距的:
全栈程序员站长
2022/09/03
3.4K0
PHP 判断数组是否为空的5大方法
本文介绍了PHP开发中遇到的数组问题,这里介绍了判断PHP数组为空的5种方法,有需要的朋友可以借鉴参考一下。 转载自:PHP100 原文地址:http://www.php100.com/html/it
wangxl
2018/03/08
3.1K0
Java判断对象是否为空的方法:isEmpty,null,” “
今天修改辞职同事遗留的代码才发现这个问题,不能用isEmpty来判断一个对象是否为null,之前没在意这个问题,在报了空指针之后才发现这个问题。
全栈程序员站长
2022/07/01
6.2K0
Java判断对象是否为空的方法:isEmpty,null,” “
java怎么判断对象不为空_java判断对象是否为空的方法
这篇文章将为大家详细讲解有关java判断对象是否为空的方法,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
全栈程序员站长
2022/09/07
5K0
PHP 检测变量是否为空
注意:字符串"0.0"、字符串"00"、包括一个空格字符的字符串" "、字符串"false" 、整型 -1 都不为 false:
德顺
2019/11/13
7.4K0
js -- 判断数组是否为空?
上面三种判断数组为空的方法虽然大多数情况下都可以用,但依然存在bug,比如令arr[-1] = ''时,数组不为空,但三者都返回true。
小蔚
2020/09/07
21K0
js判断input是否为空
在进行注册时经常会遇到需要判断用户是否在文本框内输入了数据,那么就需要判断一下,一开始我感觉这是一个非常简单的问题。我的思路是获取input元素,判断他的元素是否为null不就行啦。但是结果出乎了我的意料之外,这个条件跟没设一样。于是我有换了一个方法,是这样的:document.getElementById().value=="";结果真的可行了。下面我来贴出一个示例代码:
OECOM
2020/07/01
22.2K0
js判断map是否为空
补记:后台传递过来的是map集合,dataType返回值类型应该是json类型,此时,可以直接使用:JSON.parse(data);这样得到的结果是object类型,然后我们直接判断它的长度即可。
全栈程序员站长
2022/09/07
15.7K0
vue判断map是否为空
for in 循环判断 var obj = {}; var b = function() { for(var key in obj) { return false; } return true; } alert(b());//true
全栈程序员站长
2022/09/07
4.3K0
Java判断List是否为空
在Java中,我们常用List来存储数据,但是我们怎么判断它是否成功带来了我们需要的数据呢,以ArrayList为例,
全栈程序员站长
2022/11/01
3.9K0
点击加载更多

相似问题

是否可以将泛型类型作为类型参数传递?

13

如何使用泛型类型作为返回值,使用泛型类型作为参数?

15

泛型类型作为泛型类型参数

10

泛型方法返回类型作为类型参数

33

泛型类型作为泛型类型参数

31
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档