vue+element自定義查詢元件
阿新 • • 發佈:2021-09-29
本文主要介紹專案,在引入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 "@/assets/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.comdata.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>
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。