当前位置:首页 > React

react实现主题切换

2026-01-26 21:32:36React

实现 React 主题切换的常见方法

使用 CSS 变量和状态管理

通过 React 的状态管理(如 useState 或 Context API)结合 CSS 变量实现主题切换。CSS 变量可以在根元素(:root)中定义,通过 JavaScript 动态修改。

import React, { useState } from 'react';

function App() {
  const [theme, setTheme] = useState('light');

  const toggleTheme = () => {
    const newTheme = theme === 'light' ? 'dark' : 'light';
    setTheme(newTheme);
    document.documentElement.setAttribute('data-theme', newTheme);
  };

  return (
    <div className="app">
      <button onClick={toggleTheme}>Toggle Theme</button>
      <h1>Current Theme: {theme}</h1>
    </div>
  );
}

export default App;

在 CSS 中定义主题变量:

:root {
  --primary-color: #ffffff;
  --secondary-color: #000000;
}

[data-theme="dark"] {
  --primary-color: #000000;
  --secondary-color: #ffffff;
}

body {
  background-color: var(--primary-color);
  color: var(--secondary-color);
}

使用 Context API 管理主题状态

对于复杂应用,可以通过 Context API 全局管理主题状态,避免 props 层层传递。

react实现主题切换

import React, { createContext, useContext, useState } from 'react';

const ThemeContext = createContext();

export const ThemeProvider = ({ children }) => {
  const [theme, setTheme] = useState('light');

  const toggleTheme = () => {
    setTheme(prevTheme => (prevTheme === 'light' ? 'dark' : 'light'));
  };

  return (
    <ThemeContext.Provider value={{ theme, toggleTheme }}>
      {children}
    </ThemeContext.Provider>
  );
};

export const useTheme = () => useContext(ThemeContext);

在组件中使用:

function ThemedButton() {
  const { theme, toggleTheme } = useTheme();
  return (
    <button onClick={toggleTheme}>
      Current Theme: {theme}
    </button>
  );
}

使用第三方库(如 styled-components)

styled-components 支持主题切换功能,通过 ThemeProvider 传递主题对象。

react实现主题切换

import styled, { ThemeProvider } from 'styled-components';

const lightTheme = {
  background: '#ffffff',
  text: '#000000',
};

const darkTheme = {
  background: '#000000',
  text: '#ffffff',
};

const StyledApp = styled.div`
  background: ${props => props.theme.background};
  color: ${props => props.theme.text};
`;

function App() {
  const [theme, setTheme] = useState(lightTheme);

  const toggleTheme = () => {
    setTheme(theme === lightTheme ? darkTheme : lightTheme);
  };

  return (
    <ThemeProvider theme={theme}>
      <StyledApp>
        <button onClick={toggleTheme}>Toggle Theme</button>
      </StyledApp>
    </ThemeProvider>
  );
}

动态加载主题样式文件

通过动态加载不同的 CSS 文件实现主题切换,适合主题样式较复杂的场景。

function loadTheme(themeName) {
  const link = document.createElement('link');
  link.rel = 'stylesheet';
  link.href = `${themeName}.css`;
  document.head.appendChild(link);
}

function App() {
  const [theme, setTheme] = useState('light');

  const toggleTheme = () => {
    const newTheme = theme === 'light' ? 'dark' : 'light';
    setTheme(newTheme);
    loadTheme(newTheme);
  };

  return (
    <div>
      <button onClick={toggleTheme}>Toggle Theme</button>
    </div>
  );
}

结合 localStorage 持久化主题

将用户选择的主题保存到 localStorage,实现刷新后主题不丢失。

function App() {
  const [theme, setTheme] = useState(
    localStorage.getItem('theme') || 'light'
  );

  const toggleTheme = () => {
    const newTheme = theme === 'light' ? 'dark' : 'light';
    setTheme(newTheme);
    localStorage.setItem('theme', newTheme);
    document.documentElement.setAttribute('data-theme', newTheme);
  };

  return (
    <div>
      <button onClick={toggleTheme}>Toggle Theme</button>
    </div>
  );
}

注意事项

  • 性能优化:避免频繁的主题切换导致重渲染,尤其是大型应用。
  • 默认主题:在 useEffect 中初始化主题,确保与 localStorage 同步。
  • 无障碍性:确保主题切换不影响屏幕阅读器等辅助工具的使用。

以上方法可根据项目需求灵活选择或组合使用。

标签: 主题react
分享给朋友:

相关文章

如何生成react代码

如何生成react代码

使用 Create React App 生成项目 安装 Node.js 后,通过命令行工具运行以下命令创建新项目: npx create-react-app my-app cd my-app npm…

电脑如何安装react

电脑如何安装react

安装 Node.js 和 npm React 依赖于 Node.js 和 npm(Node Package Manager)。从 Node.js 官网下载并安装最新稳定版本,安装完成后会自动包含 np…

react如何开发组件

react如何开发组件

React 组件开发基础 React 组件分为函数组件和类组件两种形式。函数组件是现代 React 开发的主流方式,结合 Hooks 可以实现完整功能。 函数组件示例: function Gree…

react如何衰减

react如何衰减

React 中的动画衰减效果实现 在 React 中实现衰减效果(如滚动衰减、拖动释放后的惯性滑动)通常需要结合物理动画原理或第三方动画库。以下是几种常见方法: 使用 CSS 动画和 @keyf…

react如何查

react如何查

React 查询方法 React 提供了多种查询 DOM 元素的方式,以下是几种常见的方法: 使用 ref 通过 useRef 钩子可以获取 DOM 节点的引用,适用于直接操作 DOM 的场景。…

react如何卸载

react如何卸载

卸载 React 项目或依赖 如果需要完全卸载 React 项目或相关依赖,可以按照以下步骤操作: 删除项目文件夹 直接删除整个项目文件夹是最彻底的方式。确保已备份重要代码或配置文件。 卸载全…