標籤:

React + antd 主題色切換/模板切換

更新日誌:2017.11.22 新增模板切換。

期望功能:客戶端自定義切換主題色。

示例:

示例 cloor-blue:

示例 cloor-yellow:

step1:定義3個theme的less文件。

color.less 用於自定義color覆蓋默認color變數。

step2:redux 中儲存 一個skin欄位。

初始化頁面時請求介面來dispatch skin 已展示賣家設置的默認skin;例如

return axios.get(http://localhost:8030/static/mock/footer.json) .then((res) => { if (res.data.status == success && res.data) { dispatch(setFooterInfo(res.data.data)); let initSkin = getState().home.skin; if (!initSkin) { let skin = res.data.data.skin || "default"; dispatch(setSkin(skin)) } } }).catch((error) => { console.log(error) });

select選擇框切換skin:

handleChangeSkin = (value) => { this.props.setSkin(value)}<Select placeholder=SKIN style={{ width: 60 }} onChange={this.handleChangeSkin}> <Option value="default">默認</Option> <Option value="red">紅色</Option> <Option value="yellow">黃色</Option> <Option value="blue">藍色</Option></Select>

step3:less 文件加入到頁面,這裡加入到了layout:

import PcSkinDefault from ../static/css/skin/pc-default/index.lessimport PcSkinlOne from ../static/css/skin/pc-skin-1/index.lessimport PcSkinlTwo from ../static/css/skin/pc-skin-2/index.lessimport PcSkinlThree from ../static/css/skin/pc-skin-3/index.lessconst selectSkin = (type) => { switch (type) { case one: return PcSkinlOne break; case two: return PcSkinlTwo break; case three: return PcSkinlThree break; default: return PcSkinDefault }}..........//使用dangerouslySetInnerHTML 添加less樣式文件<style dangerouslySetInnerHTML={{__html: selectSkin(children.props.skin)}} />...........

=========================分割線:階段2=============================

更新於 2017-11-22

上面的換膚方案的確存在了很大的局限性,性能方面也有影響,後來就放棄了,原因是:設計師後來的設計稿的主題色脫離了antd,不能通過簡單的替換主題色變數來完成;隨著系統不斷完善,新增了模板切換功能。於是改變了方案。

新需求如下:

(1)前端架構需支持模板切換功能,舉個例子:不同模板下產品Item的展示

(2)每個模板需要多種配色,仍以產品Item為例

思路:

(1)在redux 中儲存兩個欄位: skin 用來儲存模板類型,color 用來儲存選擇的模板顏色。

(2)如果使用了服務端渲染,在getInitialProps 調用介面獲取這兩個欄位。

(3)模板(skin)的切換使用條件渲染:

如下:

if(skin==toy){ return <ToyAdver advList={advList}/>}else if(skin==baby){ return <BabyAdver advList={advList}/>}else if(skin==jewelry){ return <JewelryAdver advList={advList}/>}else{ return <DefaultAdver skin={skin} advList={advList}/>}

(4)顏色(color)的切換:把color的樣式文件單獨抽離,在layout層動態載入對應的color.css。這一步同樣是在服務端完成的。

{ children.length?<link rel=stylesheet href={selectColor(children[0].props.skin)} />: <link rel=stylesheet href={selectColor(children.props.skin)} />}

這一期的內容寫的比較簡單,只是提供了一個思路。

=========================分割線:階段3=============================

階段3:配合拖拽功能,完成店鋪的自定義裝修,不再是僅僅選擇已有的模板 。

Loading.......

Loading.......

Loading.......


推薦閱讀:

ReactEurope 2016 小記 - 下
react阻止冒泡事件,絕對乾貨
Webpack實戰-為單頁應用生成 HTML
不做小透明--React單頁應用動態生成meta tag及測試
一篇文章講清楚React的基礎概念

TAG:React | AntDesign |