最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue+element自定義查詢組件

 更新時間:2021年09月29日 08:54:02   作者:吳維煒  
這篇文章主要為大家詳細介紹了vue+element自定義查詢組件,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文主要介紹vue項目,在引入element的前提下,對組件進行二次封裝實現(xiàn)通過配置項直接布局。

一、查詢條件組件化

結(jié)合EventBus.js的使用,傳遞事件更高效,可以避免各種復(fù)雜的生命周期依賴關(guān)系。
components/dataForm文件夾下dataForm.vue作為組件集合的載體,并創(chuàng)建配置項

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 "@/assets/js/eventBus.js"
import InputForm "@/components/dataForm/InputForm"
export default {
  components: {
    InputForm,
  },
  props: {
    /**
     * 表單配置項
     * @param {Object} option 配置參數(shù),具體如下:
     * type: 表單項類型,String, 可選值input
     */
    options: {
      type: Array,
      default() {
        return [];
      },
    },
  },
  data() {
   return {}
  },
  created() {
   // 此處主要是為了實現(xiàn)下拉框?qū)ζ渌咏M件的顯示和隱藏
    EventBus.$on("refreshDataForm", e => {
      this.refreshDataForm(e);
    });
  },
  // 頁面銷毀 事件銷毀
  beforeDestroy() {
    EventBus.$off("refreshDataForm")
    EventBus.$off("handleClick")
  },
  methods: {
   // 更新表單數(shù)據(jù)
    refreshDataForm(item) {
      let data = this.options
      data.forEach((e, i) => {
        if (item.type == e.type && item.name == e.name) {
          this.options[i] = item
        }
      })
    },
    // 子組件點擊事件響應(yīng)父組件,數(shù)據(jù)傳遞
    handleClick(data) {
     EventBus.$emit("handleClick",data)
    },
    // 表單數(shù)據(jù)格式化 (可以對是否必填項目做必填校驗)
    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) { // 刪除附件集合及自定義名稱和默認(rèn)名稱
          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': 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'
  },
  // 默認(rèn)柵欄布局 8/24
  boxSpan: {
   type: Number,
   default: 8
  },
  // 默認(rèn)柵欄布局 24/24
  infoSpan: {
   type: Number,
   default: 24
  },
  // 默認(rèn)柵欄布局 8/24
  spanSpan: {
   type: Number,
   default: 8
  },
  // 默認(rèn)柵欄布局 16/24
  contentSpan: {
   type: Number,
   default: 16
  },
  /**
  * name 關(guān)鍵字
  * type 表單類型
  * label 表單標(biāo)題
  * content 表單內(nèi)容
  * readOnly 是否只讀 默認(rèn)否
  * isHide 是否隱藏 默認(rèn)否
  * textarea 是否文本類型 默認(rèn)否
  **/
  data: {
   type: Object,
   default() {
    return []
   }
  }
 },
 computed: {
  setPlaceholder() {
   if(this.data.readOnly && !this.data.content) {
    return ''
   } 
   return '請輸入'
  }
 }
}
</script>
<style scoped>
 // 必填樣式
 .require::after {
  content: '*';
  color:red;
 }
 // flex布局標(biāo)題垂直居中
 .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',
      type: 'input',
      label: '用戶名2',
      content: ''
     }
    ]
   }
  },
  created() {
   // 監(jiān)聽子組件傳參
   EventBus.$on('refreshDataForm', e => {
    this.refreshDataForm(e)
   })
  },
  destroyed() {
   // 銷毀子組件傳參監(jiān)聽
   EventBus.$off('refreshDataForm')
  },
  methods: {
   // 監(jiān)聽子組件操作
   refreshDataForm(e) {
    // 邏輯代碼
    this.$forceUpdate()
   },
   // 數(shù)據(jù)查詢
   handleQuery() {
     // 獲取組件參數(shù)返回json格式
    let searchArray = this.$refs.searchArray.getDataForm()
    // 如果存在必填項,返回值為null,此時有彈窗提示
    if (!searchArray) {
     return 
    }
    // 查詢接口邏輯
   }
  }
 }
</script>

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 使用vue3實現(xiàn)一個人喵交流小程序

    使用vue3實現(xiàn)一個人喵交流小程序

    Vue3 在經(jīng)過多個開發(fā)版本的迭代后,終于迎來了它的正式版本,下面這篇文章主要給大家介紹了關(guān)于如何使用vue3實現(xiàn)一個人喵交流小程序的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • Vue.js前端框架之事件處理小結(jié)

    Vue.js前端框架之事件處理小結(jié)

    這篇文章主要介紹了Vue.js前端框架之事件處理小結(jié),本文給大家介紹了v-on 指令的基本用法,通過實例講解的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • Vant picker選擇器設(shè)置默認(rèn)值導(dǎo)致選擇器失效的解決

    Vant picker選擇器設(shè)置默認(rèn)值導(dǎo)致選擇器失效的解決

    這篇文章主要介紹了Vant picker選擇器設(shè)置默認(rèn)值導(dǎo)致選擇器失效的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • 一文帶你了解Vue?和?React的區(qū)別

    一文帶你了解Vue?和?React的區(qū)別

    這篇文章主要介紹了Vue和React的區(qū)別,畢竟是兩個框架,不像兩個?API,要說細節(jié)上的區(qū)別就太多太多了,本文就簡單的帶大家說說Vue?和?React?的區(qū)別,需要的朋友可以參考下
    2023-05-05
  • 如何解決element-ui中select下拉框popper超出彈框問題

    如何解決element-ui中select下拉框popper超出彈框問題

    這篇文章主要介紹了如何解決element-ui中select下拉框popper超出彈框問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • vue開發(fā)中遇到的問題總結(jié)

    vue開發(fā)中遇到的問題總結(jié)

    在本篇文章里小編給大家分享的是關(guān)于vue開發(fā)中遇到的問題總結(jié),有興趣的朋友們可以學(xué)習(xí)參考下。
    2020-04-04
  • Vue3中v-slot的特性深度剖析

    Vue3中v-slot的特性深度剖析

    在Vue3架構(gòu)里,v-slot 作為作用域插槽的關(guān)鍵支撐,重塑了父子組件間數(shù)據(jù)與方法傳遞的范式,本文主要來和大家剖析一下v-slot的相關(guān)特性,需要的可以了解下
    2025-01-01
  • 詳解Vue3 Teleport 的實踐及原理

    詳解Vue3 Teleport 的實踐及原理

    這篇文章主要介紹了Vue3 Teleport 組件的實踐及原理,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • 用electron 打包發(fā)布集成vue2.0項目的操作過程

    用electron 打包發(fā)布集成vue2.0項目的操作過程

    這篇文章主要介紹了用electron 打包發(fā)布集成vue2.0項目的操作步驟,把electron 加入到自己項目中各種不兼容,升級版本踩坑無數(shù)個,今天通過本文給大家分享下詳細過程,需要的朋友可以參考下
    2022-10-10
  • Vue 與 Vuex 的第一次接觸遇到的坑

    Vue 與 Vuex 的第一次接觸遇到的坑

    在 Vue.js 的項目中,如果項目結(jié)構(gòu)簡單, 父子組件之間的數(shù)據(jù)傳遞可以使用 props 或者 $emit 等方式,如果是大型項目,很多時候都需要在子組件之間傳遞數(shù)據(jù),使用vue的狀態(tài)管理工具vuex很好的解決
    2018-08-08

最新評論

澄城县| 陆河县| 萨迦县| 社旗县| 平果县| 普宁市| 五原县| 五台县| 什邡市| 静海县| 达拉特旗| 横峰县| 县级市| 左贡县| 会东县| 内丘县| 竹山县| 佛冈县| 那曲县| 胶南市| 扎鲁特旗| 砚山县| 册亨县| 兴山县| 平江县| 西华县| 边坝县| 慈溪市| 宁南县| 吉木萨尔县| 青川县| 尉犁县| 漳平市| 呈贡县| 三明市| 灵山县| 慈溪市| 兖州市| 九寨沟县| 云阳县| 唐河县|