vue+element自定义查询组件
短信预约 -IT技能 免费直播动态提醒
本文主要介绍vue项目,在引入element的前提下,对组件进行二次封装实现通过配置项直接布局。
一、查询条件组件化
结合EventBus.js的使用,传递事件更高效,可以避免各种复杂的生命周期依赖关系。
在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: {
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': 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,
default: 8
},
// 默认栅栏布局 16/24
contentSpan: {
type: Number,
default: 16
},
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布局标题垂直居中
.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() {
// 监听子组件传参
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>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341