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带按钮的提示框可供选择示例代码
Sep 17 Javascript
用js+iframe形成页面的一种遮罩效果的具体实现
Dec 31 Javascript
谷歌浏览器调试JavaScript小技巧
Dec 29 Javascript
this,this,再次讨论javascript中的this,超全面(经典)
Jan 05 Javascript
基于Bootstrap里面的Button dropdown打造自定义select
May 30 Javascript
很棒的js Tab选项卡切换效果
Aug 30 Javascript
js实现图片360度旋转
Jan 22 Javascript
vue+vuex+axios+echarts画一个动态更新的中国地图的方法
Dec 19 Javascript
vue进行图片的预加载watch用法实例讲解
Feb 07 Javascript
vue.js实现图书管理功能
Sep 24 Javascript
如何使用webpack打包一个库library的方法步骤
Dec 18 Javascript
JS+Canvas实现五子棋游戏
Aug 26 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 echo 输出字符串函数详解
2010/05/13 PHP
php正则替换处理HTML页面的方法
2015/06/17 PHP
thinkPHP简单实现多个子查询语句的方法
2016/12/05 PHP
php使用pthreads v3多线程实现抓取新浪新闻信息操作示例
2020/02/21 PHP
javascript 面向对象的JavaScript类
2010/05/04 Javascript
jQuery ajax cache缓存问题
2010/07/01 Javascript
window.parent与window.openner区别介绍
2012/04/12 Javascript
纯js实现div内图片自适应大小(已测试,兼容火狐)
2014/06/16 Javascript
jQuery实现文本展开收缩特效
2015/06/03 Javascript
jQuery的extend方法【三种】
2016/12/14 Javascript
ajax异步请求详解
2017/01/06 Javascript
js实现无缝滚动图
2017/02/22 Javascript
javaScript中&quot;==&quot;和&quot;===&quot;的区别详解
2018/03/16 Javascript
详解Angularjs 自定义指令中的数据绑定
2018/07/19 Javascript
JavaScript函数式编程(Functional Programming)高阶函数(Higher order functions)用法分析
2019/05/22 Javascript
详细讲解Python中的文件I/O操作
2015/05/24 Python
读取本地json文件,解析json(实例讲解)
2017/12/06 Python
Python requests模块实例用法
2019/02/11 Python
python中import与from方法总结(推荐)
2019/03/21 Python
Python将string转换到float的实例方法
2019/07/29 Python
python代码xml转txt实例
2020/03/10 Python
Django 解决model 反向引用中的related_name问题
2020/05/19 Python
浅谈django channels 路由误导
2020/05/28 Python
Python叠加矩形框图层2种方法及效果
2020/06/18 Python
使用TensorBoard进行超参数优化的实现
2020/07/06 Python
Python判断变量是否是None写法代码实例
2020/10/09 Python
详解Pymongo常用查询方法总结
2021/01/29 Python
CSS3改变浏览器滚动条样式
2019/01/04 HTML / CSS
Doyoueven官网:澳大利亚健身服饰和配饰品牌
2019/03/24 全球购物
FirstCry阿联酋儿童和婴儿产品网上购物:FirstCry.ae
2021/02/22 全球购物
C++面试题:关于链表和指针
2013/06/05 面试题
数控技术与应用毕业生自荐信
2013/09/24 职场文书
医学专业毕业生推荐信
2013/11/14 职场文书
销售简历自我评价怎么写
2014/09/26 职场文书
2014年帮扶工作总结
2014/11/26 职场文书
VUE之图片Base64编码使用ElementUI组件上传
2022/04/09 Vue.js