摘要:基于這種思路,那留給我們的只有兩步,組件設(shè)計和數(shù)據(jù)設(shè)計。關(guān)于組件的相關(guān)邏輯,可能要在文章里面一次性說清楚,還是需要費很大的精力,不過希望數(shù)據(jù)驅(qū)動的思想能夠讓之前沒有體會到這種開發(fā)樂趣的小伙伴們有到新的想法。
在日常開發(fā)中,我們肯定不止一次碰到重復(fù)的業(yè)務(wù)代碼,明明功能相似,但總沒思路去把它封裝成組件。關(guān)于封裝組件,希望這篇文章能帶給大家新的思路,去更高效的完成日常開發(fā)。(注:例子都是基于ElementUI, 但思路都是一樣的)
示例地址-> https://www.lyh.red/admin
代碼地址
數(shù)據(jù)驅(qū)動構(gòu)建頁面:設(shè)計數(shù)據(jù)結(jié)構(gòu)(綁定value,綁定事件,相關(guān)屬性)-> 生成dom -> dom綁定相關(guān)
監(jiān)聽事件:操作UI -> 觸發(fā)事件 -> 更新數(shù)據(jù) -> 更新UI
數(shù)據(jù)驅(qū)動是基于數(shù)據(jù)觸發(fā)的,在編寫業(yè)務(wù)的時候,只需要編寫好組件的dom結(jié)構(gòu),之后我們便可以不用再去關(guān)心dom層,只需要關(guān)心數(shù)據(jù)就ok。
基于這種思路,那留給我們的只有兩步,組件設(shè)計和數(shù)據(jù)設(shè)計。
搜索欄配置以及生成效果
// 過濾相關(guān)配置 filterInfo: { query: { create_user: "", account: "", name: "" }, list: [ {type: "input", label: "賬戶", value: "account"}, {type: "input", label: "用戶名", value: "name"}, // {type: "select", label: "創(chuàng)建人", value: "create_user"}, // {type: "date", label: "創(chuàng)建時間", value: "create_time"}, {type: "button", label: "搜索", btType: "primary", icon: "el-icon-search", event: "search", show: true}, {type: "button", label: "添加", btType: "primary", icon: "el-icon-plus", event: "add", show: true} ] }
表格配置以及生成效果
// 表格相關(guān) tableInfo: { refresh: false, initCurpage: false, data: [], fieldList: [ {label: "賬號", value: "account"}, {label: "用戶名", value: "name"}, {label: "性別", value: "sex", width: 80, list: "sexList"}, {label: "賬號類型", value: "type", width: 100, list: "accountTypeList"}, {label: "狀態(tài)", value: "status", width: 90, list: "statusList"}, {label: "創(chuàng)建人", value: "create_user"}, {label: "創(chuàng)建時間", value: "create_time", minWidth: 180}, {label: "更新人", value: "update_user"}, {label: "更新時間", value: "update_time", minWidth: 180} ], handle: { fixed: "right", label: "操作", width: "180", btList: [ {label: "編輯", type: "", icon: "el-icon-edit", event: "update", show: true}, {label: "刪除", type: "danger", icon: "el-icon-delete", event: "delete", show: true} ] } }
dom配置和完整頁面
封裝一個搜索欄(功能欄)組件 根據(jù)需求設(shè)計數(shù)據(jù)結(jié)構(gòu)
參數(shù)設(shè)計
搜索參數(shù)query,比如要查詢的參數(shù)有賬號,名字。
dom相關(guān)屬性設(shè)計
首先要考慮dom的類型,和顯示,這是基本的,還有擴(kuò)展類型,比如事件可以設(shè)置event屬性,是否顯示設(shè)置show屬性,這些是比較通用的。
而基于不同類型的dom,如果是input,select,datetime類型的dom,作為一個承載數(shù)據(jù)的容器,則需要一個value屬性去和query中的屬性名對上,除此之外不同類型的dom還有不同的特定屬性,比如select需要提供對應(yīng)的list,datetime需要相關(guān)的pickersOptions去限制時間范圍,如果是按鈕,比如el-button,則可以設(shè)置icon,按鈕相關(guān)type。
最終實現(xiàn):
filterInfo: { query: { create_user: "", account: "", name: "" }, list: [ {type: "input", label: "賬戶", value: "account"}, {type: "input", label: "用戶名", value: "name"}, // {type: "select", label: "創(chuàng)建人", value: "create_user"}, // {type: "date", label: "創(chuàng)建時間", value: "create_time"}, {type: "button", label: "搜索", btType: "primary", icon: "el-icon-search", event: "search", show: true}, {type: "button", label: "添加", btType: "primary", icon: "el-icon-plus", event: "add", show: true} ] }
循環(huán)的dom列表
設(shè)計dom結(jié)構(gòu)先考慮設(shè)計的這個dom需要什么屬性
比如dom是el-input,一個輸入框,可以設(shè)置是否禁止disabled,可以設(shè)置是否可清空clearable,v-model要綁定的數(shù)據(jù),設(shè)置dom的class名,設(shè)置dom綁定的事件。
比如dom是el-select, 除了上面這些屬性,我們還需要這個元素可循環(huán)的list
最終dom結(jié)構(gòu)為:
{{item.label}}
事件怎么綁定在dom上
綁定事件,可以在數(shù)據(jù)結(jié)構(gòu)中給dom設(shè)置一個event屬性,比如說是查詢search,在dom結(jié)構(gòu)中我們可以設(shè)計一個中間層函數(shù)去處理,比如:
{{item.label}}
中間層函數(shù)接收事件類型,然后統(tǒng)一處理。
組件中的函數(shù),外部怎么處理
我覺得組件的話,就承載一個去重復(fù)的作用,將所以重復(fù)的事情去除就可以,像如果是表格,表單,功能欄類似這種可能顯示重復(fù)但是事件多變性的組件,我們則可以考慮將它們的事件派發(fā)到業(yè)務(wù)相關(guān)頁面處理,組件保持去除重復(fù)的工作,簡單干凈明了就好了。
將事件全部交給父級處理:
// 綁定的相關(guān)事件 handleEvent (evnet) { this.$emit("handleEvent", evnet) }, // 派發(fā)按鈕點擊事件 handleClickBt (event, data) { this.$emit("handleClickBt", event, data) }封裝一個tree組件
在后臺管理頁面樹狀組件用到次數(shù)實在太多了,靜態(tài)的樹數(shù)據(jù)加載,動態(tài)的樹數(shù)據(jù)懶加載,左鍵點擊事件,右鍵點擊事件等等,封裝之后,哼哼,誰用誰知道,一個字,爽。設(shè)計屬性
其實就是將elementui中的大部分用上的tree屬性加上,然后再設(shè)計一部分讓組件更加好用的屬性,部分舉個例子。
屬性 | 類型 | 描述 |
---|---|---|
lazy | Boolean | 是否懶加載 |
lazyInfo | Array | 懶加載相關(guān)數(shù)據(jù) |
loadInfo | Object | 正常相關(guān)數(shù)據(jù) |
rightClick | Boolean | 是否需要右鍵菜單 |
rightMenuList | Array | 右鍵菜單列表 |
懶加載數(shù)據(jù)和正常加載數(shù)據(jù)結(jié)構(gòu)的詳細(xì)設(shè)計
/** * 懶加載相關(guān)數(shù)據(jù) * key -> 唯一標(biāo)識 label -> 顯示 type -> 類型 api -> 接口 params -> 參數(shù) leaf -> 是否葉子節(jié)點 */ lazyInfo: { type: Array, default: () => { return [ { key: "id", label: "name", type: "", api: () => {}, params: {key: "", value: "", type: "url"}, // url/query->{data: [{key: "", value: "", default: ""}] type: "query"} leaf: true } ] } }, /** * 正常加載相關(guān) */ loadInfo: { key: "id", label: "name", api: () => {}, params: {key: "", value: "", type: "url"} // url/query->{data: [{key: "", value: "", default: ""}] type: "query"} },事件處理
事件處理同樣是需要派發(fā)到父級處理,以保證組件的可復(fù)用性,通過中間件將樹組件的相關(guān)事件派發(fā)搭到父級。
實現(xiàn)效果懶加載樹組件相關(guān)數(shù)據(jù)配置:
// 樹相關(guān)信息 treeInfo: { refresh: false, refreshLevel: 0, nodeKey: "key", lazy: true, type: 0, // 省市區(qū)類型 lazyInfo: [ { key: "id", label: "name", type: 1, api: getAllApi, params: {key: "pid", value: 1, type: "url"} }, { key: "id", label: "name", type: 2, api: getAllApi, params: {key: "pid", value: "", type: "url"}, leaf: true } ], rightMenuList: [] },
懶加載樹dom結(jié)構(gòu):
實現(xiàn)效果:
總結(jié)本文以后臺管理頁面為例,一般后臺管理頁面常用到的tree, table, form, dialog, 搜索欄已經(jīng)全部做成了可復(fù)用的組件,只需要配置好相關(guān)數(shù)據(jù),引入組件即可使用。
關(guān)于組件的相關(guān)邏輯,可能要在文章里面一次性說清楚,還是需要費很大的精力,不過希望數(shù)據(jù)驅(qū)動的思想能夠讓之前沒有體會到這種開發(fā)樂趣的小伙伴們有到新的想法。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/109248.html
摘要:項目地址前言結(jié)合日常開發(fā),封裝常用功能,提高開發(fā)效率。通用顯示效果支持類型類型文本鏈接文檔圖片用法相關(guān)屬性屬性參數(shù)說明類型可選值默認(rèn)值動畫效果的列的配置對象,更多細(xì)節(jié)請參見列屬性。 項目地址:tbs-ve-template 前言 結(jié)合日常開發(fā),封裝常用功能,提高開發(fā)效率。讓程序猿兄弟姐妹們也有時間約約女票,逗逗男票,做做自己想做的事情,不要天天在辦公室造輪子! 1.通用Table 思路...
摘要:最近在嘗試著封裝一個框架,礙于種種原因,先從簡單的入手吧。基于和封裝的框架,集成數(shù)據(jù)存儲字體圖標(biāo)庫拓展語言網(wǎng)絡(luò)請求等模塊,為了讓業(yè)務(wù)開發(fā)更專注于數(shù)據(jù)驅(qū)動。 最近在嘗試著封裝一個框架,礙于種種原因,先從簡單的入手吧。基于vue和elementUI封裝的框架,集成 數(shù)據(jù)存儲localforage、字體圖標(biāo)庫font-awesome、css拓展語言scss、網(wǎng)絡(luò)請求axios等模塊,為了讓業(yè)...
摘要:介紹基于開發(fā)的一款表單設(shè)計器,提高表單開發(fā)效率的利器,讓開發(fā)者從枯燥的表單代碼編寫中解放出來工具地址地址特性可視化配置頁面提供柵格布局,并采用實現(xiàn)對齊一鍵預(yù)覽配置的效果一鍵生成配置數(shù)據(jù)一鍵生成代碼,立即可運行提供自定義組件滿足用戶自定義 介紹 基于Vue,ElementUI開發(fā)的一款表單設(shè)計器,提高表單開發(fā)效率的利器,讓開發(fā)者從枯燥的表單代碼編寫中解放出來 工具地址:http://to...
摘要:不顯示下載不顯示靜音不顯示音量條不顯示進(jìn)度條只能播放一個不要快進(jìn)按鈕例如父組件這樣回雪月花青春一點點語法大多數(shù)時候,我們希望頁面上播放一個音頻時,其他音頻可以暫停??梢园岩粋€類數(shù)組轉(zhuǎn)化成數(shù)組,這個是我常用的。 showImg(https://segmentfault.com/img/remote/1460000016177005?w=619&h=343); 目的 本項目的目的是教你如...
閱讀 1574·2021-11-23 10:01
閱讀 2969·2021-11-19 09:40
閱讀 3214·2021-10-18 13:24
閱讀 3464·2019-08-29 14:20
閱讀 2980·2019-08-26 13:39
閱讀 1275·2019-08-26 11:56
閱讀 2661·2019-08-23 18:03
閱讀 373·2019-08-23 15:35