react实现antd线上主题动态切换功能


Posted in Javascript onAugust 12, 2019

demo

框架选择: create-react-app + mobx + webpack5 + antdesign

说明

  • 由于最近公司有多个主题的共存性,所以需要实现线上主题切换的功能,所以本文主要描述的是基于create-react-app之上的主题切换。
  • CSS切换 有考虑过根据用户选择的主题在切换的时候选择加载页面css文件的区分方案,但是考虑到这种形式需要在页面切换的时候去reload,因为htmlDOM是在css与JS的结合产物,用户体验不是很好。
  • Less切换 单纯引入所有的less文件去做切换,这样不能实现css的动态加载了,会增加无用css文件的加载
  • 最后通过比较及查询,获取到第三方插件:antd-theme-generator
  • 功能实现原则:使用 less 的 modifyVars 完成 antd 的主题变量替换。

安装 

antd-theme-generator

缺点: 需要配合 LESS v2.7.x 使用,不兼容IE。

cnpm install antd-theme-generator -S

添加主题切换文件 color.js

根目录下添加文件 color.js ,添加配置内容:

const path = require('path');
const { generateTheme, } = require('antd-theme-generator');

const options = {
 stylesDir: path.join(__dirname, './src/css'),
 antDir: path.join(__dirname, './node_modules/antd'),
 varFile: path.join(__dirname, './src/css/variables.less'),
 mainLessFile: path.join(__dirname, './src/css/index.less'),
 themeVariables: [ //需要动态切换的主题变量
  '@primary-color',
  '@secondary-color',
  '@text-color',
  '@text-color-secondary',
  '@heading-color',
  '@layout-body-background'
 ],
 indexFileName: 'index.html',
 outputFilePath: path.join(__dirname, './public/color.less'), //页面引入的主题变量文件
}

generateTheme(options).then(less => {
 console.log('Theme generated successfully');
})
.catch(error => {
 console.log('Error', error);
});

CSS 文件下添加less文件

添加 variables.less 文件:

@import "~antd/lib/style/themes/default.less"; //引入antd的变量文件,实现变量的覆盖
@primary-color: #1DA57A;
@link-color: #1DA57A;
@btn-primary-bg:#1DA57A;

HTML文件中加入全局less配置

index.html 中加入全局 less 变量配置,从而使 less 的 modifyVars 方法可以全局使用,切换主题时覆盖 default.less 中的变量:

<!-- 使用自动生成的color.less,主要路径与index.html文件同级 -->
<link rel="stylesheet/less" type="text/css" href="%PUBLIC_URL%/color.less" rel="external nofollow" /> 
<script>
 window.less = {
  async: false,
  env: 'production'
 };
</script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/less.js/2.7.2/less.min.js"></script>

项目启动处修改

修改项目运行配置 package.json ,项目运行的同时完成页面color文件的配置

"scripts": {
 "start": "node color && node scripts/start.js",
 "build": "node color && node scripts/build.js",
 "test": " node color && node scripts/test.js"
},

页面调用方法切换主题

页面点击主题切换配置,这样写的缘故是因为我配置的变量不同:

window.less.modifyVars(
 {
  '@primary-color': '#aaa',
  '@menu-dark-item-active-bg':'#aaa',
  '@link-color': '#aaa',
  '@text-color':'#aaa',
  '@btn-primary-bg': '#aaa',
 }
)
.then(() => { 
 message.success('主题切换成功')
})
.catch(error => {
 message.error(`主题切换失败`);
 console.log(error)
});

由于之后的配置中新增的样式需要遵循主题配置的可以选择使用统一变量,所以变量设置的时候,可以添加 var(--PC) 的全局变量设置

总结

以上所述是小编给大家介绍的react实现antd线上主题动态切换功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
jQuery实现等比例缩放大图片让大图片自适应页面布局
Oct 16 Javascript
安装使用Mongoose配合Node.js操作MongoDB的基础教程
Mar 01 Javascript
基于jQuery实现Ajax验证用户名是否存在实例
Mar 30 Javascript
JavaScript中的原型继承基础学习教程
May 06 Javascript
JS实现Ajax的方法分析
Dec 20 Javascript
javascript实现去除HTML标签的方法
Dec 26 Javascript
ReactNative实现Toast的示例
Dec 31 Javascript
JS中的回调函数实例浅析
Mar 21 Javascript
vue2.0学习之axios的封装与vuex介绍
May 28 Javascript
纯JS实现五子棋游戏
May 28 Javascript
JS实现手风琴特效
Nov 08 Javascript
AJAX学习笔记
May 18 Javascript
vue从一个页面跳转到另一个页面并携带参数的解决方法
Aug 12 #Javascript
解析原来浏览器原生支持JS Base64编码解码
Aug 12 #Javascript
在vue-cli 3中给stylus、sass样式传入共享的全局变量
Aug 12 #Javascript
微信小程序实现页面跳转传递参数(实体,对象)
Aug 12 #Javascript
微信小程序实现传递多个参数与事件处理
Aug 12 #Javascript
node命令行工具之实现项目工程自动初始化的标准流程
Aug 12 #Javascript
五分钟搞懂Vuex实用知识(小结)
Aug 12 #Javascript
You might like
颠覆常识!无色透明的咖啡诞生了(中日双语)
2021/03/03 咖啡文化
深入apache配置文件httpd.conf的部分参数说明
2013/06/28 PHP
thinkPHP学习笔记之安装配置篇
2015/03/05 PHP
php注册和登录界面的实现案例(推荐)
2016/10/24 PHP
PHP字符串和十六进制如何实现互相转换
2020/07/16 PHP
JavaScript 设计模式 富有表现力的Javascript(一)
2010/05/26 Javascript
吐槽一下我所了解的Node.js
2014/10/08 Javascript
jQuery中:header选择器用法实例
2014/12/29 Javascript
jquery实现图片上传之前预览的方法
2015/07/11 Javascript
window.onload绑定多个事件的两种解决方案
2016/05/15 Javascript
JS实现刷新父页面不弹出提示框的方法
2016/06/22 Javascript
JQuery Dialog对话框 不能通过Esc关闭的原因分析及解决办法
2017/01/18 Javascript
详解基于vue的移动web app页面缓存解决方案
2017/08/03 Javascript
javaScript中&quot;==&quot;和&quot;===&quot;的区别详解
2018/03/16 Javascript
vue 每次渲染完页面后div的滚动条保持在最底部的方法
2018/03/17 Javascript
React 无状态组件(Stateless Component) 与高阶组件
2018/08/14 Javascript
layui 表格的属性的显示转换方法
2018/08/14 Javascript
JavaScript中set与get方法用法示例
2018/08/15 Javascript
解决微信小程序中转换时间格式IOS不兼容的问题
2019/02/15 Javascript
VUE项目初建和常见问题总结
2019/09/12 Javascript
vue实现路由监听和参数监听
2019/10/29 Javascript
node.js express捕获全局异常的三种方法实例分析
2019/12/27 Javascript
node.js获取参数的常用方法(总结)
2017/05/29 Python
在python中创建指定大小的多维数组方式
2019/11/28 Python
Python大批量搜索引擎图像爬虫工具详解
2020/11/16 Python
python使用正则表达式匹配txt特定字符串(有换行)
2020/12/09 Python
CSS3教程(2):网页边框半径和网页圆角
2009/04/02 HTML / CSS
What is view? why do we have view?
2012/06/22 面试题
签约仪式主持词
2014/03/19 职场文书
意向书范文
2014/03/31 职场文书
护理专业毕业生自荐书
2014/05/24 职场文书
幸福家庭事迹材料
2014/12/20 职场文书
运动员入场词
2015/07/18 职场文书
分析ZooKeeper分布式锁的实现
2021/06/30 Java/Android
24年收藏2000多部退役军用电台
2022/02/18 无线电
python保存图片的四个常用方法
2022/02/28 Python