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 相关文章推荐
js鼠标点击事件在各个浏览器中的写法及Event对象属性介绍
Jan 24 Javascript
Javascript 修改String 对象 增加去除空格功能(示例代码)
Nov 30 Javascript
JavaScript代码复用模式详解
Nov 07 Javascript
js获取域名的方法
Jan 27 Javascript
jsMind通过鼠标拖拽的方式调整节点位置
Apr 13 Javascript
Javascript实现图片加载从模糊到清晰显示的方法
Jun 21 Javascript
前端js实现文件的断点续传 后端PHP文件接收
Oct 14 Javascript
jQuery EasyUI Panel面板组件使用详解
Feb 28 Javascript
JS验证input输入框(字母,数字,符号,中文)
Mar 23 Javascript
Vuex之理解state的用法实例
Apr 19 Javascript
JavaScript之DOM_动力节点Java学院整理
Jul 03 Javascript
Vue-resource安装过程及使用方法解析
Jul 21 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和ACCESS写聊天室(八)
2006/10/09 PHP
php中转义mysql语句的实现代码
2011/06/24 PHP
PHP跨时区(UTC时间)应用解决方案
2013/01/11 PHP
thinkphp模板的包含与渲染实例分析
2014/11/26 PHP
Laravel5.3+框架定义API路径取消CSRF保护方法详解
2020/04/06 PHP
鼠标图片振动代码
2006/07/06 Javascript
有关于JS构造函数的重载和工厂方法
2013/04/07 Javascript
js 操作select与option(示例讲解)
2013/12/20 Javascript
判断客户浏览器是否支持cookie的示例代码
2013/12/23 Javascript
jquery实现的导航固定效果
2014/04/28 Javascript
jquery点击缩略图切换视频播放特效代码分享
2015/09/15 Javascript
jQuery拖拽排序插件制作拖拽排序效果(附源码下载)
2016/02/23 Javascript
Javascript技术栈中的四种依赖注入小结
2016/02/27 Javascript
极力推荐一款小巧玲珑的可视化编辑器bootstrap-wysiwyg
2016/05/27 Javascript
js操作XML文件的实现方法兼容IE与FireFox
2016/06/25 Javascript
JavaScript里 ==与===区别详解
2016/08/16 Javascript
基于jQuery实现简单人工智能聊天室
2017/02/10 Javascript
微信小程序商城项目之商品属性分类(4)
2017/04/17 Javascript
前端主流框架vue学习笔记第一篇
2017/07/26 Javascript
vue elementui 实现搜索栏公共组件封装的实例代码
2020/01/20 Javascript
[57:29]Alliance vs KG 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/17 DOTA
pyramid配置session的方法教程
2013/11/27 Python
听歌识曲--用python实现一个音乐检索器的功能
2016/11/15 Python
使用python实现tcp自动重连
2017/07/02 Python
PyTorch上实现卷积神经网络CNN的方法
2018/04/28 Python
Python实现读取机器硬件信息的方法示例
2018/06/09 Python
Python学习笔记之While循环用法分析
2019/08/14 Python
python range实例用法分享
2020/02/06 Python
解决tensorflow/keras时出现数组维度不匹配问题
2020/06/29 Python
详解Python中Pyyaml模块的使用
2020/10/08 Python
参观接待方案
2014/03/17 职场文书
廉洁自律演讲稿
2014/05/22 职场文书
绵山导游词
2015/02/05 职场文书
初中生活随笔
2015/08/15 职场文书
机械原理课程设计心得体会
2016/01/15 职场文书
Vue vee-validate插件的简单使用
2021/06/22 Vue.js