UI庫提供了很多元件,元件又帶有很多屬性,有一些常用屬性我們可以記住並且手擼,但是有些不常用的屬性,或者需要設定多個屬性,這樣的情況下寫起來就麻煩了,有時候還要開啟幫助文件看看屬性是怎麼設定的,需要設定什麼樣的屬性值。
那麼有沒有優雅的方式來設定元件的各種屬性呢?我做了一個線上小工具,可以方便的設定屬性,並且可以實時看到效果。
演示地址
https://naturefw.gitee.io/nf-rollup-ui-controller/
原始碼
https://gitee.com/naturefw/nf-rollup-ui-controller
技術棧
- vite:^2.6.4
- vue3: ^3.2.16
- element-plus: ^1.2.0-beta.3
- @element-plus/icons: ^0.0.11
特點
- 可以選擇元件型別,文字、數字、日期、select、checkbox、radio、等等;
- 根據選擇的元件型別,設定對應的屬性,按需設定,不顯示“無效”屬性;
- 可以實時顯示效果,設定屬性後可以立即看到效果,方便調整屬性;
- 設定好的屬性可以生成js的物件和模板程式碼,支援 json 格式;
- 大部分屬性值都可以通過滑鼠點選的方式生成,少數的需要手敲;
工作量比較大、精力有限,目前僅支援 element-plus 的部分元件,理論上可以支援任何UI庫,只是設定屬性有點太繁瑣了,需要時間進行學習、掌握和理解,把相關屬性合在一起,還有除錯演示程式碼等工作。
有沒有感興趣的小夥伴來幫幫忙?
實現思路
實現方法比較土,就是把需要的元件分個類,再把需要的屬性分成兩種:基礎屬性、擴充套件屬性,然後就是力氣活了,把各種屬性整理出來即可。
大類原則
主要是看內容,文字、日期、數字很明顯的可以分別歸類,選擇和下拉都是選擇型別的,分成兩類主要是小分類比較多,分開更清晰一些。
小類原則
- 按照UI庫提供的元件
- 按照功能,“原子”級別
- 按照值的型別,比如陣列和非陣列。
範圍類的元件,值的型別是陣列,非範圍型的元件,值的型別不是陣列,在動態改變某屬性值的時候,陣列和非陣列有的時候不能自動變更型別,導致程式碼出錯。
這樣就需要把範圍類的和非範圍類的分開,比如 select 的單選模式和多選模式,只是一個 “multiple” 屬性的區別,但是這個屬性不能在執行時修改,否則會報錯,所以只好分成兩個小類。
好吧,其實你不用關心這些。
舉例
el-input 可以細分為多個小類:單行文字,多行文字,密碼,URL,可選等。
為什麼要細分呢?因為不同的小類需要的屬性是不同的,細分一下可以縮小備選的屬性範圍,設定起來更清晰,否則像官網那樣,各種屬性都堆在一起,還得分辨一下是否是支援某個小類。
比如 “show-word-limit” 僅支援單行文字和多行文字,並不支援其他小類。如果我要設定一個密碼元件的屬性,那麼就不需要顯示 “show-word-limit”這個屬性,否則看起來就會比較亂。
所以通過細分小類的方式顯示需要的屬性,避免混淆。
基礎屬性
表單裡的元件共有的屬性:
基本上表單裡的元件都需要這幾個屬性,所以拿出來作為基礎屬性,一起設定。
擴充套件屬性按照分類分別設定。
文字類
- 單行文字
- 可以選擇的文字
- 設定顏色
數字類
- 數字
- 滑塊
- 評分
其實最大值沒有做限制,可以>5
日期類
- 日期
- 日期範圍
選擇類
- 開關
- 多選
下拉類
- 單選下拉選單框
不一一列舉了,感興趣的小夥伴可以看線上演示。
https://naturefw.gitee.io/nf-rollup-ui-controller/
生成模板和程式碼
屬性設定完畢之後,可以生成template模板程式碼,以及js裡定義的物件,支援json格式。
- 模板
<el-checkbox-group
v-model="checkboxs"
v-bind="itemProps"
>
<el-checkbox
v-for="item in itemProps.optionList"
:key="'check' + columnId + item.value"
:label="item.value"
:disabled="item.disabled"
>
{{item.label}}
</el-checkbox>
</el-checkbox-group>
- js程式碼
const itemProps = reactive({
colName: 'test',
kind: 15,
controlType: 152,
colCount: 0,
isClear: false,
clearable: true,
optionList: [
{
value: '1',
label: '選項1',
disabled: false
},
{
value: '2',
label: '選項2',
disabled: false
},
{
value: '3',
label: '選項3',
disabled: false
},
{
value: '4',
label: '選項4',
disabled: false
}
]
})
- json 格式
{
"colName": "test",
"kind": 15,
"controlType": 152,
"colCount": 0,
"isClear": false,
"clearable": true,
"optionList": [
{
"value": "1",
"label": "選項1",
"disabled": false
},
{
"value": "2",
"label": "選項2",
"disabled": false
},
{
"value": "3",
"label": "選項3",
"disabled": false
},
{
"value": "4",
"label": "選項4",
"disabled": false
}
]
}
為啥要支援json呢?大家可以猜一猜。
時間倉促,可能有一點小bug,還有屬性值是物件的情況,暫時還沒有支援;屬性是元件(比如圖示)的情況,支援的也不理想。
已知的幾個小問題:
-
評分的小星星為啥顯示不全?
目前沒找到原因。 -
顏色值的返回型別為啥不變?
型別好像不能在執行時修改,執行前設定型別是有效的。 -
日期元件的“年周”型別,同時設定顯示格式和返回格式,會出錯。
線上演示做了封裝(不支援自定義格式),所以沒出錯,但是原生元件不支援兩個屬性一起設定,或者是我使用的方式不對。