1. 程式人生 > 程式設計 >vue+element自定義查詢元件

vue+element自定義查詢元件

本文主要介紹專案,在引入element的前提下,對元件進行二次封裝實現通過配置項直接佈局。

一、查詢條件元件化

結合EventBus.的使用,傳遞事件更高效,可以避免各種複雜的生命週期依賴關係。
components/dataForm資料夾下dataForm.vue作為元件集合的載體,並建立配置項

1.1 dataForm程式碼例項

// dataForm.vue
<template>
  <el-row>
    <input-form v-for="(item,index) in options" :key="'dataForm_'+index"> 
      <!-- 輸入框-->
      <input-form
        :key="index"
        v-if="item.type == 'input'"
        :data='item'
      ></input-form>
  </el-row>
</template>
<script>
import EventBus from "@/a
ssets/js/eventBus.js" import InputForm "@/components/dataForm/InputForm" export default { components: { InputForm,},props: { /** * 表單配置項 * @param {Object} option 配置引數,具體如下: * type: 表單項型別,String, 可選值input */ options: { type: Array,default() { return []; },data() { return {} },created() { // 此處主要是為了實現下拉框對其他子元件的顯示和隱藏 EventBus.$on("refreshDataForm",e => { this.refreshDataForm(e); }); },// 頁面銷燬 事件銷燬 beforeDestroy() { EventBus.$off("refreshDataForm") EventBus.$off("handleClick") },methods: { // 更新表單資料 refreshDataForm(item) { let data = this.options data.forEach((e,i) => { if (item.type == e.type && item.name == e.name) { this.options[i] = item } }) },// 子元件點選事件響應父元件,資料傳遞 handleClick(data) { EventBus.$emit("handleClick",data) },// 表單資料格式化 (可以對是否必填專案做必填校驗) getDataForm() { let data = this.options let formObj = {} let error = '' try { data.forEach(e => { if (e.type === ''input) { if (e.require && !e.content) { error = '請輸入' + e.label throw error } formObj[e.name] = e.content } else if (e.type === 'select' || e.type === 'dataSelect') { if (e.require && !e.content) { error = '請選擇' + e.label throw error } formObj[e.name] = e.content } else if (e.type === 'date' || e.type === 'dataRadio') { if (e.require && !e.content) { error = '請選擇' + e.label throw error } formObj[e.beginName] = e.beginRegTime formObj[e.endName] = e.endRegTime } else if (e.type === 'image') { formObj[e.name] = e.file || e.content } else if (e.type === 'upload') { formObj[e.name] = e.file || e.content if (e.delFileName) { // 刪除附件集合及自定義名稱和預設名稱 formObj[e.delFileName] = e.delFileIds.join(',') } else { formObj['delFileName'] = e.delFileIds.join(',') } } }) return formObj } catch (error) { this.$message({ message:error,type: 'error'}) } } } }

1.2 子組inputForm.vue

注:此處被引用的元件也可以被頁面單獨引用

<template>
  <el-col>
    <el-col :span="data.boxSpan?data.boxSpan:boxSpan" v-if="!data.isHide">
     <el-col :span="data.infoSpan?data.infoSpan:infoSpan" >
      <el-col :span="data.infoSpan?data.infoSpan:infoSpan" v-if="data.labelSpan!=0">
       <label class="el-form-item_label" :class="{'require': data.require}" v-html="data.label"></label>
      </el-col>
      <el-col :span="data.contentSpan?data.contentSpan:contentSpan" v-if="data.contentSpan!=0">
       <el-input :class="{'base_textarea': www.cppcns.com
data.textarea}" v-modle.trim="data.content" :type="data.textarea?'textarea':''" :disable="data.readOnly" :placeholder="setPlaceholder" maxlength="200"></el-input> </el-col> </el-col> <span v-text="title"></span> </div> </el-col> </template> <script> export default { props: { // 型別 input 輸入框 type: { type: String,default: 'input' },// 預設柵欄佈局 8/24 boxSpan: { type: Number,default: 8 },// 預設柵欄佈局 24/24 infoSpan: { type: Number,default: 24 },// 預設柵欄佈局 8/24 spanSpan: { type: Number,// 預設柵欄佈局 16/24 contentSpan: { type: Number,default: 16 },/** * name 關鍵字 * type 表單型別 * label 表單標題 * content 表單內容 * readOnly 是否只讀 預設否 * isHide 是否隱藏 預設否 * textarea 是否文字型別 預設否 **/ data: { type: Object,default() { return [] http://www.cppcns.com } } },computed: { setPlaceholder()www.cppcns.com { if(this.data.readOnly && !this.data.content) { return '' } return '請輸入' } } } </script> <style scoped> // 必填樣式 .require::after { content: '*'; color:red; } // flex佈局標題垂直居中 .el-form-item__label { float:right; margin-botton:0; line-height: 20px; display: flex; align-items: center; min-height: 40px; } </style>

1.3 父頁面引用及使用

<template>
  <el-row>
    <data-form :options='searchArray' ref='searchArray'></input-form>
  </el-row>
</template>

<script>
 import EventBus from "@/assets/js/eventBus.js"
 import DataForm "@/components/dataForm/dataForm"
 export default {
  components: {
   DataForm
  },data() {
   return {
    // 查詢選單配置
    searchArray: [
     {
      name: 'personName',type: 'input',label: '使用者名稱',content: ''
     },{
      name: 'personName2',label: '使用者名稱2',content: ''
     }
    ]
   }
  },created() {
   // 監聽子元件傳參
   EventBus.$on('refreshDataForm',e => {
    this.refreshDataForm(e)
   })
  },destroyed() {
   // 銷燬子元件傳參監聽
   EventBus.$off('refreshDataForm')
  },methods: {
   // 監聽子元件操作
   refreshDataForm(e) {
    // 邏輯程式碼
    this.$forceUpdate()
   },// 資料查詢
   handleQuery() {
     // 獲取元件引數返回json格式
    let searchArray = this.$refs.searchArray.getDataForm()
    // 如果存在必填項,返回值為null,此時有彈窗提示
    if (!searchArray) {
     return 
    }
    // 查詢介面邏輯
   }
  }
 }
</script>

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。