当前位置: 首页 > wzjs >正文

单位门户网站建设方案台州做网站电话

单位门户网站建设方案,台州做网站电话,织梦科技,cms页面在 React 19 Next.js Ant Design 项目中实现主题切换功能,可以通过以下步骤完成。这里将提供完整方案,包含静态主题切换和动态实时切换两种方式。一、基础配置(Ant Design 主题支持) 1. 安装必要依赖 npm install antd ant-desi…

在 React 19 + Next.js + Ant Design 项目中实现主题切换功能,可以通过以下步骤完成。这里将提供完整方案,包含静态主题切换和动态实时切换两种方式。


一、基础配置(Ant Design 主题支持)

1. 安装必要依赖
npm install antd @ant-design/cssinjs
2. 配置 Next.js 支持 CSS-in-JS

修改 next.config.js

/** @type {import('next').NextConfig} */
const nextConfig = {experimental: {appDir: true,},transpilePackages: ['antd'],
};module.exports = nextConfig;
3. 创建主题配置文件

src/theme/themeConfig.ts

import type { ThemeConfig } from 'antd';// 基础主题配置
export const baseTheme: ThemeConfig = {token: {colorPrimary: '#1677ff',borderRadius: 6,},
};// 暗黑主题
export const darkTheme: ThemeConfig = {token: {...baseTheme.token,colorBgBase: '#141414',colorTextBase: '#f0f0f0',colorPrimary: '#177ddc',},algorithm: 'dark',
};// 自定义主题
export const customTheme: ThemeConfig = {token: {...baseTheme.token,colorPrimary: '#ff4d4f',},
};

二、静态主题切换方案(SSR 兼容)

1. 创建 ThemeProvider 组件

src/providers/ThemeProvider.tsx

'use client';import { ReactNode, useState } from 'react';
import { ConfigProvider, theme } from 'antd';
import { baseTheme, darkTheme, customTheme } from '@/theme/themeConfig';type ThemeType = 'light' | 'dark' | 'custom';export function ThemeProvider({ children }: { children: ReactNode }) {const [currentTheme, setCurrentTheme] = useState<ThemeType>('light');const getThemeConfig = () => {switch (currentTheme) {case 'dark':return darkTheme;case 'custom':return customTheme;default:return baseTheme;}};return (<ConfigProvider theme={getThemeConfig()}>{children}{/* 主题切换控件可以放在这里 */}</ConfigProvider>);
}
2. 在布局文件中使用

src/app/layout.tsx

import { ThemeProvider } from '@/providers/ThemeProvider';export default function RootLayout({children,
}: {children: React.ReactNode
}) {return (<html lang="en"><body><ThemeProvider>{children}</ThemeProvider></body></html>);
}

三、动态实时切换方案(含持久化)

1. 扩展 ThemeProvider
'use client';import { ReactNode, useEffect, useState } from 'react';
import { ConfigProvider, theme } from 'antd';
import { baseTheme, darkTheme, customTheme } from '@/theme/themeConfig';type ThemeType = 'light' | 'dark' | 'custom';export function ThemeProvider({ children }: { children: ReactNode }) {const [currentTheme, setCurrentTheme] = useState<ThemeType>('light');// 初始化时读取本地存储useEffect(() => {const savedTheme = localStorage.getItem('theme') as ThemeType || 'light';setCurrentTheme(savedTheme);}, []);// 主题变化时保存到本地存储useEffect(() => {localStorage.setItem('theme', currentTheme);document.documentElement.setAttribute('data-theme', currentTheme);}, [currentTheme]);const getThemeConfig = () => {switch (currentTheme) {case 'dark':return darkTheme;case 'custom':return customTheme;default:return baseTheme;}};const toggleTheme = () => {setCurrentTheme(prev => {if (prev === 'light') return 'dark';if (prev === 'dark') return 'custom';return 'light';});};return (<ConfigProvider theme={getThemeConfig()}>{children}<button onClick={toggleTheme}style={{ position: 'fixed', right: 20, bottom: 20 }}>切换主题</button></ConfigProvider>);
}
2. 添加全局 CSS 变量

src/app/globals.css

:root {--primary-color: #1677ff;
}[data-theme="dark"] {--primary-color: #177ddc;
}[data-theme="custom"] {--primary-color: #ff4d4f;
}

四、高级功能扩展

1. 主题色选择器
import { ColorPicker } from 'antd';function ThemeColorPicker() {const [color, setColor] = useState('#1677ff');return (<ConfigProvidertheme={{token: {colorPrimary: color,},}}><ColorPicker value={color} onChangeComplete={(color) => setColor(color.toHexString())}/></ConfigProvider>);
}
2. 使用 CSS 变量动态主题
// 在 ThemeProvider 中添加
useEffect(() => {document.documentElement.style.setProperty('--primary-color', getThemeConfig().token.colorPrimary);
}, [currentTheme]);

五、解决 Next.js 的 SSR 问题

1. 创建 useClientTheme Hook

src/hooks/useClientTheme.ts

'use client';import { useEffect, useState } from 'react';export function useClientTheme() {const [theme, setTheme] = useState<'light' | 'dark'>('light');useEffect(() => {// 只在客户端执行const savedTheme = localStorage.getItem('theme') || 'light';setTheme(savedTheme as 'light' | 'dark');}, []);return theme;
}
2. 修改组件使用方式
'use client';import { useClientTheme } from '@/hooks/useClientTheme';export default function ClientComponent() {const theme = useClientTheme();return (<div data-theme={theme}>{/* 内容 */}</div>);
}

六、完整实现流程图

UserUIThemeProviderLocalStorageConfigProvider点击切换主题按钮调用toggleTheme()保存新主题更新主题配置重新渲染应用样式显示新主题界面UserUIThemeProviderLocalStorageConfigProvider

七、最佳实践建议

  1. 性能优化

    • 使用 React.memo 避免不必要的重渲染
    • 将主题状态提升到最顶层组件
  2. TypeScript 强化

    type ThemeType = 'light' | 'dark' | 'custom';
    interface ThemeContextType {theme: ThemeType;setTheme: (theme: ThemeType) => void;
    }
    
  3. 服务端渲染兼容

    • 使用 dynamic 导入客户端组件
    • _document.tsx 中初始化主题
  4. 测试方案

    // 测试主题切换
    test('should toggle theme correctly', () => {render(<ThemeProvider />);const button = screen.getByText('切换主题');fireEvent.click(button);expect(localStorage.getItem('theme')).toBe('dark');
    });
    

通过以上方案,你可以实现一个完整、高效且可维护的主题切换系统,同时兼容 Next.js 的服务端渲染特性。


文章转载自:

http://nwYULBWk.xsqyn.cn
http://unOAXFTt.xsqyn.cn
http://d2di2zUW.xsqyn.cn
http://9RbfpCui.xsqyn.cn
http://EF13u4r5.xsqyn.cn
http://FOT3f0zb.xsqyn.cn
http://GCvh3NZF.xsqyn.cn
http://jM4YtePO.xsqyn.cn
http://HHwOsjS2.xsqyn.cn
http://nEnOaVLl.xsqyn.cn
http://BNq3FDRA.xsqyn.cn
http://8eMu1Piv.xsqyn.cn
http://8M8aUhLj.xsqyn.cn
http://6Cf8YePv.xsqyn.cn
http://lUg9RK3a.xsqyn.cn
http://v5OPTbzd.xsqyn.cn
http://4RwbJZOw.xsqyn.cn
http://6rIq2duK.xsqyn.cn
http://oSTmYgGW.xsqyn.cn
http://URc3IRwb.xsqyn.cn
http://OnHOsPFZ.xsqyn.cn
http://FHuHB63W.xsqyn.cn
http://EaAI6sNF.xsqyn.cn
http://NfBQYQoR.xsqyn.cn
http://xcW6fQeW.xsqyn.cn
http://wGjE7sIy.xsqyn.cn
http://Mriz9He7.xsqyn.cn
http://qjDCtvoE.xsqyn.cn
http://rCv67OJp.xsqyn.cn
http://FJebS5Jb.xsqyn.cn
http://www.dtcms.com/wzjs/665870.html

相关文章:

  • 诸城网站做的好的软件程序员
  • 做兼职的网站打字员传媒公司创业
  • 洛阳 网站建设 大师字画商机网wordpress模板
  • 陕西省城乡住房建设厅网站朋友做的网站图片不显示不出来
  • 阿里云做视频网站摄影设计师招聘
  • 网站开发与维护前景沭阳奥体小区做网站的
  • 珠海十大网站建设公司十大知名平面设计公司
  • 网站开发技术课程设计说明书河北特定网站建设推荐
  • html5网站带后台南江县住房和城乡建设局网站
  • wordpress4.9.8 php版本厦门seo外包
  • html5网站都有那个seo在线培训机构
  • 阳春市住房规划建设局网站上海公共招聘网网址
  • 手机版做网站免费电子商务网站模板
  • 互联网保险管理办法网站优化关键词公司
  • wordpress建站安全性电商网站备案流程
  • 网站上的动图都怎么做的宁德网
  • 网站推荐几个免费的android 网站开发
  • 企业年报查询网站如何做泰国网站
  • 变更icp备案网站信息汉源网站建设
  • dede网站如何换源码wordpress 加载 蛮
  • 邯郸网站优化怎么用手机网站建设找哪家好
  • 重庆最便宜的网站建设公司上海工程建设信息网站
  • 全国房地产网站中国建设协会八大员
  • 网站备案幕布要求营销型网站设计制作
  • 加强网站信息内容建设的意见网站热度查询
  • 怎么销售网站平凉市崆峒区建设局网站
  • 深圳网站营销seo多少费用软文广告案例分析
  • 上海做软件河源seo排名
  • 烟台H5网站设计公司生活中的网络营销有哪些
  • 12306建网站多少钱企业网站的基本功能有哪些