Element Form表單實踐(上)
- 2020 年 5 月 20 日
- 筆記
- element, ElementUI系列分享
作者:小馬鈴薯biubiubiu
博客園://www.cnblogs.com/HouJiao/
掘金://juejin.im/user/58c61b4361ff4b005d9e894d
微信公眾號:馬鈴薯媽的碎碎念(掃碼關注,一起吸貓,一起聽故事,一起學習前端技術)
碼字不易,點贊鼓勵喲~
前言
本篇文章主要是實踐一下Element
中的 Form
表單組件。
本篇內容較為簡單,基本上是參照着文檔將表單部分內容實踐了一下,後續會持續更新表單的一些常用功能。
同時下一篇文章
Element Form表單實踐(下)
將會分享項目開發中的一個表單實踐,記錄在這個過程中遇到的一些問題。
項目環境
為了簡單快速,我使用引入cdn
靜態資源的方式搭建項目的開發環境。
<!-- index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Element Form表單實踐</title>
<!-- vue: 開發環境版本,包含了有幫助的命令行警告 -->
<script src="//cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<!-- element: 引入樣式 -->
<link rel="stylesheet" href="//unpkg.com/element-ui/lib/theme-chalk/index.css">
<!-- element: 引入組件庫 -->
<script src="//unpkg.com/element-ui/lib/index.js"></script>
</head>
<body>
<div id="box">
<span> {{message}} </span>
<el-divider></el-divider>
</div>
<script>
var vm = new Vue({
el: '#box',
data: {
message: "Element Form表單實踐"
}
})
</script>
</body>
</html>
環境準備好後,直接本地打開頁面,就能看到效果。
接着我們就開始Element Form
表單的實踐。
使用Form組件
典型表單
首先按照官方文檔我們先實踐一下典型表單
。
典型表單
的完整代碼如下:
<!-- index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Element Form表單實踐</title>
<!-- 開發環境版本,包含了有幫助的命令行警告 -->
<script src="//cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<!-- 引入樣式 -->
<link rel="stylesheet" href="//unpkg.com/element-ui/lib/theme-chalk/index.css">
<!-- 引入組件庫 -->
<script src="//unpkg.com/element-ui/lib/index.js"></script>
</head>
<body>
<div id="box">
<span> {{message}} </span>
<el-divider></el-divider>
<!-- 典型表單 -->
<el-form ref="form" :model="form" label-width="80px">
<el-form-item label="活動名稱">
<el-input v-model="form.name"></el-input>
</el-form-item>
<el-form-item label="活動區域">
<el-select v-model="form.region" placeholder="請選擇活動區域">
<el-option label="區域一" value="shanghai"></el-option>
<el-option label="區域二" value="beijing"></el-option>
</el-select>
</el-form-item>
<el-form-item label="活動時間">
<el-col :span="11">
<el-date-picker type="date" placeholder="選擇日期" v-model="form.date1" style="width: 100%;"></el-date-picker>
</el-col>
<el-col class="line" :span="2">-</el-col>
<el-col :span="11">
<el-time-picker placeholder="選擇時間" v-model="form.date2" style="width: 100%;"></el-time-picker>
</el-col>
</el-form-item>
<el-form-item label="即時配送">
<el-switch v-model="form.delivery"></el-switch>
</el-form-item>
<el-form-item label="活動性質">
<el-checkbox-group v-model="form.type">
<el-checkbox label="美食/餐廳線上活動" name="type"></el-checkbox>
<el-checkbox label="地推活動" name="type"></el-checkbox>
<el-checkbox label="線下主題活動" name="type"></el-checkbox>
<el-checkbox label="單純品牌曝光" name="type"></el-checkbox>
</el-checkbox-group>
</el-form-item>
<el-form-item label="特殊資源">
<el-radio-group v-model="form.resource">
<el-radio label="線上品牌商贊助"></el-radio>
<el-radio label="線下場地免費"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="活動形式">
<el-input type="textarea" v-model="form.desc"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit">立即創建</el-button>
<el-button>取消</el-button>
</el-form-item>
</el-form>
</div>
<script>
var vm = new Vue({
el: '#box',
data: {
message: "Element Form表單實踐",
form: {
name: '', // 活動名稱
region: '', // 活動區域
date1: '', // 活動時間-日期
date2: '', // 活動時間-時間
delivery: false, // 即時配送
type: [], // 活動性質
resource: '', // 特殊資源
desc: '' // 活動形式
}
},
methods: {
onSubmit() {
console.log('submit!');
}
}
})
</script>
</body>
</html>
瀏覽器打開頁面:
可以看到表單組件已經顯示到了頁面上。
接下來,我們就這個表單組件的一些重要的特性進行學習。
表單屬性
表單屬性指的是設置在
el-form
元素上的屬性
model
model
屬性在前面的用法如下:
<!-- 典型表單 -->
<el-form ref="form" :model="form" label-width="80px">
</el-form>
model
屬性是表單的數據,它綁定的form
數據如下:
form: {
name: '', // 活動名稱
region: '', // 活動區域
date1: '', // 活動時間-日期
date2: '', // 活動時間-時間
delivery: false, // 即時配送
type: [], // 活動性質
resource: '', // 特殊資源
desc: '' // 活動形式
}
form
數據中的每一項分別對應表單中的一個el-form-item
項,比如name
對應的是活動名稱,那麼el-form-item
寫法如下:
<el-form-item label="活動名稱">
<el-input v-model="form.name"></el-input>
</el-form-item>
這裡需要注意表單控件
el-input
的v-model
並沒有綁定在el-form-item
上:
input
控件對應的是el-input
,v-model
綁定在el-input
上
select
控件對應的是el-select
checkbox
控件對應的是el-checkbox-group
+el-checkbox
,v-model
綁定在el-checkbox-group
上
radio
控件對應的是el-radio-group
+el-radio
,v-model
綁定在el-radio=group
上
switch
切換控件對應的是el-switch
,v-model
綁定在el-switch
上
model綁定的form數據
接下來我們在探究一下這個form
數據。
為了探究這個form
數據,需要做下面的三件事:
01:在"立即創建"按鈕綁定的onSubmit函數中打印form數據
02:填寫表單信息
03:點擊"立即創建"按鈕,查看form數據打印結果
第一步:在立即創建
按鈕綁定的onSubmit
函數中打印form
數據。
methods: {
onSubmit() {
console.log(this.form);
}
}
第二步:填寫表單信息。
第三步:點擊立即創建
按鈕,查看form
數據打印結果。
可以看到form
數據包含了我們表單填寫的內容,我將form
中的字段、字段的值和表單控件的關係梳理一下。
屬性/字段 | 描述 | 控件類型 | 值 | 值的來源 | 類型 |
---|---|---|---|---|---|
name | 活動名稱 | input |
“element form表單實踐” | input 輸入框的內容 |
String |
region | 活動區域 | select |
“shanghai” | 選中的select 的value值 |
String |
date1 | 活動時間-日期 | el-time-picker |
Thu May 07 2020 00:00:00 GMT+0800 (中國標準時間) | 日期控件選擇的內容 | Date |
date2 | 活動時間-時間 | el-time-picker |
Thu May 07 2020 18:24:39 GMT+0800 (中國標準時間) | 時間控件選擇的內容 | Date |
delivery | 即時配送 | el-switch |
true | switch的選擇結果 | Boolean |
type | 活動性質 | checkbox |
[“美食/餐廳線上活動”,”地推活動”] | 選中的checkbox 的label值 |
Boolean |
resource | 特殊資源 | radio |
“線上品牌商贊助” | 選中的radio 的label值 |
String |
desc | 活動形式 | input |
“其他” | input 輸入框內容 |
String |
可以看到,表單el-form
的model
屬性綁定的form
數據和表單中的內容是一致的,因此在日常項目開發中,表單信息填寫完成,點擊提交按鈕,可以直接將this.form
作為請求的參數直接發送給後端。
不過這裡很有必要對this.form
這個數據進行一些完善。
在前面的代碼中,最終form
中的type
值和resource
值都是中文的結果,這樣的中文數據傳遞到後端,對後端的邏輯處理是很不友好的。
所以在日常的項目開發中,前後端會對這樣的數據有一個默認的約定關係:
// 活動性質
{ 'foodOnlineActivities': '美食/餐廳線上活動',
'earthPushingActivity': '地推活動',
'offlineThemeActivities': '下線主題活動',
'brandExposure': '單純品牌曝光',
}
// 活動形式
{ 'online': '美食/餐廳線上活動',
'offline': '地推活動'
}
或者在簡單一些的約定:
// 活動性質
{ 'foodOnlineActivities': '1',
'earthPushingActivity': '2',
'offlineThemeActivities': '3',
'brandExposure': '4',
}
// 活動形式
{ 'online': '1',
'offline': '2'
}
對應的我們的前端代碼需要修改成下面這樣:
<el-form-item label="活動性質" prop="type">
<el-checkbox-group v-model="form.type">
<el-checkbox label="1" name="type">美食/餐廳線上活動</el-checkbox>
<el-checkbox label="2" name="type">地推活動</el-checkbox>
<el-checkbox label="3" name="type">線下主題活動</el-checkbox>
<el-checkbox label="4" name="type">單純品牌曝光</el-checkbox>
</el-checkbox-group>
</el-form-item>
<el-form-item label="特殊資源" prop="resource">
<el-radio-group v-model="form.resource">
<el-radio label="1">線上品牌商贊助</el-radio>
<el-radio label="2">線下場地免費</el-radio>
</el-radio-group>
</el-form-item>
接着在選擇對應的選項,查看form
數據的結果:
修改之後的form
數據傳遞到後端以後,不管是對數據進行保存或者判斷等邏輯,都比較簡單,而且不會因為中文的編碼而出現問題。
關於form
數據最後的一點就是form
的初始值。
我們看到form
數據默認都是空值(form
字段的類型大多都不相同,這裡將上面的初始值統稱為空值),實際上我們可以為其指定默認值
:即直接在data
中給form.xx
設置默認值。
這裡將上面
type
和resource
設置的值恢復成了中文,項目開發中記得設置成上面的那種形式。
form: {
name: '我是初始化設置的活動名稱', // 活動名稱
region: 'beijing', // 活動區域
date1: new Date(), // 活動時間-日期
date2: new Date(), // 活動時間-時間
delivery: true, // 即時配送
type: ['單純品牌曝光'], // 活動性質
resource: '線上品牌商贊助', // 特殊資源
desc: '我是初始化設置的活動形式' // 活動形式
}
設置了默認值
後,我們刷新頁面,表單中的內容就是我們設置的值。
注意:對於
select
、checkbox
和radio
這幾個控件,form
字段中的值必須要和對應控件的label
值一致,否則控件匹配不到,對應的內容也就無法反填到表單中。
rules
表單屬性rules
是用於設置表單的驗證規則,我們來實踐一下。
<!-- index.html -->
<el-form ref="form" :model="form" :rules="addFormRules" label-width="80px">
<!-- 中間未修改的代碼省略-->
</el-form>
可以看到:rule
作用在el-form
上,並且綁定了一個變量addFormRules
。
接着我們就在addFormRules
中編寫活動名稱name
的驗證規則。
// 有部分未修改的代碼省略
var vm = new Vue({
el: '#box',
data: {
addFormRules: {
name: [{
required: true, // name字段是否必填,true:必填 false:非必填
trigger: 'blur', // 在什麼時候觸發驗證,blur:在元素失去焦點的時候驗證規則
message: "請輸入活動名稱", // 如果沒有填寫時的錯誤提示語
},{
min: 5, // 字段最小長度
max: 10, // 字段最大長度
trigger: 'blur', // 在什麼時候觸發驗證,blur:在元素失去焦點的時候驗證規則
message: "活動名稱長度在5-10個字符", // 不滿足規則時顯示的錯誤提示語
}]
}
}
})
在addFormRules
裏面我們定義了name
字段,該字段是一個數組,數組的每一項又是一個json
。
就我們編寫的這個驗證規則,數組中的第一個json
元素編寫的是活動名稱字段的必填驗證規則
,json
中的每一個鍵值對的含義注釋中都有寫到;數組中的第二個json
元素編寫的是活動名稱字段的長度驗證規則
。
那麼到這裡還有最重要的一步,我們的這個規則才能生效:在el-form-item
上設置prop
屬性。
<!-- index.html -->
<el-form ref="form" :model="form" :rules="addFormRules" label-width="80px">
<el-form-item label="活動名稱" prop="name">
<el-input v-model="form.name"></el-input>
</el-form-item>
<!-- 中間未修改的代碼省略-->
</el-form>
可以看到prop
屬性的值就是form
中定義的name
字段,只有這樣addFormRules
中定義的對name
的校驗規則才能和對應的表單關聯起來,否則驗證規則是不會生效的。
這裡需要注意的是,表單
el-form
上綁定的form
數據中的字段、prop
設置的值以及rule
綁定的addFormRules
數據中的字段,這三個必須都要一致,否則校驗會出現問題。
label-position、label-width、label-suffix
這三個表單屬性都是用於設置表單域的標籤。
label-position
用於設置標籤域的對齊方式(默認右對齊);label-width
用於設置標籤域的寬度;label-suffix
用於設置標籤域的後綴。
<el-form
ref="form"
:model="form"
:rules="addFormRules"
label-position="left"
label-width="120px"
label-suffix=":">
<!-- 中間未修改的代碼省略-->
</el-form>
status-icon
<el-form
ref="form"
:model="form"
:rules="addFormRules"
label-width="120px"
status-icon="true">
<!-- 中間未修改的代碼省略-->
</el-form>
表單方法
validate
表單方法validate
是對整個表單進行校驗的方法,參數為一個回調函數
。
該回調函數
會在校驗結束後被調用,並傳入兩個參數:是否校驗成功
和未通過校驗的字段
。若不傳入回調函數,則會返回一個promise
。
下面我們就來實踐一下這個表單方法。
主要的改動就是在提交表單的時候調用
validate
方法,打印出回調函數中的兩個參數。
<el-form
ref="form"
:model="form"
:rules="addFormRules"
label-width="120px"
label-suffix=":"
:status-icon="statusIcon">
<!-- 中間未修改的代碼省略-->
<el-form-item>
<el-button type="primary" @click="onSubmit">立即創建</el-button>
<el-button>取消</el-button>
</el-form-item>
</el-form>
<script>
var vm = new Vue({
el: '#box',
data: {
message: "Element Form表單實踐",
statusIcon: true,
form: {
name: '我是初始化設置的活動名稱', // 活動名稱
region: 'beijing', // 活動區域
date1: new Date(), // 活動時間-日期
date2: new Date(), // 活動時間-時間
delivery: true, // 即時配送
type: ['單純品牌曝光'], // 活動性質
resource: '線上品牌商贊助', // 特殊資源
desc: '我是初始化設置的活動形式' // 活動形式
},
addFormRules: {
name: [{
required: true, // name字段是否必填,true:必填 false:非必填
trigger: 'blur', // 在什麼時候觸發驗證,blur:在元素失去焦點的時候驗證規則
message: "請輸入活動名稱", // 如果沒有填寫時的錯誤提示語
},{
min: 5, // 字段最小長度
max: 10, // 字段最大長度
trigger: 'blur', // 在什麼時候觸發驗證,blur:在元素失去焦點的時候驗證規則
message: "活動名稱長度在5-10個字符", // 不滿足規則時顯示的錯誤提示語
}]
}
},
methods: {
onSubmit() {
this.$refs['form'].validate((validate,failedInfo) => {
console.log('validate:')
console.log(validate);
console.log('failedInfo:')
console.log(failedInfo);
})
}
}
})
</script>
表單驗證成功時validate
和failedInfo
的打印結果:
表單驗證失敗時validate
和failedInfo
的打印結果:
前面我們只編寫了
name
字段的驗證規則,因此在表單提交調用validate
方法時,只會對name
字段進行驗證。
其實對於我們日常的開發來說會比較關注第一個參數,當回調函數中的第一個參數為true
時,表示表單驗證成功
,就可以將表單數據傳遞到後端;相反的當第一個參數為falses
時,表示表單驗證失敗
,我們就可以給用戶一個錯誤提示。
methods: {
onSubmit() {
this.$refs['form'].validate((validate,failedInfo) => {
if(validate){
// 將表單數據發送到後端
// 發送 POST 請求
axios.post(url, this.form).then(function (response) {
// 處理後端返回的響應數據
});
}else{
// 提示用戶
this.$message({
message: '表單數據格式有誤,請檢查後重新提交.',
type: "error",
center: true
});
}
})
}
}
這裡有一定需要注意,回調函數最好寫成箭頭函數的形式,這樣在回調函數內部的
this
表示的是Vue
實例對象。如果使用普通的函數聲明function
,則回調函數內部的this
指向的是windows
對象。
resetFields
表單屬性resetFields
對整個表單進行重置,將所有字段值重置為初始值
並且移除校驗結果
。
本次改動就是將之前的
取消
按鈕改為重置
按鈕,並且在點擊重置
按鈕的時候調用resetFields
方法。
<el-form
ref="form"
:model="form"
:rules="addFormRules"
label-width="120px"
label-suffix=":"
:status-icon="statusIcon">
<!-- 中間未修改的代碼省略-->
<el-form-item>
<el-button type="primary" @click="onSubmit">立即創建</el-button>
<el-button type="primary" @click="resetForm">重置</el-button>
</el-form-item>
</el-form>
<script>
var vm = new Vue({
el: '#box',
data: {
message: "Element Form表單實踐",
statusIcon: true,
form: {
name: '我是初始化設置的活動名稱', // 活動名稱
region: 'beijing', // 活動區域
date1: new Date(), // 活動時間-日期
date2: new Date(), // 活動時間-時間
delivery: true, // 即時配送
type: ['單純品牌曝光'], // 活動性質
resource: '線上品牌商贊助', // 特殊資源
desc: '我是初始化設置的活動形式' // 活動形式
},
addFormRules: {
name: [{
required: true, // name字段是否必填,true:必填 false:非必填
trigger: 'blur', // 在什麼時候觸發驗證,blur:在元素失去焦點的時候驗證規則
message: "請輸入活動名稱", // 如果沒有填寫時的錯誤提示語
},{
min: 5, // 字段最小長度
max: 10, // 字段最大長度
trigger: 'blur', // 在什麼時候觸發驗證,blur:在元素失去焦點的時候驗證規則
message: "活動名稱長度在5-10個字符", // 不滿足規則時顯示的錯誤提示語
}]
}
},
methods: {
onSubmit() {
this.$refs['form'].validate((validate,failedInfo) => {
console.log('validate:')
console.log(validate);
console.log('failedInfo:')
console.log(failedInfo);
})
},
resetForm(){
this.$refs['form'].resetFileds();
}
}
})
</script>
仔細查看重置以後的結果,會發現只有活動名稱字段的值恢復了初始值,而其餘我們修改了表單信息的空間均沒有重置為初始值。
這裡需要注意
resetFileds
方法是將表單的值設置為初始值
,而不是空值
。初始值
就是在組件的data
中設置的值,所以我們點擊重置的時候活動名稱這個空間的值變回了我是初始化設置的活動名稱
。
這樣的效果顯然是不對的。
不過原因也很簡單,就是我們沒有給其他的表單項設置prop
屬性。所以我們要注意,在使用resetFileds
時,必須給表單項el-form-item
設置prop
值,否則無法進行重置。
<el-form
ref="form"
:model="form"
:rules="addFormRules"
label-width="120px"
label-suffix=":"
:status-icon="statusIcon"
>
<el-form-item label="活動名稱" prop="name">
<el-input v-model="form.name"></el-input>
</el-form-item>
<el-form-item label="活動區域" prop="region">
<el-select v-model="form.region" placeholder="請選擇活動區域">
<el-option label="區域一" value="shanghai"></el-option>
<el-option label="區域二" value="beijing"></el-option>
</el-select>
</el-form-item>
<el-form-item label="活動時間" >
<el-col :span="11">
<el-form-item prop="date1">
<el-date-picker type="date" placeholder="選擇日期" v-model="form.date1" style="width: 100%;"></el-date-picker>
</el-form-item>
</el-col>
<el-col class="line" :span="2">-</el-col>
<el-col :span="11">
<el-form-item prop="date2">
<el-time-picker placeholder="選擇時間" v-model="form.date2" style="width: 100%;"></el-time-picker>
</el-form-item>
</el-col>
</el-form-item>
<el-form-item label="即時配送" prop="delivery">
<el-switch v-model="form.delivery"></el-switch>
</el-form-item>
<el-form-item label="活動性質" prop="type">
<el-checkbox-group v-model="form.type">
<el-checkbox label="美食/餐廳線上活動" name="type"></el-checkbox>
<el-checkbox label="地推活動" name="type"></el-checkbox>
<el-checkbox label="線下主題活動" name="type"></el-checkbox>
<el-checkbox label="單純品牌曝光" name="type"></el-checkbox>
</el-checkbox-group>
</el-form-item>
<el-form-item label="特殊資源" prop="resource">
<el-radio-group v-model="form.resource">
<el-radio label="線上品牌商贊助"></el-radio>
<el-radio label="線下場地免費"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="活動形式" prop="desc">
<el-input type="textarea" v-model="form.desc"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit">立即創建</el-button>
<el-button type="primary" @click="resetForm">重置</el-button>
</el-form-item>
</el-form>
這裡需要特意說明的是為活動時間
這個表單項設置prop
屬性。
<el-form-item label="活動時間" >
<el-col :span="11">
<el-form-item prop="date1">
<el-date-picker type="date" placeholder="選擇日期" v-model="form.date1" style="width: 100%;"></el-date-picker>
</el-form-item>
</el-col>
<el-col class="line" :span="2">-</el-col>
<el-col :span="11">
<el-form-item prop="date2">
<el-time-picker placeholder="選擇時間" v-model="form.date2" style="width: 100%;"></el-time-picker>
</el-form-item>
</el-col>
</el-form-item>
那對比之前沒有設置prop
的代碼,還給el-date-picker
外層多加了一個el-form-item
元素。那也很好理解,因為活動時間這個包含了兩個el-time-picker
,並且綁定的不同的form
數據:date1
和date2
。而之前的寫法兩個el-time-picker
都同在一個el-form-item
元素中,那設置prop
時只能設置一個值,所以element
提供的解決方案就是分別給兩個el-time-picker
在嵌套一層el-form-item
元素,這樣就能分別設置prop
屬性了。
現在我們在看一下重置按鈕的效果。
可以看到所有的表單項都重置成功。
表單項屬性
表單項屬性是指設置在
el-form-item
上的屬性
這裡在聲明一下一些叫法,以免產生疑惑
當描述表單
時,對應的元素為el-form
當描述表單項
對應的元素為el-form-item
prop
這個屬性在前面實踐表單驗證
、表單重置
的時候用過。
那在日常開發中,表單驗證
和表單重置
是一個很常用的功能,因此很有必要在編寫代碼的時候給表單項設置prop
屬性,以免出現一些讓人疑惑的錯誤。
一定要注意
prop
屬性值的設置一定要和form
表單綁定的字段名稱一致
label
label屬性設置的是表單標籤域的文本描述。
size
表單組件的尺寸,共有三個可選值:medium / small / mini。
rules
這裡的rules
是表單項
的驗證規則,下面我們就活動名稱
這個字段進行驗證。
主要改動為將表單屬性
el-form
上的rules
移除,在活動名稱
對應的el-form-item
上添加rules
規則驗證。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Element Form表單實踐</title>
<!-- 開發環境版本,包含了有幫助的命令行警告 -->
<script src="//cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<!-- 引入樣式 -->
<link rel="stylesheet" href="//unpkg.com/element-ui/lib/theme-chalk/index.css">
<!-- 引入組件庫 -->
<script src="//unpkg.com/element-ui/lib/index.js"></script>
</head>
<body>
<div id="box">
<span> {{message}} </span>
<el-divider></el-divider>
<!-- 典型表單 -->
<el-form
ref="form"
:model="form"
label-width="120px"
label-suffix=":"
:status-icon="statusIcon">
<el-form-item
label="活動名稱"
prop="name"
:rules="[{required: true,trigger: 'blur',message: '請輸入活動名稱'}]">
<el-input v-model="form.name" ></el-input>
</el-form-item>
<el-form-item label="活動區域" prop="region">
<el-select v-model="form.region" placeholder="請選擇活動區域">
<el-option label="區域一" value="shanghai"></el-option>
<el-option label="區域二" value="beijing"></el-option>
</el-select>
</el-form-item>
<el-form-item label="活動時間" >
<el-col :span="11">
<el-form-item prop="date1">
<el-date-picker type="date" placeholder="選擇日期" v-model="form.date1" style="width: 100%;"></el-date-picker>
</el-form-item>
</el-col>
<el-col class="line" :span="2">-</el-col>
<el-col :span="11">
<el-form-item prop="date2">
<el-time-picker placeholder="選擇時間" v-model="form.date2" style="width: 100%;"></el-time-picker>
</el-form-item>
</el-col>
</el-form-item>
<el-form-item label="即時配送" prop="delivery">
<el-switch v-model="form.delivery"></el-switch>
</el-form-item>
<el-form-item label="活動性質" prop="type">
<el-checkbox-group v-model="form.type">
<el-checkbox label="美食/餐廳線上活動" name="type"></el-checkbox>
<el-checkbox label="地推活動" name="type"></el-checkbox>
<el-checkbox label="線下主題活動" name="type"></el-checkbox>
<el-checkbox label="單純品牌曝光" name="type"></el-checkbox>
</el-checkbox-group>
</el-form-item>
<el-form-item label="特殊資源" prop="resource">
<el-radio-group v-model="form.resource">
<el-radio label="線上品牌商贊助"></el-radio>
<el-radio label="線下場地免費"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="活動形式" prop="desc">
<el-input type="textarea" v-model="form.desc"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit">立即創建</el-button>
<el-button type="primary" @click="resetForm">重置</el-button>
</el-form-item>
</el-form>
</div>
<script>
var vm = new Vue({
el: '#box',
data: {
message: "Element Form表單實踐",
statusIcon: true,
form: {
name: '我是初始化設置的活動名稱', // 活動名稱
region: 'beijing', // 活動區域
date1: new Date(), // 活動時間-日期
date2: new Date(), // 活動時間-時間
delivery: true, // 即時配送
type: ['單純品牌曝光'], // 活動性質
resource: '線上品牌商贊助', // 特殊資源
desc: '我是初始化設置的活動形式' // 活動形式
},
addFormRules: {
name: [{
required: true, // name字段是否必填,true:必填 false:非必填
trigger: 'blur', // 在什麼時候觸發驗證,blur:在元素失去焦點的時候驗證規則
message: "請輸入活動名稱", // 如果沒有填寫時的錯誤提示語
},{
min: 5, // 字段最小長度
max: 10, // 字段最大長度
trigger: 'blur', // 在什麼時候觸發驗證,blur:在元素失去焦點的時候驗證規則
message: "活動名稱長度在5-10個字符", // 不滿足規則時顯示的錯誤提示語
}]
}
},
methods: {
onSubmit() {
this.$refs['form'].validate((validate,failedInfo) => {
if(validate){
// 將表單數據發送到後端
// 發送 POST 請求
axios.post(url, this.form).then(function (response) {
// 處理後端返回的響應數據
});
}else{
// 提示用戶
this.$message({
message: '表單數據格式有誤,請檢查後重新提交.',
type: "error",
center: true
});
}
})
},
resetForm(){
this.$refs['form'].resetFields();
}
}
})
</script>
</body>
</html>
主要的代碼如下:
<el-form-item
label="活動名稱"
prop="name"
:rules="[{required: true,trigger: 'blur',message: '請輸入活動名稱'}]">
<el-input v-model="form.name" ></el-input>
</el-form-item>
可以看到驗證規則添加到表單項el-form-item
上和添加到表單el-form
上的語法基本上是一致的。
接着看下驗證的結果。
可以看到驗證規則已經生效了。
最後呢,還有一個操作想進行驗證一下,就是同時設置el-form
和el-form-item
上的rules
。
<el-form
ref="form"
:model="form"
label-width="120px"
label-suffix=":"
:status-icon="statusIcon"
:rules="addFormRules">
<el-form-item
label="活動名稱"
prop="name"
:rules="[{required: true,trigger: 'blur',message: '請輸入活動名稱'}]">
<el-input v-model="form.name" ></el-input>
</el-form-item>
</el-form>
可以看到我將el-form
上的rules
又添加了回來。
el-form
對活動名稱字段的驗證規則是不能為空
且長度在5-10個字符
,而el-item-form
上設置的規則只有內容不能為空
。
我們再來看一下結果。
可以發現只有不為空
的驗證規則生效了,而長度驗證規則並沒有生效。所以結論就是el-form
上的rules
優先級小於el-item-form
上的rules
規則驗證,當el-form-item
上有定義字段的驗證規則時,就會忽略對應的el-form
上定義的字段的驗證規則。
結束語
到這裡本篇文章就結束了,內容非常的簡單。
下一篇將會分享項目開發中的一個表單實踐,記錄在這個過程中遇到的一些問題。
關於
作者
小馬鈴薯biubiubiu
一個努力學習的前端小菜鳥,知識是無限的。堅信只要不停下學習的腳步,總能到達自己期望的地方
同時還是一個喜歡小貓咪的人,家裡有一隻美短小母貓,名叫馬鈴薯
博客園
掘金
//juejin.im/user/58c61b4361ff4b005d9e894d
微信公眾號
馬鈴薯媽的碎碎念
微信公眾號的初衷是記錄自己和身邊的一些故事,同時會不定期更新一些技術文章
歡迎大家掃碼關注,一起吸貓,一起聽故事,一起學習前端技術
作者寄語
小小總結,歡迎大家指導~