使用ice-plugin-fusion給icedesign的模板加個主題(theme)

来源:https://www.cnblogs.com/chinull/archive/2019/09/18/iceworks-theme.html
-Advertisement-
Play Games

抄寫多語言組件,基於ice-plugin-fusion為iceworks的“ICE Design Pro”實現一個多主題切換功能 ...


最近一直處於半失業狀態,好多年沒有更新對前端的理解了,閑來看看前端技術的發展。因為一直是個草台班子,身兼多職東看看西看看,一直沒太搞清楚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選擇器

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 當我們在src目錄下創建.scss文件,併在main.js中引用,運行時會報: ERROR Failed to compile with 1 errors 5:25:07 PMThis relative module was not found: * ./main.scss in ./src/mai ...
  • 0918自我總結 js獲取時間,迴圈執行任務,延遲執行任務 一.獲取時間 核心方法創建一個時間對象: 時間對象相關操作 .`函數名` | 函數名 | 功能 | | : | : | | getYear() | 獲取四位數的年份 | | getMonth() | 獲取2位數的月數, 這個是從 0 開始的 ...
  • 近期需要在vue3項目上做一個富文本編輯器,找了很多插件組件,最終決定用 froala。雖然不是免費的,但是功能實在是太強大了。 froala 文檔:https://www.froala.com/wysiwyg-editor/docs/overview froala 官方demo: https:// ...
  • 許多OO語言支持兩種繼承:介面繼承和實現繼承。ECMAScript只支持實現繼承,且繼承實現主要依賴原型鏈實現。 原型鏈 基本思想:利用原型讓一個引用類型繼承另一個引用類型的屬性和方法。 構造函數、原型和實例的關係:每個構造函數均有一個原型對象,原型對象均包含一個指向構造函數的指針,實例均包含一個指 ...
  • html 顯示 pdf文件四種方式: 1、 2、 3、 4、 ...
  • 在我們做官網中經常會在網頁中插入百度地圖,這個其實挺簡單的,下麵跟著步驟一步步來。 1.進入百度創建地圖的網站 http://api.map.baidu.com/lbsapi/creatmap/ 2.看到圖中第一步的下麵有1,2,3三個小步驟,打開1.定位中心點→切換裡面的城市按鈕,選擇你要展示的城 ...
  • 這是今天在寫vue項目時發生的一個小問題,在此記錄一下,方便自己的回顧。項目是前後端分離的,前臺主要使用了vue-cli3.0 + mintui,是一個移動端的web app包括了後臺發佈管理的一些功能,其他就先不介紹了,項目後期方便的話我會截取一些代碼發佈在我的github上,自己也是第一次嘗試用 ...
  • if(window.plus)//判斷當前的設備是手機 window.localStorage.setItem("key","value");//設置值 window.localStorage.getItem("key");//獲取值 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...