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 实现图片无缝滚动
Dec 19 Javascript
使用jQuery给input标签设置默认值
Jun 20 Javascript
微信小程序 页面跳转传参详解
Oct 28 Javascript
vue中添加mp3音频文件的方法
Mar 02 Javascript
JS实现的视频弹幕效果示例
Aug 17 Javascript
使用Vue.js中的过滤器实现幂方求值的方法
Aug 27 Javascript
js实现简易计算器功能
Oct 18 Javascript
js实现随机div颜色位置 类似满天星效果
Oct 24 Javascript
使用Taro实现小程序商城的购物车功能模块的实例代码
Jun 05 Javascript
谈一谈vue请求数据放在created好还是mounted里好
Jul 27 Javascript
Vue2.x和Vue3.x的双向绑定原理详解
Nov 05 Javascript
JS前端使用canvas实现物体的点选示例
Aug 05 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
DOTA2 6.87版本后新眼位详解攻略
2020/04/20 DOTA
PHP和Mysqlweb应用开发核心技术 第1部分 Php基础-1 开始了解php
2011/07/03 PHP
php中的curl使用入门教程和常见用法实例
2014/04/10 PHP
PHP中类的继承和用法实例分析
2016/05/24 PHP
php array_slice 取出数组中的一段序列实例
2016/11/04 PHP
thinkPHP中_initialize方法实例分析
2016/12/05 PHP
laravel5.4利用163邮箱发送邮件的步骤详解
2017/09/22 PHP
js技巧--转义符&quot;\&quot;的妙用
2007/01/09 Javascript
Javascript实现单张图片浏览
2014/12/18 Javascript
Javascript中3个需要注意的运算符
2015/04/02 Javascript
jQuery 移动端artEditor富文本编辑器
2016/01/11 Javascript
逻辑表达式中与或非的用法详解
2016/06/06 Javascript
总结十个Angular.js由浅入深的面试问题
2016/08/26 Javascript
js 判断数据类型的几种方法
2017/01/13 Javascript
Nodejs+express+ejs简单使用实例代码
2017/09/18 NodeJs
JavaScript同源策略和跨域访问实例详解
2018/04/03 Javascript
vue使用keep-alive保持滚动条位置的实现方法
2019/04/09 Javascript
手动实现vue2.0的双向数据绑定原理详解
2021/02/06 Vue.js
[02:17]TI4西雅图DOTA2前线报道 啸天mik夫妻档解说
2014/07/08 DOTA
用Python进行TCP网络编程的教程
2015/04/29 Python
TensorFlow实现RNN循环神经网络
2018/02/28 Python
使用python采集脚本之家电子书资源并自动下载到本地的实例脚本
2018/10/23 Python
Python 使用元类type创建类对象常见应用详解
2019/10/17 Python
一款纯css3实现的鼠标悬停动画按钮
2014/12/29 HTML / CSS
HTML5 File API改善网页上传功能
2009/08/19 HTML / CSS
html5的websockets全双工通信详解学习示例
2014/02/26 HTML / CSS
马克华菲官方商城:Mark Fairwhale
2016/09/04 全球购物
师范应届毕业生自荐信
2013/11/18 职场文书
教师自荐信范文
2013/12/09 职场文书
大学生优秀团员事迹材料
2014/01/30 职场文书
民政局副局长民主生活会个人对照检查材料
2014/09/19 职场文书
2014年评职称工作总结
2014/11/20 职场文书
2014年音乐教师工作总结
2014/12/03 职场文书
中学总务处工作总结
2015/08/12 职场文书
幼儿园教师辞职信
2019/06/21 职场文书
Anaconda配置各版本Pytorch的实现
2021/08/07 Python