循序漸進VUE+Element 前端應用開發(25)--- 各種界面組件的使用(1)


在我們使用Vue+Element開發前端的時候,往往涉及到很多界面組件的使用,其中很多直接采用Element官方的案例即可,有些則是在這個基礎上封裝更好利用、更少代碼的組件;另外有些則是直接采用第三方開發好的組件,目的就是實現所需功能外,盡量簡化界面使用代碼。本篇隨筆介紹在我的項目中經常用到的各種界面組件和它的界面效果,以便在實際開發中進行相應的參考,提高開發效率。 

我們以幾個常規界面來介紹相關控件的使用,如列表界面,包括查詢、表格、分頁等信息,查詢框中包含一些關鍵字段的信息查詢,而表格中則包含重要字段信息的展示或者相關操作。

然后編輯界面,簡單的如下所示。

 復雜界面中,包含很多錄入信息的界面組件

另外還可以設計富文本、圖片上傳等操作。

 以上就是一些常規界面的錄入情況,其中使用到了很多相關的界面組件,包括文本錄入框、下拉選框、樹列表、標簽、圖片上傳、富文本、日期、省市區列表等等。 

下面分別對一些常規的界面組件的使用進行介紹。

1、普通文本輸入框

文本框一般是比較常見的界面組件,一個是內容錄入比較靈活,其次也是因為使用簡單方便。

一般這種錄入界面組件,都是放在表單里面處理比較多,因為可以利用表單的校驗功能實現校驗等操作,也可以利用表單對應的對象屬性一並提交。

使用代碼很簡單,如下所示。

  <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> 

 

2、日期輸入范圍選擇

日期我們一般用內置的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" 即可解決。

3、標簽顯示和錄入

標簽的顯示和錄入,也是我們很常見的處理,多顏色的標簽可以提高界面的美觀,同時也是對多選值的友好顯示。

我們先來看看官方的案例

<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()
      }
    }
  },

 

4、下拉列表和字典列表Select組件

下拉列表或者下拉框是我們常見的選擇方式之一,下拉列表有時候可以是固定列表,如男女、有效/無效, 也可以是多個動態列表供選擇。

或者

或者是一連串聯動的組件構成。

 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去獲取字典資源,然后進行轉換處理,代碼更加簡單易懂了,同時也更加優雅,提高代碼質量。

5、復選框和單選框

復選框和單選框也是經常使用的,對簡單的一些選項進行勾選處理。

多選框有多選框組,單選框也有單選框組,這樣組合起來界面更加美觀。

<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>

 

5、Switch開關

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
      })
    },

 

6、消息提示及彈框

在組件或者頁面里面,我們都需要大量使用到提示信息,確認信息等信息提示功能。而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 前端應用開發框架功能介紹 

循序漸進VUE+Element 前端應用開發(19)--- 后端查詢接口和Vue前端的整合

使用代碼生成工具快速生成基於ABP框架的Vue+Element的前端界面

循序漸進VUE+Element 前端應用開發(20)--- 使用組件封裝簡化界面代碼

循序漸進VUE+Element 前端應用開發(21)--- 省市區縣聯動處理的組件使用

循序漸進VUE+Element 前端應用開發(22)--- 簡化main.js處理代碼,抽取過濾器、全局界面函數、組件注冊等處理邏輯到不同的文件中

循序漸進VUE+Element 前端應用開發(23)--- 基於ABP實現前后端的附件上傳,圖片或者附件展示管理 

循序漸進VUE+Element 前端應用開發(24)--- 修改密碼的前端界面和ABP后端設置處理

循序漸進VUE+Element 前端應用開發(25)--- 各種界面組件的使用(1)

循序漸進VUE+Element 前端應用開發(26)--- 各種界面組件的使用(2)

電商商品數據庫的設計和功能界面的處理 

循序漸進VUE+Element 前端應用開發(27)--- 數據表的動態表單設計和數據存儲

循序漸進VUE+Element 前端應用開發(28)--- 附件內容的管理 

循序漸進VUE+Element 前端應用開發(29)--- 高級查詢條件的界面設計

部署基於.netcore5.0的ABP框架后台Api服務端,以及使用Nginx部署Vue+Element前端應用

循序漸進VUE+Element 前端應用開發(30)--- ABP后端和Vue+Element前端結合的分頁排序處理 

循序漸進VUE+Element 前端應用開發(31)--- 系統的日志管理,包括登錄日志、接口訪問日志、實體變化歷史日志

循序漸進VUE+Element 前端應用開發(32)--- 手機短信動態碼登陸處理 

循序漸進VUE+Element 前端應用開發(33)--- 郵件參數配置和模板郵件發送處理 

使用代碼生成工具快速開發ABP框架項目 

使用Vue-TreeSelect組件實現公司-部門-人員級聯下拉列表的處理 

使用Vue-TreeSelect組件的時候,用watch變量方式解決彈出編輯對話框界面無法觸發更新的問題 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM