最近一直处于半失业状态,好多年没有更新对前端的理解了,闲来看看前端技术的发展。因为一直是个草台班子,身兼多职东看看西看看,一直没太搞清楚iceworks、ant design, fusion等等一堆阿里系的开源项目。用了半小时用iceworks搭了一个react的模板出来,感觉好像自己突然成了react砖家似的,花了几天时间像猫吃刺猬一样,难以下嘴。总是觉得“ICE Design Pro”没有动态主题配置很不方便。摸索了两天,算是磕磕绊绊的抄出了一个功能。那就仿照这“多语言”设置依葫芦画瓢整一个多主题配置吧。

在路径“\src\layouts\BasicLayout\components\Header”下找到了index.jsx

import SelectLang from '@/components/SelectLang';
import SelectTheme from '@/components/SelectTheme'; //添加一个不存在的组件

        <div className={styles.headerAction}>

{/*依葫芦画瓢整个标签,来切换主题*/}
{/*多主题选择*/}
<SelectTheme />
{/*依葫芦画瓢整个标签,来切换主题*/} {/* 多语言选择 */}
<SelectLang />

  然后,照样在“src\components”下把SelectLang文件夹拷贝更名为“SelectTheme”,然后修改"\src\components\SelectTheme\index.jsx"

import React from 'react';
import { Select } from '@alifd/next';
import { getTheme, setTheme } from '@/utils/theme'; const Option = Select.Option;
const Theme_CONFIG = {
'@icedesign/theme': {
text: '默认主题',
icon: '',
},
'@alifd/theme-ice-green': {
text: '绿色主题',
icon: '',
},
'@alifd/theme-ice-orange': {
text: '橙色主题',
icon: '',
},
'@alifd/theme-ice-purple': {
text: '紫色主题',
icon: '',
},
}; function changeTheme(key) {
setTheme(key);
} export default function SelectTheme() {
const selectedTheme = getTheme();
return (
<Select
onChange={changeTheme}
defaultValue={selectedTheme}
size="small"
style={{ display: 'flex', alignItems: 'center' }}
>
{Object.keys(Theme_CONFIG).map((theme) => {
return (
<Option value={theme} key={theme}>
{Theme_CONFIG[theme].text}
</Option>
);
})}
</Select>
);
}

  然后拷贝“src\utils\locale.js”改名为"theme.js"

/**
* 设置当前主题
* @param {String} cTheme
*/
function setTheme(cTheme) {
if (cTheme === undefined) {
cTheme = '@icedesign/theme';
} if (getTheme() !== cTheme) {
window.localStorage.setItem('theme', cTheme);
// 可以在设置的主题包 @icedesign/theme 和 @alifd/theme-ice-purple 之间切换
window.__changeTheme__(cTheme);
}
} /**
* 获取当前主题
*/
function getTheme() {
if (!window.localStorage.getItem('theme')) {
window.localStorage.setItem('theme', navigator.theme);
}
return localStorage.getItem('theme');
} export { setTheme, getTheme };

  测试一下,没问题了。总算抄出来一个功能,比较有装逼的成就感了。

当然用iceworks的GUI还需要改一下"ice.config.js"

  plugins: [
['ice-plugin-fusion', {
// 通过数组方式配置多主题包
themePackage: [{
name: '@icedesign/theme',
// 设置默认加载主题,如果不进行设置,默认以最后添加主题包作为默认主题
default: true,
// 设置自定义主题颜色,可以在 scss 文件中直接使用该变量,比如: .bg-color { background: $custom-color; }
themeConfig: {
'custom-color': '#000',//测试自定义
},
}, {
name: '@alifd/theme-ice-orange',
themeConfig: {
'custom-color': '#fff', //测试自定义
},
}, {
name: '@alifd/theme-ice-green',
themeConfig: {
'custom-color': '#fff',//测试自定义
},
}, {
name: '@alifd/theme-ice-purple',
themeConfig: {
'custom-color': '#fff',//测试自定义
},
}],
}],
['ice-plugin-moment-locales', {
locales: ['zh-cn'],
}]
],

  

剩下的就是用npm把这几个主题引入到工程中了,另外fusion提供了一个可以在线编辑主题的功能,可以访问“Fusion

@alifd 的<Select/>组件貌似还是有一个bug,设置的defaultValue,在页面第一次装置的时候不会触发onChange事件,用 window.onload 来解决,找到根目录下的“src\index.jsx”,修改为:

import React from 'react';
import ReactDOM from 'react-dom'; import './global.scss'; // 引入基础配置文件
import router from './router';
import LanguageProvider from './components/LocaleProvider';
import { getLocale } from './utils/locale'; const locale = getLocale(); /**
* 初始进入加载默认主题
*/
const loadDefaultTheme = function(){
var cTheme = window.localStorage.getItem('theme');
if (cTheme === undefined || cTheme === null) {
cTheme = '@icedesign/theme';
}
window.__changeTheme__(cTheme);
}; const ICE_CONTAINER = document.getElementById('ice-container'); if (!ICE_CONTAINER) {
throw new Error('当前页面不存在 <div id="ice-container"></div> 节点.');
}
else
{
window.onload= loadDefaultTheme;
} ReactDOM.render(
<LanguageProvider locale={locale}>
{router()}
</LanguageProvider>,
ICE_CONTAINER
);  

页面初始化进入,主题可自动引用上一次记忆的设置了。

参考材料:

ice-plugin-fusion

ICE主题配置

Select选择器

使用ice-plugin-fusion给icedesign的模板加个主题(theme)的更多相关文章

  1. 20款时尚的 WordPress 企业模板【免费主题下载】

    在这篇文章中,我们收集了20款时尚的 WordPress 企业模板.WordPress 作为最流行的博客系统,插件众多,易于扩充功能.安装和使用都非常方便,而且有许多第三方开发的免费模板,安装方式简单 ...

  2. Struts2的模板和主题theme及自定义theme的使用

    Struts2的模板和主题theme及自定义theme 标签: struts2 2016-03-29 11:22 190人阅读 评论(0) 收藏 举报  分类: javaweb(8)  Struts2 ...

  3. angular模板加载 ----ng-template

    Angularjs作为mvc(或者说mvvm)框架,同样具备模板这一基本概念. NG加载模板的顺序为 内存加载---AJAX加载. 如果排版乱掉,请查阅https://www.zybuluo.com/ ...

  4. freemarker模板加载TemplateLoader常见方式

    使用过freemarker的肯定其见过如下情况: java.io.FileNotFoundException: Template xxx.ftl not found. 模板找不到.可能你会认为我明明指 ...

  5. velocity模板加载

    http://hi.baidu.com/ly_dayu/item/828b09c5c3c5e547a8ba9409 velocity使用基本来说比较简单,但在加载模板时老出问题,很多初学者经常会遇到找 ...

  6. wordpress模板加载顺序汇总

    我们要创建一个新的wordpress模板需要先了解有哪些页面模板,这些页面模板的文件是什么?它们是怎么工作的?下面ytkah汇总了一些常用的wordpress模板结构方便大家查找 首页 首先WordP ...

  7. legend3---10、vue与lavarel的blade模板加jquery页面开发方式比较

    legend3---10.vue与lavarel的blade模板加jquery页面开发方式比较 一.总结 一句话总结: lavarel的blade模板加jquery:速度快一点:速度快一点,页面加载数 ...

  8. Jquery使用ajax以及angularjs 动态模板加载并进行渲染

    1. 源码 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <tit ...

  9. nodejs模板加载的问题

    JADE模板:http://jumplink.github.io/jade2html2jade/ HTML转JADE,跟imooc上一步步来就搞定了 直接加载HTML静态资源: var express ...

随机推荐

  1. 为什么要使用 SPL中的 SplQueue实现队列

    今天看php的SPL标准库部分里面涉及到数据结构其中有 SplQueue 来实现队列效果,但是我刚接触php的时候学习到的是 使用array的 array_push 和 array_pop 就可以实现 ...

  2. Spring实战(三)Spring中装配Bean的三种方式---XML、JavaConfig、AutoWire

    创建应用对象之间协作关系的行为称为装配(wiring),这也是依赖注入的本质. Spring容器负责创建应用程序中的bean并通过DI来协调这些对象之间的关系,而开发者需要告诉Spring需要创建哪些 ...

  3. Sql Server 收缩日志文件原理及always on 下的实践

    一.准备知识 1.LSN LSN用来标识特定日志在日志文件中位置(详情请见什么是LSN:日志序列号),它由两部分组成:一部分用来标识VLF(虚拟日志文件)的序列号,剩下的用来标识该日志在VLF中的具体 ...

  4. Disruptor 并发框架

    什么是Disruptor Martin Fowler在自己网站上写了一篇LMAX架构的文章,在文章中他介绍了LMAX是一种新型零售金融交易平台,它能够以很低的延迟产生大量交易.这个系统是建立在JVM平 ...

  5. 面试官:Kafka 如何优化内存缓冲机制造成的频繁 GC 问题?

    Jusfr 原创,转载请注明来自博客园 Request 与 Response 的响应格式 Request 与 Response 都是以 长度+内容 形式描述, 见于 A Guide To The Ka ...

  6. [转载]SSD原理与实现

    [转载]SSD原理与实现 这里只mark一下,对原论文讲解的很好的博文 https://zhuanlan.zhihu.com/p/33544892 这里有一个关于SSD的很好的程序实现,readme里 ...

  7. 【CNN】 吴恩达课程中几种网络的比较

    LeNet5 AlexNet VGG16 ResNet  : 残差网络 Inception Net :  特点,可以通过1*1*192 的卷积核来缩减参数个数,压缩维度,约缩减10倍, 例如  :用1 ...

  8. C#中DateTime.Ticks

    DateTime.Ticks:表示0001 年 1 月 1 日午夜 12:00:00 以来所经历的 100 纳秒数,即Ticks的属性为100纳秒(1Ticks = 0.0001毫秒). Unix时间 ...

  9. 【温故知新】php 魔术方法

    <?php class Magic{ private $name; /** *构造方法,在类被实例化时自动调用,一般用于初始化操作 */ public function __construct( ...

  10. python小知识-sys.argv

    sys.argv 就是一个从程序外部获取参数的桥梁 1.t1.py import sys a = sys.argv b = len(sys.argv) print(a) print(b) 在pytho ...