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 实用的文字链提示框效果
Jun 30 Javascript
js 实现图片预加载(js操作 Image对象属性complete ,事件onload 异步加载图片)
Mar 25 Javascript
Prototype源码浅析 String部分(二)
Jan 16 Javascript
jquery post方式传递多个参数值后台以数组的方式进行接收
Jan 11 Javascript
几种延迟加载JS代码的方法加快网页的访问速度
Oct 12 Javascript
js 判断浏览器使用的语言示例代码
Mar 22 Javascript
node.js中的fs.writeFile方法使用说明
Dec 14 Javascript
javascript封装的sqlite操作类实例
Jul 17 Javascript
JavaScript实现快速排序的方法
Jul 31 Javascript
用JavaScript获取页面文档内容的实现代码
Jun 10 Javascript
深入理解AngularJS中的ng-bind-html指令
Mar 27 Javascript
详解vue的数据劫持以及操作数组的坑
Apr 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学习资料汇总与网址
2007/03/16 PHP
PHP容易被忽略而出错陷阱 数字与字符串比较
2011/11/10 PHP
php缓冲 output_buffering和ob_start使用介绍
2014/01/30 PHP
php的hash算法介绍
2014/02/13 PHP
ThinkPHP 3使用OSS的方法
2018/07/19 PHP
php变量与字符串的增删改查操作示例
2020/05/07 PHP
图片之间的切换
2006/06/26 Javascript
JS宝典学习笔记(下)
2007/01/10 Javascript
一个基于jquery的文本框记数器
2012/09/19 Javascript
JS实现双击屏幕滚动效果代码
2015/10/28 Javascript
JavaScript中利用各种循环进行遍历的方式总结
2015/11/10 Javascript
JavaScript动态添加css样式和script标签
2016/07/19 Javascript
详解React中的组件通信问题
2017/07/31 Javascript
JS常见DOM节点操作示例【创建 ,插入,删除,复制,查找】
2018/05/14 Javascript
JavaScript中常见内置函数用法示例
2018/05/14 Javascript
vue 的 solt 子组件过滤过程解析
2019/09/07 Javascript
Vue常用传值方式、父传子、子传父及非父子实例分析
2020/02/24 Javascript
Vue 基于 vuedraggable 实现选中、拖拽、排序效果
2020/05/18 Javascript
详解JavaScript中的数据类型,以及检测数据类型的方法
2020/09/17 Javascript
[48:53]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS VG第一场
2014/05/26 DOTA
[05:22]DOTA2 2015国际邀请赛中国区预选赛首日TOP10
2015/05/26 DOTA
[00:12]2018DOTA2亚洲邀请赛 Somnus丶M出阵单挑
2018/04/06 DOTA
Python中的各种装饰器详解
2015/04/11 Python
在Python程序中进行文件读取和写入操作的教程
2015/04/28 Python
python中星号变量的几种特殊用法
2016/09/07 Python
简单谈谈python中的语句和语法
2017/08/10 Python
NLTK 3.2.4 环境搭建教程
2018/09/19 Python
使用turtle绘制五角星、分形树
2019/10/06 Python
【HTML5】Canvas绘制简单图片教程
2016/05/13 HTML / CSS
个人自我鉴定范文
2013/10/04 职场文书
领导班子党的群众路线对照检查材料
2014/09/25 职场文书
2014年乡镇党建工作总结
2014/11/11 职场文书
自荐信怎么写
2015/03/04 职场文书
专家推荐信怎么写
2015/03/25 职场文书
mysql字符串截取函数小结
2021/04/05 MySQL
php实现自动生成验证码的实例讲解
2021/11/17 PHP