精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何手寫El-Form表單組件

開發 前端
最近又個項目讓我有開始接觸element-ui,想到當初對el-form表單有一些困惑,查看一下源碼和一些技術文章,對el-form有一些新的認識。

[[415219]]

本文轉載自微信公眾號「前端有道」,作者星野。轉載本文請聯系前端有道公眾號。

前言

在剛入行時候,只會知道如何使用表單組件,在后面一兩年工作中也沒有什么技術積累成為一個工具人,操作最多的就是ctrl+c和ctrl+v,在去年進了一家新公司,這家公司以前舊項目代碼經過太多人的手,代碼已經快不成人樣了,難以維護,技術人員已經跑的差不多了,我進去好在讓我們負責新的項目開發,要不然可能第二天就看不到我了,哈哈。項目主要面向于小程序和H5端,網上的UI庫很難滿足產品后續規劃需求開發,只好開始研究組件原理及封裝組件。

最近又個項目讓我有開始接觸element-ui,想到當初對el-form表單有一些困惑,查看一下源碼和一些技術文章,對el-form有一些新的認識。

Form 表單

下面是一份el-form示例代碼

  1. <template> 
  2.   <el-form :model="ruleForm" :rules="rules" ref="ruleForm"
  3.     <el-form-item label="名字" prop="pass"
  4.       <el-input type="password" v-model="ruleForm.pass"></el-input> 
  5.     </el-form-item> 
  6.     <el-form-item label="年齡" prop="age"
  7.       <el-input v-model.number="ruleForm.age"></el-input> 
  8.     </el-form-item> 
  9.     <el-form-item> 
  10.       <el-button type="primary" @click="submitForm('ruleForm')">提交</el-button> 
  11.       <el-button @click="resetForm('ruleForm')">重置</el-button> 
  12.     </el-form-item> 
  13.   </el-form> 
  14. </template> 
  15.  
  16. <script> 
  17. export default { 
  18.   data() { 
  19.     return { 
  20.       ruleForm: { 
  21.         pass: ''
  22.         checkPass: ''
  23.         age: ''
  24.       }, 
  25.       rules: { 
  26.         pass: [{ required: true, message: '請輸入名字'trigger'blur' }], 
  27.         age: [{ required: true, message: '請輸入年齡'trigger'blur' }], 
  28.       }, 
  29.     } 
  30.   }, 
  31.   methods: { 
  32.     submitForm(formName) { 
  33.       this.$refs[formName].validate(valid => { 
  34.         if (valid) { 
  35.           alert('submit!'
  36.         } else { 
  37.           console.log('error submit!!'
  38.           return false 
  39.         } 
  40.       }) 
  41.     }, 
  42.     resetForm(formName) { 
  43.       this.$refs[formName].resetFields() 
  44.     }, 
  45.   }, 
  46. </script> 

首先要清楚一下組件的使用方式

1.el-form接收model和rule兩個prop

  • model表示表單綁定的數據對象
  • rule表示驗證規則策略,表單驗證

2.el-form-item接收的prop屬性,對應form組件的model數據中某個key值,如果rule剛好有key,給定的條件下去如失去焦點驗證規則匹不匹配。

最終得到類似這樣代碼結構

  1. <template> 
  2.   <div> 
  3.     <form @submit.prevent> 
  4.       <div> 
  5.         姓名<input v-model="form.name" /> 
  6.       </div> 
  7.       <div> 
  8.         年齡<input v-model="form.age" /> 
  9.       </div> 
  10.       <div> 
  11.         <button @click="submit">提交</button> 
  12.       </div> 
  13.     </form> 
  14.   </div> 
  15. </template> 

手寫表單組件

組件中嵌套組件,主要是通過slot插槽,可以將組件拼接成上面代碼結構。代碼如下

el-form

  1. <template> 
  2.     <form> 
  3.         <slot></slot> 
  4.     </form> 
  5. </template> 
  6. <script> 
  7. export default { 
  8.     name:'elForm' 
  9. </script> 

 

el-form-item

  1. <template> 
  2.     <div> 
  3.         <slot></slot> 
  4.     </div> 
  5. </template> 
  6. <script> 
  7. export default { 
  8.     name:'elFormItem' 
  9. </script> 

el-input

  1. <template> 
  2.     <input type="text"
  3. </template> 
  4. <script> 
  5. export default { 
  6.     name:'elInput' 
  7. </script> 

 接下來就要考慮到組件中的通訊。由于組件中有可能嵌套很多的組件,如果單純通過$parent和$children查找出來的父級組件,不一定是el-form組件。

兩個問題:

  • el-form-item組件如何得到el-form的數據
  • el-form組件如何和el-form-item進行交互

解決第一問題,可以通過provide與inject實現。解決第二問題,就要講到dispatch派發和broadcast廣播

provide與inject

通過provide將當前表單實例傳遞到所有后代組件中,后代通過inject接受傳遞的值。

el-form

  1. <template> 
  2.     <form><slot></slot></form> 
  3. </template> 
  4. <script> 
  5. export default { 
  6.     name:'elForm'
  7.     provide(){ 
  8.         return { 
  9.             elForm: this 
  10.         }   
  11.     }, 
  12.     props:{ 
  13.         model:{ 
  14.             type:Object, 
  15.             default:()=>({}) 
  16.         }, 
  17.         rules:Object 
  18.     } 
  19. </script> 

el-form-item

  1. <template> 
  2.     <div><slot></slot></div> 
  3. </template> 
  4. <script> 
  5. export default { 
  6.     name:'elFormItem'
  7.     inject:['elForm'], 
  8.     props:{ 
  9.         label:{  
  10.             type:String, 
  11.             default:'' 
  12.         }, 
  13.         prop:String  
  14.     }, 
  15.     mounted(){ 
  16.        console.log(this.elForm) 
  17.     } 
  18. </script> 

provide中this指el-form組件,this.elForm就能得到el-form組件中的數據和方法。

dispatch和broadcast廣播

$dispatch與$broadcast是一種有歷史的組件通信方式,因為他們是Vue1.0提供的一種方式,在Vue2.0中廢棄了。

$dispatch: $dispatch會向上觸發一個事件,同時傳遞要觸發的祖先組件的名稱與參數,當事件向上傳遞到對應的組件上時會觸發組件上的事件偵聽器,同時傳播會停止。

$broadcast: $broadcast會向所有的后代組件傳播一個事件,同時傳遞要觸發的后代組件的名稱與參數,當事件傳遞到對應的后代組件時,會觸發組件上的事件偵聽器,同時傳播會停止(因為向下傳遞是樹形的,所以只會停止其中一個葉子分支的傳遞)

$dispatch

  1. /** 
  2.  * 派發 (向上查找) (一個) 
  3.  * @param componentName // 需要找的組件的名稱 
  4.  * @param eventName // 事件名稱 
  5.  * @param params // 需要傳遞的參數 
  6.  */ 
  7.     dispatch(componentName, eventName, params) { 
  8.         let parent = this.$parent || this.$root;//$parent 找到最近的父節點 $root 根節點 
  9.         let name = parent.$options.name; // 獲取當前組件實例的name 
  10.         // 如果當前有節點 && 當前沒名稱 且 當前名稱等于需要傳進來的名稱的時候就去查找當前的節點 
  11.         // 循環出當前名稱的一樣的組件實例 
  12.         while (parent && (!name||name!==componentName)) { 
  13.             parent = parent.$parent; 
  14.             if (parent) { 
  15.                 name = parent.$options.name
  16.             } 
  17.         } 
  18.         // 有節點表示當前找到了name一樣的實例 
  19.         if (parent) { 
  20.             parent.$emit.apply(parent,[eventName].concat(params)) 
  21.         } 
  22.     }, 

$broadcast

  1. /** 
  2.  * 派發 (向上查找) (一個) 
  3.  * @param componentName // 需要找的組件的名稱 
  4.  * @param eventName // 事件名稱 
  5.  * @param params // 需要傳遞的參數 
  6.  */ 
  7. broadcast(componentName, eventName, params) { 
  8. // 循環子節點找到名稱一樣的子節點 否則 遞歸 當前子節點 
  9. this.$children.map(child=>{ 
  10.     if (componentName===child.$options.name) { 
  11.         child.$emit.apply(child,[eventName].concat(params)) 
  12.     }else { 
  13.         broadcast.apply(child,[componentName,eventName].concat(params)) 
  14.     } 
  15. }) 

驗證表單

async-validator是一個表單的異步驗證的第三方庫,也是element-ui 中的form組件所使用的驗證方式。 

el-form-item

  1. <template> 
  2.   <div> 
  3.     <label v-if="label">{{label}}</label> 
  4.     <slot></slot> 
  5.     {{errorMessage}} 
  6.   </div> 
  7. </template> 
  8. <script> 
  9. import Schema from "async-validator"
  10. export default { 
  11.   name"elFormItem"
  12.   inject: ["elForm"], 
  13.   props: { 
  14.     label: { 
  15.       type: String, 
  16.       default"" 
  17.     }, 
  18.     prop: String 
  19.   }, 
  20.   data(){ 
  21.       return {errorMessage:''
  22.   }, 
  23.   mounted() { 
  24.     this.$on("validate", () => { 
  25.       if (this.prop) { 
  26.         let rule = this.elForm.rules[this.prop]; 
  27.         let newValue = this.elForm.model[this.prop]; 
  28.  
  29.         let descriptor = { 
  30.           [this.prop]: rule 
  31.         }; 
  32.         let schema = new Schema(descriptor); 
  33.          
  34.         return schema.validate({[this.prop]:newValue},(err,res)=>{ 
  35.             if(err){ 
  36.                 this.errorMessage = err[0].message; 
  37.             }else
  38.                 this.errorMessage = '' 
  39.             } 
  40.         }) 
  41.       } 
  42.     }); 
  43.   } 
  44. }; 
  45. </script> 

 

責任編輯:武曉燕 來源: 前端有道
相關推薦

2011-07-18 09:48:10

jQuery

2023-03-15 08:42:06

form表單設計接口

2016-12-13 13:54:10

EasyUI form數據加載

2009-07-03 13:24:56

JSP表單

2009-07-23 16:59:31

ASP.NET認證Form表單

2021-01-12 09:04:12

Django FormForm組件開發

2009-07-29 16:40:50

Ajax提交asp.n

2009-06-30 15:19:55

Form表單JSP入門

2022-01-25 18:11:55

vdomclassfunction

2024-10-05 00:00:05

高性能分布式IM

2021-02-20 12:34:53

鴻蒙HarmonyOS應用開發

2021-01-14 09:04:27

Django FormForm組件開發

2022-03-09 09:43:01

工具類線程項目

2025-01-13 07:05:00

精簡表單移動端設計表單長表單設計

2023-11-27 08:24:57

FormikReact

2016-09-27 19:28:37

2020-11-02 08:19:18

RPC框架Java

2021-03-18 08:04:54

AQS工具CAS

2022-09-22 12:38:46

antd form組件代碼

2017-03-02 13:31:02

監控系統
點贊
收藏

51CTO技術棧公眾號

久久视频在线| 中文av在线全新| 丁香天五香天堂综合| 久久久爽爽爽美女图片| 熟女俱乐部一区二区视频在线| 高清av不卡| 亚洲色图欧洲色图婷婷| 国产伦精品一区二区三区高清版| 久久久久久不卡| 天天影视天天精品| 亚洲高清色综合| 宅男噜噜噜66国产免费观看| 影音先锋男人资源在线| 2024国产精品| 51国产成人精品午夜福中文下载 | 欧美在线色图| 日韩精品一区在线| 欧美少妇性生活视频| 成人片在线看| 国产网站一区二区三区| 国产99在线免费| 在线观看亚洲一区二区| 亚洲二区视频| xxxxx成人.com| 亚洲黄色在线网站| 欧美一区一区| 欧美午夜精品久久久久久超碰| 欧美亚洲黄色片| 免费黄色电影在线观看| 久久综合一区二区| 国产精品国产三级欧美二区| 又骚又黄的视频| 国产精品最新自拍| 色综合久久天天综线观看| 国产一区二区三区四区五区六区| 超碰97久久| 欧美一区二区三区在线看| 亚洲一区二区蜜桃| sqte在线播放| 一区二区三区国产| 伊人狠狠色丁香综合尤物| 欧美成人免费| av电影在线观看不卡| 7777精品伊久久久大香线蕉语言| 中文字幕乱码一区二区| 亚洲综合欧美| 性欧美xxxx视频在线观看| 黄色一级视频免费观看| 无需播放器亚洲| 日韩一区二区三区xxxx| 黄免费在线观看| 欧美猛男做受videos| 日韩精品久久久久| 538国产视频| 人人香蕉久久| 精品亚洲精品福利线在观看| 日韩aaaaa| 嫩草国产精品入口| 亚洲国产精品va在线看黑人动漫 | 中文字幕二三区不卡| 日本欧洲国产一区二区| 青青草观看免费视频在线| 成人激情免费电影网址| 国新精品乱码一区二区三区18| 精品久久久久久亚洲综合网站 | 亚洲深爱激情| 1769国产精品| www.国产毛片| 免费成人在线影院| 国产主播在线一区| 国产免费视频一区二区三区| 国产在线国偷精品免费看| 成人精品一区二区三区| 99久久精品国产色欲| 国产成人精品亚洲777人妖 | 亚洲第九十九页| 成人黄页在线观看| 久久精品magnetxturnbtih| 亚洲人在线观看视频| 久久久久99精品一区| 日本一区视频在线观看免费| 国产在线视频网| 1024精品合集| 福利视频一二区| 国产日韩电影| 欧美久久久久久久久久| av漫画在线观看| 美女毛片一区二区三区四区最新中文字幕亚洲| 亚洲欧美日韩国产中文专区| 美女三级黄色片| 狠狠入ady亚洲精品经典电影| 欧洲亚洲免费在线| 97国产精品久久久| 91婷婷韩国欧美一区二区| 日韩电影免费观看在| 在线电影福利片| 欧美性猛xxx| 免费黄频在线观看| 麻豆一区二区| 久久伊人色综合| 久久久精品福利| 国产一区二区三区高清播放| 九九九九精品| 精品孕妇一区二区三区| 欧美日韩亚洲精品一区二区三区| 777一区二区| 天堂网av成人| 久国内精品在线| 中文字幕一区二区三区四区欧美| 极品少妇xxxx精品少妇偷拍| 亚洲va久久久噜噜噜久久天堂| 好吊色视频一区二区| 久久久精品人体av艺术| 大桥未久一区二区三区| 牛牛精品在线| 欧美精品色综合| v天堂中文在线| 欧美亚洲在线日韩| 久久的精品视频| 91美女免费看| 国产一区二区三区四区在线观看| 97人人模人人爽人人喊38tv| 经典三级在线| 亚洲福利电影网| 青青草原国产在线视频| 色婷婷久久久| 久久久av网站| 亚洲 欧美 中文字幕| 99久久久无码国产精品| 资源网第一页久久久| 成人av免费电影网站| 欧美一区二区在线视频| 中国毛片在线观看| 国产主播精品| 成人欧美一区二区三区在线 | 99精品久久只有精品| 一区二区三区欧美成人| 亚洲一级少妇| 精品国产sm最大网站| 永久免费未视频| 久久精选视频| 国产超碰91| 天堂av最新在线| 欧美日本在线播放| 黄色a一级视频| 亚洲成人av| 国产精品网红直播| 涩涩视频在线观看免费| 亚洲一区日韩精品中文字幕| 国产精品区在线| 久久99久久人婷婷精品综合 | 亚洲电影有码| 亚洲欧美日韩在线一区| 日韩久久久久久久久| 成人性色生活片免费看爆迷你毛片| 亚洲乱码一区二区三区三上悠亚| 快播电影网址老女人久久| 亚洲精品视频播放| 国产香蕉视频在线| 波多野结衣在线一区| 日本黄色片一级片| 中文字幕日韩高清在线| 欧美成人精品激情在线观看| 91av久久久| 国产精品久久久久久久久果冻传媒 | 精品伊人久久久| 欧美韩国理论所午夜片917电影| 岳乳丰满一区二区三区| 亚洲天堂久久久久久久| 国产三级生活片| 天天射天天综合网| 91探花福利精品国产自产在线| 嫩草在线视频| 91精品国产色综合久久| 国产av自拍一区| 蜜桃精品视频在线| 亚洲精品影院| 欧美激情三区| 久久精品成人一区二区三区 | 国产九九精品| 日本精品一区二区三区视频 | xx欧美撒尿嘘撒尿xx| 成人在线免费观看视频| 国产精品女主播| 嫩草在线视频| 精品精品国产高清a毛片牛牛| 国产无码精品一区二区| 成人短视频下载| www.色就是色| 91九色精品| 99理论电影网| 国产在线天堂www网在线观看| 日韩精品福利网站| 日本三级一区二区三区| 亚洲影院理伦片| 9.1成人看片| 免费视频最近日韩| 免费的av在线| 神马久久影院| 国产精品亚洲视频在线观看| 四季久久免费一区二区三区四区| 日韩电影中文字幕在线| 波多野结衣电影在线播放| 中文字幕一区二区视频| 性高潮免费视频| 日本不卡视频在线观看| 亚洲啪啪av| 嫩草国产精品入口| 国产精品中文久久久久久久| 成年网站在线视频网站| 色一情一乱一区二区| 亚洲av综合色区无码一二三区| 精品日韩中文字幕| 亚洲人与黑人屁股眼交| av电影在线观看不卡| 中文字幕国产免费| 亚洲视频www| 法国空姐在线观看免费| 亚洲人成伊人成综合图片| 成人网在线免费观看| 亚洲国产福利| 久久99热精品这里久久精品| 98在线视频| 日韩成人xxxx| 国产永久免费视频| 欧美午夜www高清视频| 污污的视频在线免费观看| 91视频观看视频| 91热视频在线观看| 久久久久国产精品午夜一区| 日本a级片在线播放| 日韩国产欧美| 免费精品视频一区| 视频国产精品| 99在线视频首页| 只有精品亚洲| 国产精品美女久久久久久免费| 91九色在线播放| 精品精品国产国产自在线| 欧美 日韩 国产 在线| 日韩一区二区在线观看视频播放| 亚洲精品毛片一区二区三区| 天天av天天翘天天综合网| caoporn91| 国产精品电影院| av网页在线观看| 波多野结衣中文字幕一区| 中文写幕一区二区三区免费观成熟| 毛片不卡一区二区| 国产高清视频网站| 日本欧美久久久久免费播放网| 免费观看美女裸体网站| 欧美日韩国产欧| 超碰免费在线公开| 色综合久久网| 一区二区三区偷拍| 国产a久久精品一区二区三区 | 欧美 日韩 国产 成人 在线 91| 91精品欧美福利在线观看| 91麻豆国产在线| 欧美日韩一区不卡| 最近日韩免费视频| 精品成人乱色一区二区| av大片在线免费观看| 午夜不卡av在线| 日韩精品无码一区二区| 天天影视涩香欲综合网| 亚洲精品午夜国产va久久成人| 一本久久a久久免费精品不卡| 手机看片久久久| 色噜噜狠狠成人网p站| 91视频久久久| 欧美剧在线免费观看网站| 国产毛片在线视频| 欧美日韩你懂的| 国产精品久久久久久久久久久久久久久久久久| 在线观看精品一区| 91亚洲视频在线观看| 欧美一二三区在线| 亚洲精品一区二区口爆| 亚洲精品videossex少妇| 天天干天天做天天操| 亚洲精品天天看| a视频网址在线观看| 久久久久北条麻妃免费看| 人人澡人人添人人爽一区二区| 欧美极品欧美精品欧美视频 | 久久国产乱子伦精品| 欧美视频日韩视频| 国产视频一区二区三区四区五区| 欧美va亚洲va| 日韩一级片免费看| 精品国产拍在线观看| 暖暖在线中文免费日本| 日本a级片电影一区二区| 永久免费观看精品视频| 国产传媒一区二区| 国产免费久久| 黄色网址在线免费看| 亚洲青涩在线| 色综合色综合色综合色综合| 成人精品国产福利| www.av天天| 一区二区三区不卡视频| 男人的天堂av网站| 日韩免费视频一区二区| 都市激情一区| 韩国v欧美v日本v亚洲| 人人鲁人人莫人人爱精品| 91在线在线观看| 国产一区二区三区四区大秀| 日韩一级性生活片| 蜜臀av国产精品久久久久| 亚洲国产精品第一页| 中文av一区二区| 国产精品第9页| 日韩一区二区精品| 你懂得网站在线| 欧美精品福利在线| 欧美高清影院| 欧美精品在线一区| 国一区二区在线观看| 欧美日韩一区二区三区69堂| 99久久久精品| 91香蕉国产视频| 欧美专区亚洲专区| 视频污在线观看| 免费不卡欧美自拍视频| 欧美精选视频一区二区| 久久涩涩网站| 欧美黄色aaaa| 在线观看免费的av| 91丨九色丨国产丨porny| 大地资源高清在线视频观看| 欧美日韩美女在线观看| 空姐吹箫视频大全| 欧美日韩成人在线播放| 国产成人77亚洲精品www| 久久资源av| 欧美日韩一区二区三区四区在线观看| 九九精品久久久| 久久精品视频免费| 成人精品免费在线观看| 亚洲第一网站免费视频| 九色porny自拍视频在线观看| 亚洲sss综合天堂久久| 91欧美在线| 高清一区在线观看| 日本一区二区动态图| 波多野结衣家庭教师视频| 亚洲精品福利电影| 国产精品久久久久久久小唯西川 | 国产精品综合激情| 欧美伊人久久大香线蕉综合69| 日本一本草久在线中文| 97视频色精品| 久久99精品国产自在现线| 97国产精东麻豆人妻电影| av成人免费在线观看| 久久免费小视频| 精品福利一二区| 性欧美freesex顶级少妇| 极品尤物一区二区三区| 亚洲欧洲一区| 最新中文字幕视频| 欧美在线免费观看视频| 国产永久av在线| 国产精品盗摄久久久| 大色综合视频网站在线播放| 欧美精品aaaa| 国产精品久久久久久久久免费樱桃 | 人妻无码视频一区二区三区| 久久久另类综合| 日韩在线观看第一页| 亚洲人成电影在线观看天堂色| 国产一区二区三区朝在线观看| 日韩av一级大片| 捆绑调教美女网站视频一区| 午夜爱爱毛片xxxx视频免费看| 欧美一区二区精品久久911| 手机在线免费观看av| 动漫3d精品一区二区三区| 性色一区二区三区| xxxx日本黄色| 91精品国产麻豆国产自产在线| 在线视频中文字幕第一页| 久久久99爱| 日韩电影免费一区| 自拍偷拍第9页| 精品国产一区二区三区久久久蜜月 | 精品制服美女丁香| www.99re7| 亚洲人成伊人成综合网久久久| 国产福利一区二区三区在线播放| 黑人巨大国产9丨视频| 波多野结衣亚洲一区| 亚洲一区二区色| 欧美激情一区二区三级高清视频| 日韩丝袜视频| 在线观看免费av网址|