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 相关文章推荐
jQuery点击改变class并toggle及toggleClass()方法定义用法
Dec 11 Javascript
基于jQuery日历插件制作日历
Mar 11 Javascript
动态加载js、css的实例代码
May 26 Javascript
Bootstrap下拉菜单效果实例代码分享
Jun 30 Javascript
jQuery获取浏览器类型和版本号的方法
Jul 05 Javascript
详解vue的diff算法原理
May 20 Javascript
vue2.0父子组件间传递数据的方法
Aug 16 Javascript
vue实现滑动超出指定距离回顶部功能
Jul 31 Javascript
element ui分页多选,翻页记忆的实例
Sep 03 Javascript
vue和小程序项目中使用iconfont的方法
May 19 Javascript
JS removeAttribute()方法实现删除元素的某个属性
Jan 11 Javascript
ztree+ajax实现文件树下载功能
May 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在字符串中查找另一个字符串
2008/11/19 PHP
showModalDialog 和 showModelessDialog
2007/01/22 Javascript
从js向Action传中文参数出现乱码问题的解决方法
2013/12/29 Javascript
javascript实现限制上传文件大小
2015/02/06 Javascript
js实现滑动触屏事件监听的方法
2015/05/05 Javascript
微信小程序  自定义创建详细介绍
2016/10/27 Javascript
ionic中列表项增加和删除的实现方法
2017/01/22 Javascript
jQuery实现多张图片上传预览(不经过后端处理)
2017/04/29 jQuery
Vue2 使用 Echarts 创建图表实例代码
2017/05/18 Javascript
BootStrap实现文件上传并带有进度条效果
2017/09/11 Javascript
axios进阶实践之利用最优雅的方式写ajax请求
2017/12/20 Javascript
node.js中fs文件系统目录操作与文件信息操作
2018/02/24 Javascript
vue中如何去掉空格的方法实现
2018/11/09 Javascript
JQuery中的常用事件、对象属性与使用方法分析
2019/12/23 jQuery
jquery实现图片无缝滚动 蒙版遮蔽效果
2020/01/11 jQuery
layui实现显示数据表格、搜索和修改功能示例
2020/06/03 Javascript
如何基于viewport vm适配移动端页面
2020/11/13 Javascript
Python实现根据指定端口探测服务器/模块部署的方法
2014/08/25 Python
简单介绍Python中的JSON使用
2015/04/28 Python
Python的装饰器模式与面向切面编程详解
2015/06/21 Python
Python入门_浅谈逻辑判断与运算符
2017/05/16 Python
pandas创建新Dataframe并添加多行的实例
2018/04/08 Python
Python3.6实现连接mysql或mariadb的方法分析
2018/05/18 Python
django drf框架中的user验证以及JWT拓展的介绍
2019/08/12 Python
18个Python脚本可加速你的编码速度(提示和技巧)
2019/10/17 Python
PYTHON如何读取和写入EXCEL里面的数据
2019/10/28 Python
python jenkins 打包构建代码的示例代码
2019/11/29 Python
python实现tail实时查看服务器日志示例
2019/12/24 Python
Python开发入门——迭代的基本使用
2020/09/03 Python
如何使用 Flask 做一个评论系统
2020/11/27 Python
三星加拿大官方网上商店:Samsung CA
2020/12/18 全球购物
物业管理公司实习生自我鉴定
2013/09/19 职场文书
实习鉴定范文
2013/12/19 职场文书
开学典礼主持词
2014/03/19 职场文书
干部考核工作总结2015
2015/07/24 职场文书
Python实现Excel文件的合并(以新冠疫情数据为例)
2022/03/20 Python