vue2动态查询条件

效果图:

全选:

手动勾选:

 清空:

上代码: 

首先公共样式在App.vue中:

* {
  margin: 0;
  padding: 0;
  font-size: 14px;
}
.row{
	display: flex;
	flex-direction: row;
	align-items: center;
}
.center{
	align-items: center;
	justify-content: center;
}
.space-between{
	justify-content: space-between;
}
.space-around{
	justify-content: space-around;
}
.flex-end{
	justify-content: flex-end;
}
.column{
	display: flex;
	flex-direction: column;
}
.wraps{
	flex-wrap: wrap;
}
.flex1{
	flex:1;
}
.flex2{
	flex:2;
}
.flex3{
	flex:3;
}

在vue2项目下新建页面dynmicQuery.vue文件:

<template>
	<div>
		<div class="column" style="min-height: 750px;">
			<div style="margin: 12px 0;">动态查询</div>
			<template>
				<filter-criteria :Object='ObjectList' @setQuery='query'></filter-criteria>
			</template>
			<template>
				<div class="row">
					<div v-for="(item,index) in datalist" :key="index" style="margin: 12px;">
						{{item.name}} :{{item.modelValue}}
					</div>
				</div>
			</template>
		</div>
	</div>
</template>

<script>
	import filterCriteria from '@/views/components/filterCriteria';
	export default {
		components:{
			filterCriteria
		},
		data() {
			return {
				ObjectList: [{
					name: '所属疗区', //左边名字
					type: 'selects', //类型:下拉选框 单选select 多选selects,输入框input,按钮button
					modelValue: [], //单选''多选[],输入框''
					placeholder: '请选择所属疗区', //提示文字
					default:true,//是否默认显示----用于筛选
					disabled:true,//是否必须选择的
					label: 'label', //对应select的optionList下的 key---> label
					value: 'value', //对应select的optionList下的 key---> value
					optionList: [{ //select的下拉框数据
						value: '选项1',//key---> value
						label: '疗养一区',//key---> label
						disabled: false//是否禁用选择
					}, {
						value: '选项2',
						label: '疗养二区',
						disabled: false
					}, {
						value: '选项5',
						label: '疗养三区',
						disabled: true,
					}]
				}, {
					name: '编号',
					type: 'input',
					modelValue: '',
					placeholder: '请输入编号',
					default:true,
					disabled:false,
					label: '',
					value: '',
					optionList: []
				}, {
					name: '姓名',
					type: 'input',
					modelValue: '',
					placeholder: '请输入姓名',
					default:true,
					disabled:false,
					label: '',
					value: '',
					optionList: []
				}, {
					name: '是否本单位',
					type: 'select',
					modelValue: '',
					placeholder: '请选择是否本单位',
					default:false,
					label: 'label',
					value: 'value',
					optionList: [{
						value: '1',
						label: '是',
						disabled: false
					}, {
						value: '2',
						label: '否',
						disabled: false
					}]
				}, {
					name: '联系方式',
					type: 'input',
					modelValue: '',
					placeholder: '请输入联系方式',
					default:false,
					disabled:false,
					label: '',
					value: '',
					optionList: []
				}, {
					name: '家属姓名',
					type: 'input',
					modelValue: '',
					placeholder: '请输入家属姓名',
					default:false,
					disabled:false,
					label: '',
					value: '',
					optionList: []
				}, {
					name: '在职状态',
					type: 'select',
					modelValue: '',
					placeholder: '请选择在职状态',
					default:false,
					label: 'label',
					value: 'value',
					optionList: [{
						value: '1',
						label: '在职',
						disabled: false
					}, {
						value: '2',
						label: '离职',
						disabled: false
					}, {
						value: '3',
						label: '待定',
						disabled: false
					}]
				},{
					name: '',
					type: 'button',
					modelValue: null,
					placeholder: null,
					default:false,
					disabled:false,
					label: '',
					value: '',
					optionList: [],
					buttonList:[
						{
							buttonName:'查询',
							clickName:'query',
							type:'primary',//''默认按钮,primary主要按钮,success成功按钮,info信息按钮,warning警告按钮,danger危险按钮
							noRegular:false,//是筛选按钮
						},
						{
							buttonName:'重置',
							clickName:'resetting',
							type:'danger',
							noRegular:false,
						},
						{
							buttonName:'+ 筛 选',
							type:'primary',
							noRegular:true,
						}
					]
				}, ],
				datalist:[],
			}
		},
		methods: {
			query(e) { //查询
				this.datalist = [...e]
			},
		}
	}
</script>

<style lang="scss" scoped>
</style>

本案例在/views/components下新建filterCriteria.vue文件和screenBtn.vue文件:

!!!filterCriteria.vue文件代码:

<template>
	<div class="header row wraps">
		<div class="row box_ul" v-for="(item,index) in ObjectList" :key="index"
			v-if="checkboxGroupList.includes(item.name) || item.type.includes('button')">
			<div class="title" v-if="item.name&& !item.type.includes('button')">
				{{item.name}}
			</div>
			<template v-if="item.type.includes('select')">
				<el-select v-model="item.modelValue" :multiple='item.type === "selects"' :placeholder="item.placeholder"
					size="mini" class="input" clearable collapse-tags>
					<el-option v-for="(date,idx) in item.optionList" :key="idx" :label="date[item.label]"
						:value="date[item.value]" :disabled="!!date.disabled"></el-option>
				</el-select>
			</template>
			<template v-if="item.type.includes('input')">
				<el-input v-model="item.modelValue" size="mini" :placeholder="item.placeholder" class="input"></el-input>
			</template>
			<template v-if="item.type.includes('button')">
				<div v-for="(date,idx) in item.buttonList" :key="idx" style="margin-right: 12px;">
					<template v-if="!date.noRegular">
						<el-button :type="date.type" size="mini" @click="query"
							v-if="date.clickName === 'query'">{{date.buttonName}}</el-button>
						<el-button :type="date.type" size="mini" @click="resetting"
							v-if="date.clickName === 'resetting'">{{date.buttonName}}</el-button>
					</template>
					<template v-else>
						<screen-btn :defaultList='defaultList' :allList='allList' :Inevitable='Inevitable'
							@change="changeScreenBtn">
						</screen-btn>
					</template>
				</div>
			</template>
		</div>
	</div>
</template>

<script>
	import screenBtn from '@/views/components/screenBtn';
	export default {
		components: {
			screenBtn
		},
		props: ['Object'],
		data() {
			return {
				ObjectList: JSON.parse(JSON.stringify(this.Object)),
				defaultList: [], //默认的
				Inevitable: [], //必须选择的
				allList: [], //全部的
				checkboxGroupList: [], //选择的
			}
		},
		created() {
			console.log(this.Object);
			this.Object.forEach(date => {
				if (date.name) {
					this.allList.push(date.name)
					if (date.default) {
						this.defaultList.push(date.name)
						this.checkboxGroupList.push(date.name)
						if (date.disabled) {
							this.Inevitable.push(date.name)
						}
					}
				}
			}) //默认的
		},
		methods: {
			query() { //查询
				let arr = []
				this.ObjectList.forEach(date => {
					if(date.type != 'button'){
						arr.push({
							name:date.name,
							modelValue:date.modelValue
						})
					}
				})
				this.$emit('setQuery',arr)
			},
			resetting() { //重置
				this.ObjectList = JSON.parse(JSON.stringify(this.Object))
			},
			changeScreenBtn(item) { //筛选查询条件
				this.checkboxGroupList = item
				this.resetting()
			},
		}
	}
</script>

<style lang="scss" scoped>
	.header {
		.box_ul {
			width: 23.333%;
			margin: 0 12px 12px 0;

			.title {
				margin-right: 12px;
				min-width: 70px;
				text-align: right;
			}

			.input {
				width: 260px;
			}
		}
	}
</style>

!!!screenBtn.vue文件代码:

<template>
	<div>
		<el-popover
			placement="bottom"
			trigger="hover"
			v-model="popoverValue">
			<div class="column">
				<div class="row">
					<el-button type="text" size="small" @click="operateBtn('all')">全选</el-button>
					<div style="width: 1px; height: 14px; background: #409eff;margin: 0 10px;"></div>
					<el-button type="text" size="small" @click="operateBtn('empty')">清空</el-button>
					<div style="width: 1px; height: 14px; background: #409eff;margin: 0 10px;"></div>
					<el-button type="text" size="small" @click="operateBtn('default')">默认</el-button>
				</div>
				<el-checkbox-group v-model="checkboxGroupList" size='mini' @change='changeGroup'>
					<div class="row checkboxli" v-for="item in checkboxList" :key="item">
						<el-checkbox :label="item" :disabled='checkboxInevitable.includes(item)'>{{item}}</el-checkbox>
					</div>
				</el-checkbox-group>
			</div>
			<el-button slot="reference" type="primary" size="mini">+ 筛 选</el-button>
		</el-popover>
	</div>
</template>

<script>
	export default {
		props:{
			defaultList:{
				type:Array,
				required: true,
				default:()=>[]
			},
			allList:{
				type:Array,
				required: true,
				default:()=>[]
			},
			Inevitable:{
				type:Array,
				required: true,
				default:()=>[]
			}
		},
		data() {
			return {
				popoverValue:false,
				checkboxGroupList:this.defaultList,//选择的
				checkboxList:this.allList,//全部数据
				checkboxInevitable:this.Inevitable,//必选的
			}
		},
		methods:{
			operateBtn(type){//全选
				if(type == 'all'){
					this.checkboxGroupList = this.allList
				}else if(type == 'empty'){
					this.checkboxGroupList = [...this.checkboxInevitable]
				}else{
					this.checkboxGroupList = this.defaultList
				}
				this.changeGroup()
			},
			changeGroup(){//;筛选多选框
				this.popoverValue = false
				this.$emit('change',this.checkboxGroupList)
			},
		}
	}
</script>

<style lang="scss" scoped>
	.checkboxli{
		margin: 10px 0;
	}
	::v-deep .el-checkbox{
		margin-right: 0;
	}
	::v-deep .el-checkbox__label{
		padding-left: 15px;
	}
</style>

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值