首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JSS <ThemeProvider>,如何使用媒体查询

JSS <ThemeProvider>,如何使用媒体查询
EN

Stack Overflow用户
提问于 2019-12-14 09:30:40
回答 1查看 385关注 0票数 2

我正在尝试使用来定义一些我想在子组件中使用的默认颜色。问题是,我也希望能够根据媒体查询来设置这些颜色。例如:

代码语言:javascript
复制
const theme = {
  "@media (prefers-color-scheme: no preference)": {
    colorPrimary: "black",
  },
  "@media (prefers-color-scheme: dark)": {
    colorPrimary: "white",
  },
  "@media (prefers-color-scheme: light)": {
    colorPrimary: "black",
  },
  spacing: (s) => s * 5,
}

但它不起作用。我还尝试将其添加到createUseStyles中,并将其用作ThemeProvider的道具,但无济于事。

如何在ThemeProvider中使用媒体查询?

这是我的主应用:

代码语言:javascript
复制
import React from 'react';
import { createUseStyles, ThemeProvider } from 'react-jss'
import { Header } from './components/header/Header';

const theme = {
  "@media (prefers-color-scheme: no preference)": {
    colorPrimary: "yellow",
  },
  "@media (prefers-color-scheme: dark)": {
    colorPrimary: "yellow",
  },
  "@media (prefers-color-scheme: light)": {
    colorPrimary: "yellow",
  },
  spacing: (s) => s * 5,
}

function App() {
  return (
    <ThemeProvider theme={theme}>
      <div>
        <header>
          <Header>
            Hello
          </Header>
        </header>
      </div>
    </ThemeProvider>
  );
}

export default App;

下面是子组件:

代码语言:javascript
复制
import React from 'react';
import PropTypes from 'prop-types';
import {createUseStyles, useTheme} from 'react-jss'

const useStyles = createUseStyles(theme => ({
  header: {
    padding: theme.spacing(2),
    color: theme.colorPrimary,
  },
}))

export const Header = ({children}) => {

  const theme = useTheme();
  const classes = useStyles({...theme});

  return (
    <div className={classes.header}>
      {children}
    </div>
  )
}

Header.propTypes = {
  children: PropTypes.node,
}
EN

回答 1

Stack Overflow用户

发布于 2020-09-03 23:41:56

您可以使用window.matchMedia来执行以下操作:

代码语言:javascript
复制
const useDark = window.matchMedia('(prefers-color-scheme: dark)').matches

const theme = {
  background: useDark ? 'black' : 'white',
  colorPrimary: useDark ? 'white' : 'black',

  spacing: s => s * 5,
}

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

https://stackoverflow.com/questions/59331606

复制
相关文章

相似问题

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