在咱們使用Vue+Element開發前端的時候,每每涉及到不少界面組件的使用,其中不少直接採用Element官方的案例便可,有些則是在這個基礎上封裝更好利用、更少代碼的組件;另外有些則是直接採用第三方開發好的組件,目的就是實現所需功能外,儘可能簡化界面使用代碼。本篇隨筆介紹在個人項目中常常用到的各類界面組件和它的界面效果,以便在實際開發中進行相應的參考,提升開發效率。 html
咱們以幾個常規界面來介紹相關控件的使用,如列表界面,包括查詢、表格、分頁等信息,查詢框中包含一些關鍵字段的信息查詢,而表格中則包含重要字段信息的展現或者相關操做。前端
而後編輯界面,簡單的以下所示。vue
複雜界面中,包含不少錄入信息的界面組件git
另外還能夠設計富文本、圖片上傳等操做。github
以上就是一些常規界面的錄入狀況,其中使用到了不少相關的界面組件,包括文本錄入框、下拉選框、樹列表、標籤、圖片上傳、富文本、日期、省市區列表等等。 數據庫
下面分別對一些常規的界面組件的使用進行介紹。後端
文本框通常是比較常見的界面組件,一個是內容錄入比較靈活,其次也是由於使用簡單方便。數組
通常這種錄入界面組件,都是放在表單裏面處理比較多,由於能夠利用表單的校驗功能實現校驗等操做,也能夠利用表單對應的對象屬性一併提交。服務器
使用代碼很簡單,以下所示。app
<el-form-item label="姓名" prop="name"> <el-input v-model="searchForm.name" /> </el-form-item>
若是是有些錄入須要有前綴或者後綴的,則能夠經過Slot模板進行處理。
<el-col :span="12"> <el-form-item label="身高" prop="height"> <el-input v-model="addForm.height"><span slot="suffix">釐米</span></el-input> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="體重" prop="weight"> <el-input v-model="addForm.weight"><span slot="suffix">公斤</span></el-input> </el-form-item> </el-col>
或者咱們參考官方Element的案例,也能夠看到使用的效果和代碼
<div> <el-input placeholder="請輸入內容" v-model="input1"> <template slot="prepend">Http://</template> </el-input> </div> <div style="margin-top: 15px;"> <el-input placeholder="請輸入內容" v-model="input2"> <template slot="append">.com</template> </el-input> </div> <div style="margin-top: 15px;"> <el-input placeholder="請輸入內容" v-model="input3" class="input-with-select"> <el-select v-model="select" slot="prepend" placeholder="請選擇"> <el-option label="餐廳名" value="1"></el-option> <el-option label="訂單號" value="2"></el-option> <el-option label="用戶電話" value="3"></el-option> </el-select> <el-button slot="append" icon="el-icon-search"></el-button> </el-input> </div>
另外,文本輸入框還包括一個多行的輸入textarea的類型輸入。
<el-input type="textarea" placeholder="請輸入內容" v-model="textarea" maxlength="30" show-word-limit>
有時候,文本框還須要輸入長度的限制,這個在文本框很容易設置,界面效果以下所示。
界面代碼以下所示。
<el-input type="text" placeholder="請輸入內容" v-model="text" maxlength="10" show-word-limit> </el-input> <div style="margin: 20px 0;"></div> <el-input type="textarea" placeholder="請輸入內容" v-model="textarea" maxlength="30" show-word-limit> </el-input>
日期咱們通常用內置的el-date-picker便可,能夠顯示短日期、帶時間的長日期,或者選擇日期範圍多項選擇。
<el-form-item label="出生日期" prop="birthDate"> <el-date-picker v-model="addForm.birthDate" align="right" type="date" placeholder="選擇日期" value-format="yyyy-MM-dd" /> </el-form-item>
而咱們在查詢的時候,通常就是一個日期區間。
咱們只須要指定type="daterange"便可。
<el-form-item label="建立時間"> <el-date-picker v-model="searchForm.creationTime" type="daterange" align="right" unlink-panels range-separator="至" start-placeholder="開始日期" end-placeholder="結束日期" :picker-options="pickerOptions" /> </el-form-item>
其中的 pickerOptions 則是咱們定義的快捷選擇項,單獨放置一個文件constantOptions.js裏面,須要導入對象使用便可,這樣能夠減小不少頁面的JS代碼,其餘常見變量也是這樣的方式處理。
// 選擇時間範圍的快捷選項 export const pickerOptions = { shortcuts: [ { text: '昨天', onClick(picker) { const end = new Date(); const start = new Date(); start.setTime(start.getTime() - 3600 * 1000 * 24 * 1); picker.$emit('pick', [start, end]); } }, { text: '最近一週', onClick(picker) { const end = new Date(); const start = new Date(); start.setTime(start.getTime() - 3600 * 1000 * 24 * 7); picker.$emit('pick', [start, end]); } }, { text: '最近一個月', onClick(picker) { const end = new Date(); const start = new Date(); start.setTime(start.getTime() - 3600 * 1000 * 24 * 30); picker.$emit('pick', [start, end]); } }, { text: '最近三個月', onClick(picker) { const end = new Date(); const start = new Date(); start.setTime(start.getTime() - 3600 * 1000 * 24 * 90); picker.$emit('pick', [start, end]); } }] }
日期輸入控件,有時候會出現得到的日期值比實際的值少一天的問題,通常經過設置 value-format="yyyy-MM-dd" 便可解決。
標籤的顯示和錄入,也是咱們很常見的處理,多顏色的標籤能夠提升界面的美觀,同時也是對多選值的友好顯示。
咱們先來看看官方的案例。
<el-tag>標籤一</el-tag> <el-tag type="success">標籤二</el-tag> <el-tag type="info">標籤三</el-tag> <el-tag type="warning">標籤四</el-tag> <el-tag type="danger">標籤五</el-tag>
其實就是指定type不一樣就能夠實現不一樣的效果,另外咱們還能夠經過設置effect屬性來改變主題,默認爲 light
標籤的顯示是有了,通常咱們還須要一個標籤的錄入操做,雖然官方也提供了一個案例,不過是簡單對Tag標籤組件的使用,代碼仍是很多。
實際上,咱們在使用組件的時候,系統儘可能減小代碼量,所以咱們能夠參考官方的方式創建一個集標籤顯示和錄入功能一塊兒的組件,不過Github上已經有人開發了,我就直接拿過來用吧。
https://github.com/xiispace/el-input-tag
界面效果以下所示。
使用的時候,界面代碼和普通組件同樣簡單,很是棒。
<el-form-item label="標籤" prop="tags"> <el-input-tag v-model="editForm.tags_array" /> </el-form-item>
JS部分只須要轉換下咱們的內容便可。咱們tags屬性存儲是逗號分開的字符串,那麼tags_array這是數組,咱們獲取值的時候,須要進行轉換,把字符串轉換爲數組的值。
// 將字符串的標籤,轉換爲Array集合 if (this.addForm.tags) { this.addForm.tags_array = this.addForm.tags.split(',') }
而修改組件,會引發數組的改變,爲了不集中轉換,咱們能夠經過watch函數來統一處理,這樣tags內容就會自動變化了。
watch: { // 對過濾內容進行監控,實現樹列表過濾 // 鍵路徑必須加上引號 'addForm.tags_array': function(val, oldval) { if (val) { this.addForm.tags = val.toString() } }, 'editForm.tags_array': function(val, oldval) { if (val) { this.editForm.tags = val.toString() } } },
下拉列表或者下拉框是咱們常見的選擇方式之一,下拉列表有時候能夠是固定列表,如男女、有效/無效, 也能夠是多個動態列表供選擇。
或者
或者是一連串聯動的組件構成。
Select組件的使用以下所示。
<el-select v-model="value" placeholder="請選擇"> <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value"> </el-option> </el-select>
而其中的JS部分,options就是有value,lable組成的對象數組,以下代碼所示
<script> export default { data() { return { options: [{ value: '選項1', label: '黃金糕' }, { value: '選項2', label: '雙皮奶' }], value: '' } } } </script>
爲el-select
設置clearable
屬性,則可將選擇器清空。爲el-select
添加filterable
屬性便可啓用搜索功能。
爲el-select
設置multiple
屬性便可啓用多選,此時v-model
的值爲當前選中值所組成的數組。默認狀況下選中值會以 Tag 的形式展示,你也能夠設置collapse-tags
屬性將它們合併爲一段文字。
縱觀Select組件,其數據源要麼是固定列表,要麼是從數據庫字典裏面獲取的內容,爲了簡化界面代碼的調用,咱們把它做爲字典組件進行了定義,能夠綁定固定列表,也能夠綁定字典表裏面的字典類型名稱。
組件使用很簡單,以下代碼所示。
<el-form-item label="狀態"> <my-dictdata v-model="addForm.status" :options="Status"/> <my-dictdata v-model="addForm.status" type-name="狀態"/> </el-form-item>
建立一個組件,定義好兩個屬性,以下代碼所示。
在組件Mounted的時候,咱們對這些內容進行解析,構建爲對應組件的數據源便可。
mounted() { var that = this; if (this.typeName && this.typeName !== '') { // 使用字典類型,從服務器請求數據 var params = { dictTypeName: this.typeName }; dictdata.GetListItemByDictType(params).then(data => { var list = data.result; // console.log(list); if (list) { list.forEach(item => { // console.log(item) that.dictItems.push({ text: item.text, value: item.value }); }) } }) } else if (this.options && this.options.length > 0) { // 使用固定字典列表 this.options.forEach(item => { if (item && typeof (item.value) !== 'undefined') { that.dictItems.push(item) } }); } // 設置默認值 this.svalue = this.value; },
這樣,使用起來就很方便了,能夠直接綁定字典類型便可。
<el-col :span="12"> <el-form-item label="民族" prop="nationality"> <my-dictdata v-model="editForm.nationality" type-name="民族" /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="學歷" prop="education"> <my-dictdata v-model="editForm.education" type-name="學歷" /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="婚姻情況" prop="marriage"> <my-dictdata v-model="editForm.marriage" type-name="婚姻情況" /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="星座" prop="star"> <my-dictdata v-model="editForm.star" type-name="星座" /> </el-form-item> </el-col>
這樣的組件,相對於每次調用API去獲取字典資源,而後進行轉換處理,代碼更加簡單易懂了,同時也更加優雅,提升代碼質量。
複選框和單選框也是常用的,對簡單的一些選項進行勾選處理。
多選框有多選框組,單選框也有單選框組,這樣組合起來界面更加美觀。
<template> <el-checkbox-group v-model="checkList"> <el-checkbox label="複選框 A"></el-checkbox> <el-checkbox label="複選框 B"></el-checkbox> <el-checkbox label="複選框 C"></el-checkbox> <el-checkbox label="禁用" disabled></el-checkbox> <el-checkbox label="選中且禁用" disabled></el-checkbox> </el-checkbox-group> </template> <script> export default { data () { return { checkList: ['選中且禁用','複選框 A'] }; } }; </script>
<template> <el-radio-group v-model="radio"> <el-radio :label="3">備選項</el-radio> <el-radio :label="6">備選項</el-radio> <el-radio :label="9">備選項</el-radio> </el-radio-group> </template> <script> export default { data () { return { radio: 3 }; } } </script>
這兩個是官方比較典型的案例說明了,通常咱們也是以組合的方式進行使用。
例如咱們在產品類型綁定品牌列表的時候,就是採用了複選框漢族,經過key/value的集合組合便可實現鍵值對的處理。
<el-col :span="24"> <el-form-item label="品牌關聯" prop="bindBrands"> <el-checkbox-group v-model="addForm.bindBrands" style="padding:10px;box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1)"> <el-checkbox v-for="(item, i) in brandList" :key="i" :label="item.id">{{ item.brandName }}</el-checkbox> </el-checkbox-group> </el-form-item> </el-col>
<el-form-item label="虛擬商品" prop="isVirtual"> <el-radio-group v-model="addForm.isVirtual"> <el-radio class="radio" :label="1">是</el-radio> <el-radio class="radio" :label="0">否</el-radio> </el-radio-group> </el-form-item>
Switch開關有點相似於單選框的操做,不過提供比較美觀的一個處理,表示兩種相互對立的狀態間的切換,多用於觸發「開/關」。
<el-switch v-model="value1" active-text="按月付費" inactive-text="按年付費"> </el-switch> <el-switch style="display: block" v-model="value2" active-color="#13ce66" inactive-color="#ff4949" active-text="按月付費" inactive-text="按年付費"> </el-switch> <script> export default { data() { return { value1: true, value2: true } } }; </script>
這個組件提供了不少屬性配置,能夠自定義激活/未激活的顏色、文本、值的信息,以下說明。
所以,咱們有時候的值若是是0,1的就能夠設置一下active-value/inactive-value的值,不然默認是Boolean變量。
以下,有時候咱們在查詢中也會增長一個Switch來處理一些屬性查詢。
若是咱們這樣用,而isVirtual屬性是0,1的數值的話,那麼咱們就須要進行轉換了
<el-form-item label="虛擬商品" prop="isVirtual"> <el-switch v-model="searchForm.isVirtual" active-color="#13ce66" inactive-color="gray" /> </el-form-item>
那麼咱們發起查詢的時候,就須要把布爾變量轉換爲0,1的值了,以下代碼所示
getlist() { // 列表數據獲取 var param = { // 構造常規的分頁查詢條件 // 分頁條件 SkipCount: (this.pageinfo.pageindex - 1) * this.pageinfo.pagesize, MaxResultCount: this.pageinfo.pagesize, // 查詢過濾條件 Code: this.searchForm.code, Name: this.searchForm.name, IsVirtual: this.searchForm.isVirtual }; // 使用日期範圍選擇控件,在查詢對象增長開始日期CreationTimeStart、結束日期CreationTimeEnd this.addDateRange(param, this.searchForm.creationTime) param.IsVirtual = param.IsVirtual ? 1 : 0;// 修改數據類型爲int // console.log(param) // 獲取列表,綁定到模型上,並修改分頁數量 this.listLoading = true productType.GetAll(param).then(data => { this.list = data.result.items this.pageinfo.total = data.result.totalCount this.listLoading = false }) },
或者咱們定義active-value、inactive-value來處理會簡單一些。
<el-form-item label="虛擬商品" prop="isVirtual"> <el-switch v-model="searchForm.isVirtual" active-value="1" inactive-value="0" active-color="#13ce66" inactive-color="gray" /> </el-form-item>
那這樣查詢就不須要轉換bool到數值了,由於已經默認是0/1的數值類型了,更改後的查詢代碼以下所示。
getlist() { // 列表數據獲取 var param = { // 構造常規的分頁查詢條件 // 分頁條件 SkipCount: (this.pageinfo.pageindex - 1) * this.pageinfo.pagesize, MaxResultCount: this.pageinfo.pagesize, // 查詢過濾條件 Code: this.searchForm.code, Name: this.searchForm.name, IsVirtual: this.searchForm.isVirtual }; // 使用日期範圍選擇控件,在查詢對象增長開始日期CreationTimeStart、結束日期CreationTimeEnd this.addDateRange(param, this.searchForm.creationTime) // console.log(param) // 獲取列表,綁定到模型上,並修改分頁數量 this.listLoading = true productType.GetAll(param).then(data => { this.list = data.result.items this.pageinfo.total = data.result.totalCount this.listLoading = false }) },
在組件或者頁面裏面,咱們都須要大量使用到提示信息,確認信息等信息提示功能。而Element也提供了這樣不一樣的組件來使用。
多個不一樣類型的消息提示窗口,界面以下所示。
Notification 通知組件,懸浮出如今頁面角落,顯示全局的通知提醒消息。界面以下所示
咱們爲了方便,通常先簡單封裝一下,並在全局掛載這些方法,以便在不一樣的地方簡化調用。
// 提示成功信息 Vue.prototype.msgSuccess = function(msg) { this.$message({ showClose: true, message: msg, type: 'success' }) } // 提示警告信息 Vue.prototype.msgWarning = function(msg) { this.$message({ showClose: true, message: msg, type: 'warning' }) } // 提示錯誤信息 Vue.prototype.msgError = function(msg) { this.$message({ showClose: true, message: msg, type: 'error' }) } // 提示信息 Vue.prototype.msgInfo = function(msg) { this.$message.info({ showClose: true, message: msg }) } // 確認信息 Vue.prototype.msgConfirm = function(msg = '您確認刪除選定的記錄嗎?') { return this.$confirm(msg, '操做提示', { type: 'warning' // success,error,info,warning // confirmButtonText: '肯定', // cancelButtonText: '取消' }) }
這樣咱們在頁面中就能夠很方便使用了,如刪除確認對話框操做。
showDelete(id) { // 刪除對話框處理 this.msgConfirm().then(() => { // 刪除操做處理代碼 var param = { id: id } productType.Delete(param).then(data => { // console.log(data) if (data.success) { // 提示信息 this.msgSuccess('刪除成功!') // 刷新數據 this.getlist() } else { this.msgError('刪除失敗:' + data.error) } }) }) },
因爲篇幅有限,下篇在繼續介紹其餘組件的使用了。
爲了方便讀者理解,我列出一下前面幾篇隨筆的鏈接,供參考:
按部就班VUE+Element 前端應用開發(1)--- 開發環境的準備工做
按部就班VUE+Element 前端應用開發(2)--- Vuex中的API、Store和View的使用
按部就班VUE+Element 前端應用開發(3)--- 動態菜單和路由的關聯處理
按部就班VUE+Element 前端應用開發(4)--- 獲取後端數據及產品信息頁面的處理
按部就班VUE+Element 前端應用開發(5)--- 表格列表頁面的查詢,列表展現和字段轉義處理
按部就班VUE+Element 前端應用開發(6)--- 常規Element 界面組件的使用
按部就班VUE+Element 前端應用開發(7)--- 介紹一些常規的JS處理函數
按部就班VUE+Element 前端應用開發(8)--- 樹列表組件的使用
按部就班VUE+Element 前端應用開發(9)--- 界面語言國際化的處理
按部就班VUE+Element 前端應用開發(10)--- 基於vue-echarts處理各類圖表展現
按部就班VUE+Element 前端應用開發(11)--- 圖標的維護和使用
按部就班VUE+Element 前端應用開發(12)--- 整合ABP框架的前端登陸處理
按部就班VUE+Element 前端應用開發(13)--- 前端API接口的封裝處理
按部就班VUE+Element 前端應用開發(14)--- 根據ABP後端接口實現前端界面展現
按部就班VUE+Element 前端應用開發(15)--- 用戶管理模塊的處理
按部就班VUE+Element 前端應用開發(16)--- 組織機構和角色管理模塊的處理
按部就班VUE+Element 前端應用開發(17)--- 菜單管理
按部就班VUE+Element 前端應用開發(18)--- 功能點管理及權限控制
按部就班VUE+Element 前端應用開發(19)--- 後端查詢接口和Vue前端的整合
按部就班VUE+Element 前端應用開發(20)--- 使用組件封裝簡化界面代碼
按部就班VUE+Element 前端應用開發(21)--- 省市區縣聯動處理的組件使用
按部就班VUE+Element 前端應用開發(22)--- 簡化main.js處理代碼,抽取過濾器、全局界面函數、組件註冊等處理邏輯到不一樣的文件中
按部就班VUE+Element 前端應用開發(23)--- 基於ABP實現先後端的附件上傳,圖片或者附件展現管理