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的执行过程(图文)
May 20 Javascript
JavaScript实现网页图片等比例缩放实现代码及调用方式
Feb 25 Javascript
Textarea根据内容自适应高度
Oct 28 Javascript
jQuery中trigger()方法用法实例
Jan 19 Javascript
jquery获取及设置outerhtml的方法
Mar 09 Javascript
javascript常见数字进制转换实例分析
Apr 21 Javascript
JQuery 封装 Ajax 常用方法(推荐)
May 21 jQuery
vue 标签属性数据绑定和拼接的实现方法
May 17 Javascript
element ui 表格动态列显示空白bug 修复方法
Sep 04 Javascript
MockJs结合json-server模拟后台数据
Aug 26 Javascript
JS实现普通轮播图特效
Jan 01 Javascript
Vue Mint UI mt-swipe的使用方式
Jun 05 Vue.js
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中header设置常见文件类型的content-type
2015/06/23 PHP
PHP实现可自定义样式的分页类
2016/03/29 PHP
轻松实现php文件上传功能
2017/02/17 PHP
为何说PHP引用是个坑,要慎用
2018/04/02 PHP
使用laravel的Eloquent模型如何获取数据库的指定列
2019/10/17 PHP
js arguments.callee的应用代码
2009/05/07 Javascript
Js 随机数产生6位数字
2010/05/13 Javascript
qTip2 精致的基于jQuery提示信息插件
2012/02/17 Javascript
JS+CSS实现弹出全屏灰黑色透明遮罩效果的方法
2014/12/20 Javascript
JS中的二叉树遍历详解
2016/03/18 Javascript
简单分析javascript中的函数
2016/09/10 Javascript
最全面的百度地图JavaScript离线版开发
2016/09/10 Javascript
jquery uploadify如何取消已上传成功文件
2017/02/08 Javascript
vue2.0 自定义日期时间过滤器
2017/06/07 Javascript
bootstrap paginator分页前后台用法示例
2017/06/17 Javascript
js学习总结之DOM2兼容处理顺序问题的解决方法
2017/07/27 Javascript
React Native中的RefreshContorl下拉刷新使用
2017/10/09 Javascript
vue+element实现打印页面功能
2019/05/20 Javascript
python实现图片变亮或者变暗的方法
2015/06/01 Python
Python 判断图像是否读取成功的方法
2019/01/26 Python
python实现最大子序和(分治+动态规划)
2019/07/05 Python
命令行运行Python脚本时传入参数的三种方式详解
2019/10/11 Python
德国网上药房:Apotal
2017/04/04 全球购物
最耐用行李箱,一箱永流传:Briggs & Riley(全球终身保修)
2017/12/07 全球购物
欧舒丹美国官网:L’Occitane美国
2018/02/23 全球购物
介绍一下linux的文件系统
2015/10/06 面试题
战略合作协议书范本
2014/04/18 职场文书
体操比赛口号
2014/06/10 职场文书
学校社会实践活动总结
2014/07/03 职场文书
2014旅游局领导班子四风问题对照检查材料思想汇报
2014/09/19 职场文书
公安机关纪律作风整顿个人剖析材料材料
2014/10/10 职场文书
党员公开承诺书2015
2015/01/21 职场文书
寒山寺导游词
2015/02/03 职场文书
2015年会计个人工作总结
2015/04/02 职场文书
golang gopm get -g -v 无法获取第三方库的解决方案
2021/05/05 Golang
Node-Red实现MySQL数据库连接的方法
2021/08/07 MySQL