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 相关文章推荐
解析dom中的children对象数组元素firstChild,lastChild的使用
Jul 10 Javascript
Jquery封装tab自动切换效果的具体实现
Jul 13 Javascript
js点击选择文本的方法
Feb 09 Javascript
JavaScript实现文字与图片拖拽效果的方法
Feb 16 Javascript
Javascript无参数和有参数类继承问题解决方法
Mar 02 Javascript
基于Bootstrap里面的Button dropdown打造自定义select
May 30 Javascript
使用jQuery Ajax 请求webservice来实现更简练的Ajax
Aug 04 Javascript
JavaScript数组去重算法实例小结
May 07 Javascript
js 实现在2d平面上画8的方法
Oct 10 Javascript
Django+vue跨域问题解决的详细步骤
Jan 20 Javascript
jQuery使用$.extend(true,object1, object2);实现深拷贝对象的方法分析
Mar 06 jQuery
详解Vue中的基本语法和常用指令
Jul 23 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和js如何通过json互相传递数据相关问题探讨
2013/02/26 PHP
ThinkPHP 5.1 跨域配置方法
2019/10/11 PHP
js页面跳转常用的几种方式
2010/11/25 Javascript
让浏览器非阻塞加载javascript的几种方法小结
2011/04/25 Javascript
js中判断数字\字母\中文的正则表达式 (实例)
2012/06/29 Javascript
jQuery学习笔记之Ajax用法实例详解
2015/12/01 Javascript
关于ES6的六个小特性(二)
2017/02/20 Javascript
Angular之指令Directive用法详解
2017/03/01 Javascript
bootstrap 点击空白处popover弹出框隐藏实例
2018/01/24 Javascript
详解vue+webpack+express中间件接口使用
2018/07/17 Javascript
深入理解JavaScript的值传递和引用传递
2018/10/24 Javascript
Angular6 发送手机验证码按钮倒计时效果实现方法
2019/01/08 Javascript
Vue对象赋值视图不更新问题及解决方法
2019/06/03 Javascript
微信公众号平台接口开发 获取access_token过程解析
2019/08/14 Javascript
解决layui的input独占一行的问题
2019/09/10 Javascript
在vue中使用Base64转码的案例
2020/08/07 Javascript
vue+springboot+element+vue-resource实现文件上传教程
2020/10/21 Javascript
Python多线程同步Lock、RLock、Semaphore、Event实例
2014/11/21 Python
浅谈python中截取字符函数strip,lstrip,rstrip
2015/07/17 Python
Python实现端口检测的方法
2018/07/24 Python
通过python将大量文件按修改时间分类的方法
2018/10/17 Python
django框架model orM使用字典作为参数,保存数据的方法分析
2019/06/24 Python
Python中遍历列表的方法总结
2019/06/27 Python
win10安装tesserocr配置 Python使用tesserocr识别字母数字验证码
2020/01/16 Python
用python给csv里的数据排序的具体代码
2020/07/17 Python
Python 解析简单的XML数据
2020/07/24 Python
django使用多个数据库的方法实例
2021/03/04 Python
CSS3教程(4):网页边框和网页文字阴影
2009/04/02 HTML / CSS
欧洲最大的婴幼儿服装及内衣公司:Petit Bateau(小帆船)
2016/08/16 全球购物
工作中的自我评价如何写好
2013/10/28 职场文书
实习生单位鉴定意见
2013/12/04 职场文书
国家助学金获奖感言
2014/01/31 职场文书
班级学习雷锋活动总结
2014/07/04 职场文书
优秀教师申报材料
2014/12/16 职场文书
债务纠纷起诉书
2015/05/20 职场文书
Pillow图像处理库安装及使用
2022/04/12 Python