摘要:概述后臺(tái)管理系統(tǒng)里面有非常多的表單需求,我們希望能夠通過寫一個(gè)格式的數(shù)據(jù),通過的循環(huán)動(dòng)態(tài)地去渲染動(dòng)態(tài)表單。我結(jié)合的控件的下拉框輸入框,時(shí)間選擇控件和,做了一個(gè)動(dòng)態(tài)表單。
概述
后臺(tái)管理系統(tǒng)里面有非常多的表單需求,我們希望能夠通過寫一個(gè)json格式的數(shù)據(jù),通過vue的循環(huán)動(dòng)態(tài)地去渲染動(dòng)態(tài)表單。并且能夠在外部得到渲染出來(lái)的表單的數(shù)據(jù),可以對(duì)表單進(jìn)行重置操作。我結(jié)合element ui的控件的下拉框,輸入框,時(shí)間選擇控件和vue-treeselect,做了一個(gè)動(dòng)態(tài)表單。
v-model的理解先簡(jiǎn)單講一下vue-model是怎么玩的。其實(shí)vue-model相當(dāng)于給表單元素傳遞一個(gè)value,外部監(jiān)聽input事件。所以我們自己封裝表單組件的時(shí)候也是可以傳遞一個(gè)value值,監(jiān)聽input事件獲取輸入的值。
封裝表單組件
組件最重要的開發(fā)思想就是設(shè)計(jì)好輸入輸出。這里就以下拉框組件為例吧。使用的是element ui的下拉框,進(jìn)行一個(gè)簡(jiǎn)單封裝。
輸入:name:每個(gè)表單的數(shù)據(jù)標(biāo)識(shí),如區(qū)域編碼輸入框,父元素應(yīng)該傳遞areaCode過來(lái)。
value: 表單選擇/輸入的值,從父元素獲取后賦值給currentValue,通過監(jiān)聽父元素的值實(shí)現(xiàn)同步變 化。 options:下拉框要渲染的選項(xiàng)值,一般是個(gè)對(duì)象數(shù)組。
輸出:onInputEvent,emit一個(gè)input事件,讓父元素能夠感知組件的數(shù)據(jù)變化。
也就是可以在組件使用的地方監(jiān)聽input事件
一點(diǎn)封裝
由于每個(gè)表單組件都是監(jiān)聽父元素的value值變化,數(shù)據(jù)變化時(shí)都是觸發(fā)onInputEvent并執(zhí)行this.$emit("input"),所以我們可以把這部分內(nèi)容抽取出來(lái)放在mixins里面。
form-model.js
export default { props: ["name", "value"], data () { return { currentValue: this.value }; }, methods: { onInputEvent(value) { this.$emit("input", this.name, value); }, reset() { this.currentValue = ""; } }, watch: { value (val) { this.currentValue = val; } } };
然后我們的下拉框組件就可以少寫一些共用的代碼,直接用 mixins: [formMixins]
動(dòng)態(tài)生成表單
這里主要是根據(jù)配置的數(shù)據(jù),循環(huán)生成表單組件。默認(rèn)提供提交和重置按鈕,如果不需要可以通過slot傳遞其他操作按鈕。這里的要點(diǎn)主要有:
監(jiān)聽表單組件的數(shù)據(jù)變化:
每個(gè)表單組件都有一個(gè)name標(biāo)識(shí)它的業(yè)務(wù)含義,綁定的數(shù)據(jù)也是formData[field.name],@input事件傳遞updateForm,在updateForm里面更新this.formData[name],保證了this.formData里面的數(shù)據(jù)是和表單組件選擇/填寫的內(nèi)容一致。
重置時(shí)改變表單組件的數(shù)據(jù):
因?yàn)榻M件內(nèi)部會(huì)監(jiān)聽父元素的value,所以這里只要清空this.formData的值,組件內(nèi)部的數(shù)據(jù)也會(huì)跟著清空。
業(yè)務(wù)使用的地方{{onSubmitText}} {{onResetText}}
像下拉框的選擇數(shù)據(jù),這些應(yīng)該是后臺(tái)渲染的,所以我們暫時(shí)用setTimeout模擬一下。感覺這里this.config.fieldsConfig[4].options寫的不太優(yōu)雅,依賴于配置數(shù)據(jù)的順序肯定不是啥好事情。求大神指點(diǎn)。
大概就是這樣的思路,我們希望我們只要寫上面那樣子的配置數(shù)據(jù)就可以動(dòng)態(tài)生成各種這樣的表單組件,不用寫一大堆重復(fù)代碼。如果有更好的解決辦法,歡迎和我聯(lián)系。另外,代碼路徑https://github.com/supportlss...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/108534.html
摘要:在要改變的樣式前加二問題去掉項(xiàng)目路徑中的主要用到的模式。這里建議你直接看官網(wǎng)的,版本的和版本的不同。當(dāng)瀏覽器窗口變小時(shí),組件寬度不隨窗口響應(yīng)變小。這里我們需要沖突掉中的樣式,該值不能設(shè)置成可以改成小于即可。 一、樣式問題 1.vue中使用less 安裝less依賴 npm install less less-loader --save-dev 在使用時(shí) 在style標(biāo)簽中加入 lang...
摘要:注意指令前面需要加,對(duì)指令傳遞數(shù)據(jù)賦值使用例如約定速成加上,表示自定義指令不要使用駝峰式命名。需要通過方法實(shí)現(xiàn)自定義指令注冊(cè)完成。 vue Vue.js 構(gòu)建數(shù)據(jù)驅(qū)動(dòng)的web界面庫(kù)。集中實(shí)現(xiàn)MVVM 的 VM層。容易與其他庫(kù)或項(xiàng)目整合 通過盡可能簡(jiǎn)單的API實(shí)現(xiàn)相應(yīng)的數(shù)據(jù)綁定和組合的視圖組件核心:相應(yīng)的數(shù)據(jù)綁定系統(tǒng), 數(shù)據(jù)與DOM保持同步數(shù)據(jù)驅(qū)動(dòng)的視圖,普通的HTML模板中使用特殊的語(yǔ)...
摘要:的二大核心響應(yīng)式數(shù)據(jù)變化當(dāng)視圖發(fā)生改變,數(shù)據(jù)自動(dòng)更新。組合的視圖組件頁(yè)面映射為組件樹劃分組件可復(fù)用利于維護(hù)。正在不斷的學(xué)習(xí)中希望各位指點(diǎn)錯(cuò)誤,一起討論,一起進(jìn)步,后續(xù)更新中 Vue是一套用于構(gòu)建用戶界面的漸進(jìn)式框架,Vue的核心庫(kù)只關(guān)注視圖層,不僅容易上手,還便于與第三方庫(kù)既有項(xiàng)目整合,相互獨(dú)立而又可以任意整合。 showImg(https://segmentfault.com/img...
摘要:最近項(xiàng)目中遇到的需求是要操作大量的表單,之前的項(xiàng)目中有做過這方的研究,只不過是用來(lái)操作。添加操作上面的只是其中一個(gè)動(dòng)態(tài)列表。 最近項(xiàng)目中遇到的需求是要操作大量的表單,之前的項(xiàng)目中有做過這方的研究,只不過是用jquery來(lái)操作。 項(xiàng)目A 先簡(jiǎn)單說(shuō)說(shuō)以前項(xiàng)目A中的應(yīng)用場(chǎng)景,可能有小伙伴兒也遇到相同的需求。A項(xiàng)目是公司的OA系統(tǒng)中有的項(xiàng)目,是用java的jsp渲染的頁(yè)面,需求是要改成:嵌入A...
摘要:最近項(xiàng)目中遇到的需求是要操作大量的表單,之前的項(xiàng)目中有做過這方的研究,只不過是用來(lái)操作。添加操作上面的只是其中一個(gè)動(dòng)態(tài)列表。 最近項(xiàng)目中遇到的需求是要操作大量的表單,之前的項(xiàng)目中有做過這方的研究,只不過是用jquery來(lái)操作。 項(xiàng)目A 先簡(jiǎn)單說(shuō)說(shuō)以前項(xiàng)目A中的應(yīng)用場(chǎng)景,可能有小伙伴兒也遇到相同的需求。A項(xiàng)目是公司的OA系統(tǒng)中有的項(xiàng)目,是用java的jsp渲染的頁(yè)面,需求是要改成:嵌入A...
閱讀 2518·2021-09-24 10:29
閱讀 3799·2021-09-22 15:46
閱讀 2571·2021-09-04 16:41
閱讀 2977·2019-08-30 15:53
閱讀 1258·2019-08-30 14:24
閱讀 3052·2019-08-30 13:19
閱讀 2170·2019-08-29 14:17
閱讀 3520·2019-08-29 12:55