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 相关文章推荐
JavaScript包装对象使用介绍
Aug 29 Javascript
JavaScript定义类的几种方式总结
Jan 06 Javascript
sails框架的学习指南
Dec 22 Javascript
jQuery中:button选择器用法实例
Jan 04 Javascript
JavaScript中setFullYear()方法的使用详解
Jun 11 Javascript
JS实现仿QQ面板的手风琴效果折叠菜单代码
Sep 11 Javascript
JS实现不使用图片仿Windows右键菜单效果代码
Oct 22 Javascript
教你如何在Node.js中使用jQuery
Aug 28 Javascript
JS创建Tag标签的方法详解
Jun 09 Javascript
JS中原始值和引用值的储存方式示例详解
Mar 23 Javascript
微信小程序在ios下Echarts图表不能滑动的问题解决
Jul 10 Javascript
交互式可视化js库gojs使用介绍及技巧
Feb 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
PHP mail 通过Windows的SMTP发送邮件失败的解决方案
2009/05/27 PHP
PHP中strtotime函数使用方法分享
2012/01/10 PHP
PHP获取短链接跳转后的真实地址和响应头信息的方法
2014/07/25 PHP
php微信公众平台示例代码分析(二)
2016/12/06 PHP
php readfile下载大文件失败的解决方法
2017/05/22 PHP
简洁短小的 JavaScript IE 浏览器判定代码
2010/03/21 Javascript
使用jquery插件实现图片延迟加载技术详细说明
2011/03/12 Javascript
jQuery表单验证插件formValidator(改进版)
2012/02/03 Javascript
js冒泡法和数组转换成字符串示例代码
2013/08/14 Javascript
javascript中的Function.prototye.bind
2015/06/25 Javascript
JQuery通过AJAX从后台获取信息显示在表格上并支持行选中
2015/09/15 Javascript
BootStrap 超链接变按钮的实现方法
2016/09/25 Javascript
将input框中输入内容显示在相应的div中【三种方法可选】
2017/05/08 Javascript
mac中利用NVM管理不同node版本的方法详解
2017/11/08 Javascript
Vue导出json数据到Excel电子表格的示例
2017/12/04 Javascript
Vue+jquery实现表格指定列的文字收缩的示例代码
2018/01/09 jQuery
jQuery实现导航样式布局操作示例【可自定义样式布局】
2018/07/24 jQuery
vue中img src 动态加载本地json的图片路径写法
2019/04/25 Javascript
layer实现弹出层自动调节位置
2019/09/05 Javascript
[06:45]DOTA2卡尔工作室 英雄介绍幻影长矛手篇
2013/07/12 DOTA
[01:32]DOTA2上海特锦赛现场采访:最想COS的英雄
2016/03/25 DOTA
[01:09:19]DOTA2-DPC中国联赛 正赛 VG vs Aster BO3 第二场 2月28日
2021/03/11 DOTA
对python中类的继承与方法重写介绍
2019/01/20 Python
保加利亚手表、香水、化妆品和珠宝购物网站:Brasty.bg
2020/04/22 全球购物
财务会计专业应届毕业生求职信
2013/10/18 职场文书
大学团支书的自我评价分享
2013/12/14 职场文书
2014年父亲节活动方案
2014/03/06 职场文书
管理提升方案
2014/06/04 职场文书
小学生美德少年事迹材料
2014/08/24 职场文书
2014年客服工作总结范文
2014/11/13 职场文书
财务经理岗位职责
2015/01/31 职场文书
大学生军训感言
2015/08/01 职场文书
承诺书的签字人,需不需要承担相应的责任?
2019/07/09 职场文书
python 实现mysql自动增删分区的方法
2021/04/01 Python
SQL优化老出错,那是你没弄明白MySQL解释计划用法
2021/11/27 MySQL
ICOM R71E和R72E图文对比解说
2022/04/07 无线电