亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

基于vue通用表單解決方案的思考與分析

2019-11-19 11:59:14
字體:
來源:轉載
供稿:網友

前言

“那要怎么改?”,“那得改到什么時候?”,“什么時候才能支持這些功能?”。

再一次聽到了這樣的話,我沉默了。到底要怎樣改,這也是我所思考的,最近一直忙于其他,已經有一段時間沒有處理 issue 了,趁著調休,我也要好好思考下。

半年前,接觸了 el-form-renderer  ,瞬間感覺減輕了大部分表單編寫的工作,一個簡單的JSON配置,立刻展現出一個功能完好的表單頁面。然而,隨著使用的頻率增加,卻慢慢開始暴露各種不足,該組件的作者也不再單獨對該組件進行維護了。由于項目表單場景的需要,我們 fork 了一個版本,但后來發現我們更想要的是一套屬于我們自己的表單渲染規則,于是在我們的 Github 組織下建立了屬于我們的代碼倉庫 @femessage/el-form-renderer  (以下都稱為 el-form-renderer ),并開始了我們自己維護之路。

3W

el-form-renderer 是什么?為什么?怎么樣?通過3W分析來看看我們做了什么。

WHAT?

基于 element-ui 封裝的 表單渲染器 ,但不僅僅是 element-ui ,甚至不僅僅是表單。

WHY?

這里的為什么有兩層,第一層是為什么需要表單渲染器?第二次是什么是 el-form-renderer ?

借用《NoForm - 一個更好的表單解決方案》中的一句話:

做 B類業務 的同學應該深有感觸,我們日常需要面對大量操作類或者表單類的場景,因此只要是能從這些重復的CRUD解放出來的方案,就是最好的方案

我們的目的也很簡單,讓天下沒有難做的表單。

至于為什么是 el-form-renderer ,理由很簡單,我們正在讓沒有難做的表單變成現實,至少在目前數十個項目中,解決了70%以上的表單方面的需求。

HOW?

如上文所說,如下圖所見:

一個好的表單需要解決的問題:

•表單的取值、賦值、校驗

•表單聯動

•自定義表單項

•表單項的事件、屬性、slot

•對用戶足夠友好

所謂”下層基礎決定上層建筑“,我們沒有執著于從0開始,而是“讓專業的人做專業的事”?;A組件, element-ui 足夠專業,也正因為它的專業性,才讓 el-form-renderer 最初的版本有了用武之地。然而目前遠遠不夠的是,我們沒有很好的處理表單聯動和表單項的事件、slot的問題,這也正是我所要思考的地方。

基礎用法

先來看看目前我們的實現(更多請參考 文檔 )

<template> <el-form-renderer label-width="100px" :content="content" /></template><script>import UploadToAli from '@femessage/upload-to-ali'export default { data () { return { content: [ { $id: 'avatar', label: '頭像', component: UploadToAli }, { $id: 'username', label: '用戶名', $type: 'input', $el: { placeholder: '請輸入用戶名' } } ] } }}</script> 

效果如下:

沒有復雜的邏輯,只需進行簡單配置 JSON 的方式就可實現常用表單功能

解決方案

因為不是從0開始,所以一開始作者的設計只服務于 element-ui 已有的組件。

之前的方案解決了什么

• 表單的取值 getValue ,賦值 updateValue

• 完整繼承了 element 的 form 表單屬性,包括校驗

• 表單聯動 $enableWhen

大部分簡單的場景已經覆蓋,但是局限于 element-ui 組件,沒有處理好動態組件選項(如下拉選項)的問題,無法批量賦值,必須手動去空格...

現在的方案優化了什么

• 支持自定義組件,擺脫對 element-ui 的完全依賴(仍然依賴它的 el-form , el-form-item )

• 通過 setOptions 方法,動態的處理組件選項問題

• 添加批量更新數據方法 updateForm ,并添加 trim 來處理值

• 為了方便在其他組件中的集成和設置/獲取值的需求,還添加了 inputFormat 、 outputFormat ( issue )

它本已完成了一個華麗的蛻變,甚至成為了我司組件的橋梁地位,然而,面對千奇百怪的需求,它確實還不夠。

存在的問題

 

目前的7個 issue ,大致可以分為一下幾類:

•表單聯動

•自定義slot位置

•自定義事件

•其他優化

需求告訴我們,它還有很大的進步空間。

思考

回到開始的那些話,面對存在的問題,我們要怎么處理好它。

今天收到一個 PR ,來自公司的一位同事,處理的是 el-form-renderer 中 slot 位置的問題,默認只有 default ,顯示在最后,有需求希望能顯示在指定某一個表單項的前/后。該PR以表單項的 $id 為具名插槽,渲染該插槽內容到對應 $id 表單項的上方。

一個很好的思路,但是也讓我思考了很多,或許它還是沒有達到我的要求。

不妨再思考一個場景,表單的第一項和第三項渲染的上方需要渲染兩個內容相同的 slot ,按上面的思路,我們應該寫兩個template,并分別定義他們要渲染到的位置的的 $id 。

上面的問題并不難解決,定義一個字符串匹配規則,或者在某一項的配置項中添加要渲染的slot,名字匹配則渲染,以達到復用的目的。

問題似乎是解決了, issue 可以關閉了,但是我們回過頭來想想,我們為什么要自定義 slot 位置?

因為有issue,有用戶有這個需求。

那他為什么會有這個需求?

我們不得而知,場景很多,但我們可以大膽的猜測,缺乏一個組件可以滿足他的渲染需求,他需要 slot 來自定義展示內容。

所以,似乎我們需要的并不是 slot ,而是我們缺乏了那些組件,或者我們需要一個更通用的渲染方式來渲染我們的內容。很容易,我們想到了 render ,如果我們返回的是一個 render ,那似乎大部分 issue 可以關閉了。然而事實是,我們從開始就不希望出現 render ,因為它一點都不友好,甚至對部分人來說,它不簡單,這不是我們的目的。 我們的目的是為了更好用,更好理解,就向我們的文檔一樣,它很簡單,但很實用 。

許多PR,或者打算提PR的人忽略了一個問題,我們的組件沒有支持事件,它很難實現?不,至少已經實現了綁定屬性,綁定事件并不會多難,但是沒有去支持它,因為我們 思考的是它的必要性 ,表單項是否真的需要綁定事件。

從一開始就說過,不只是 element-ui ,甚至不只是表單。我們的目的不純粹,我們尋找的是通用的方案,如果支持了事件,表單項與業務代碼的關聯性絕對會更強,這不是我們希望看到的,至少在我們目前可以看得到的通過可視化的界面生成表單的前提下,我們不希望出現自定義事件的需求,它讓我們通過可視化的界面生成表單變得不那么通用了。

那么,在目前的情況下,真的沒辦法解決這些問題了嗎?答案是否定的。

已知我們可以通過自定義組件的方式拓展我們的表單項,那么我們也可以通過自定義組件解決我們遇到的 issue

import CustomComponent from './custom-component'export default { data () { return { content: [ { label: '用戶名', component: CustomComponent, $id: 'username', $el: { placeholder: '請設置您的登陸用戶名' } } ] } }}

或者在一些更簡單的場景

import UploadToAli from './UploadToAli'export default { data () { return { content: [ {  $id: 'avatar',  label: '圖片',  component: {  data () {  return {  imgUrl: ''  }  },  render: function (h) {  return h(UploadToAli, {  props: {   value: this.imgUrl  },  on: {   input: (val) => {   this.imgUrl = val   this.$emit('input', val)   }  }  }, [  h('p', {   slot: 'spinner'  }, '開始上傳中...')  ])  }  } } ] } }}

如果從這個層面來說,我們早已經解決問題了,但是那些 issue 依然在那兒。還記得之前提過的對用戶足夠友好和 render 的事嗎,目前來看,它能解決問題,但不是一個好的方案,解決問題并沒有那么難,難的是解決了還能足夠友好,足夠簡單,這也是我們一直在努力的方向。

結語

不知不覺寫了好長...

通過配置的方式實現一個表單似乎是一個不錯的思路,目前已經在公司中后臺有過數十個頁面的嘗試。然而業務場景千變萬化,我們沒有辦法解決100%的需求,但希望我們的方式為配置性表單能帶來更多的思考。

拋磚引玉,最后貼一次倉庫地址: https://github.com/FEMessage/el-form-renderer ,希望更多的方案和實現浮出水面,解放生產力。再次感謝 原作者

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产99在线|中文| 97精品免费视频| 中文字幕精品视频| 亚洲qvod图片区电影| 这里只有精品在线播放| 日韩av免费在线播放| 亚洲成人免费网站| 久久久在线观看| 亚洲免费影视第一页| 国产精品国产三级国产aⅴ9色| 亚洲sss综合天堂久久| 色婷婷综合成人av| 国产精品偷伦免费视频观看的| 欧美大奶子在线| 91在线国产电影| 在线亚洲男人天堂| 国产一区二区三区三区在线观看| 97视频人免费观看| 国产欧美日韩免费| 亚洲精品美女在线观看播放| 国产精品久久久久久网站| 国产a∨精品一区二区三区不卡| 26uuu久久噜噜噜噜| 亚洲va久久久噜噜噜久久天堂| 久久久久久国产精品美女| 色999日韩欧美国产| 精品免费在线视频| 91sao在线观看国产| 日韩资源在线观看| 日韩在线观看免费av| 成人啪啪免费看| 亚洲石原莉奈一区二区在线观看| 日韩av影视在线| 日韩av免费在线播放| 国产精品久久久久久五月尺| 欧美性理论片在线观看片免费| 久久国产精品久久久久久| 人妖精品videosex性欧美| 欧美中文在线视频| 少妇高潮久久77777| 91久久国产精品91久久性色| 欧美wwwxxxx| 91国产美女在线观看| 91九色在线视频| 日韩中文在线中文网三级| 久久久人成影片一区二区三区观看| 日韩中文字幕视频在线观看| 欧美激情伊人电影| 久久久久久久久久婷婷| 在线成人一区二区| 亚洲成人1234| 日韩视频在线观看免费| 国产综合视频在线观看| 国产精品普通话| 欧美成人自拍视频| 亚洲自拍高清视频网站| 91国在线精品国内播放| 欧美日韩综合视频网址| 97久久精品视频| 欧美综合国产精品久久丁香| 亚洲精品97久久| 国产精品18久久久久久麻辣| 91精品久久久久久久久中文字幕| 亚洲va欧美va国产综合久久| 日韩亚洲欧美中文在线| 国产精品美女久久久久av超清| 久久久国产91| 欧美精品日韩www.p站| 久久影视电视剧免费网站清宫辞电视| 欧美成人免费大片| 久久久人成影片一区二区三区| 欧美美最猛性xxxxxx| 在线不卡国产精品| 国产精品国产亚洲伊人久久| 丝袜情趣国产精品| 性色av一区二区三区免费| 日韩**中文字幕毛片| 亚洲娇小xxxx欧美娇小| 亚洲精品不卡在线| 欧美裸体xxxx极品少妇软件| 亚洲人永久免费| 国产视频丨精品|在线观看| 久久精品人人做人人爽| 57pao成人国产永久免费| 欧美激情一区二区三级高清视频| 亚洲成**性毛茸茸| 亚洲国产欧美一区二区三区久久| 日本久久91av| 欧美性猛交xxxxx免费看| 亚洲午夜未满十八勿入免费观看全集| 92福利视频午夜1000合集在线观看| 日韩精品在线观看一区| 国产精品99久久久久久久久久久久| 国产91露脸中文字幕在线| 国产精品久久久久999| 国产精品18久久久久久麻辣| 色综合老司机第九色激情| 亚洲国产精品电影在线观看| 亚洲丝袜在线视频| 日韩视频永久免费观看| 欧美日韩亚洲一区二区三区| 久久久成人精品视频| 国产精品啪视频| 国产精品视频久久久久| 久久夜色精品国产欧美乱| 欧美激情一区二区久久久| 日韩高清不卡av| 91沈先生在线观看| 亚洲精品一区中文字幕乱码| 尤物九九久久国产精品的特点| 久久久久久久香蕉网| 在线观看欧美日韩| 疯狂做受xxxx高潮欧美日本| 国产精品爽爽爽| 久久这里只有精品视频首页| 亚洲一级免费视频| 性欧美激情精品| 中文字幕国产亚洲| 亚洲有声小说3d| 久久这里只有精品视频首页| 亚洲成av人影院在线观看| 亚洲色图50p| 2019日本中文字幕| 黄色成人在线播放| 日韩亚洲在线观看| 日韩精品极品视频免费观看| 国产精品r级在线| 欧美性jizz18性欧美| 国产成人av网址| 欧美在线免费观看| 26uuu亚洲伊人春色| 久久亚洲精品中文字幕冲田杏梨| 久久久噜噜噜久久久| 亚洲日韩中文字幕在线播放| 国产日韩av高清| 亚洲成年网站在线观看| 91av成人在线| 91午夜在线播放| 91日本在线视频| 欧美性精品220| 亚洲欧美综合区自拍另类| 久久福利视频网| 午夜欧美大片免费观看| 精品色蜜蜜精品视频在线观看| 亚洲国产精品美女| 91高潮在线观看| 亚洲激情视频网| 国产三级精品网站| 国产不卡视频在线| 国产精品27p| 亚洲最大成人免费视频| 成人在线激情视频| 欧美日韩国产一中文字不卡| 国产精品va在线| 精品国产一区久久久| 97碰碰碰免费色视频| 韩国19禁主播vip福利视频| 久久亚洲国产成人| 日日噜噜噜夜夜爽亚洲精品| 国产精品香蕉在线观看| 成人黄色网免费| 亚洲欧美日韩精品久久奇米色影视| 日韩欧美在线视频免费观看| 日本午夜在线亚洲.国产|