下面是“vue实现前端列表多条件筛选”的完整攻略:
准备工作
首先需要引入Vue.js和element-ui组件库。除此之外,还需要一个数据列表和一个查询条件对象。
实现步骤
1. 查询条件的展示
使用element-ui组件库提供的Form组件渲染查询表单。每个查询条件使用FormItem包装,FormItem的label属性即为查询条件的名称,Prop属性指定了该查询条件在查询条件对象中的属性名称。例如,要实现一个“用户名”查询条件,可以这样写:
<el-form-item label="用户名" prop="username">
<el-input v-model="queryForm.username"></el-input>
</el-form-item>
这里的queryForm是查询条件对象,在data()中预先定义。
2. 把查询条件传递给后端进行查询
使用axios等网络请求库向后端发送查询请求。把查询条件对象作为请求参数传递给后端,在后端进行查询,返回查询结果。这里需要注意,在axios请求中需要进行queryForm对象的序列化。可以使用qs.stringify方法实现:
axios.get('/api/list', {
params: qs.stringify(this.queryForm)
}).then((res) => {
// res为返回的查询结果
})
这里的/api/list是后端接受查询请求的接口。
3. 实现查询条件的重置
使用element-ui提供的Form组件二次封装来实现查询条件的重置。每个FormItem都需要指定一个ref属性,例如:
<el-form-item label="用户名" prop="username" ref="username">
<el-input v-model="queryForm.username"></el-input>
</el-form-item>
然后在methods里面封装一个resetForm方法,在这个方法里面遍历所有FormItem的ref属性,调用FormItem的resetField方法来实现Form组件的重置:
methods: {
resetForm() {
Object.keys(this.$refs).forEach((key) => {
if (this.$refs[key][0] instanceof Vue.$options.components.ElFormItem) {
this.$refs[key][0].resetField();
}
});
}
}
4. 实现多条件筛选
每个FormItem的change事件可以用来进行多条件筛选。在change事件里面重新发送查询请求,以获取符合所有条件的查询结果:
<el-form-item label="用户名" prop="username" ref="username">
<el-input v-model="queryForm.username" @change="submitQuery"></el-input>
</el-form-item>
在methods里面封装一个submitQuery方法,在这个方法里面执行axios请求,获取查询结果。
示例
示例1
通过Vue实现一个简单的三条件筛选:
<template>
<div>
<el-form :inline="true" :model="queryForm" label-width="100px">
<el-form-item label="用户名" prop="username">
<el-input v-model="queryForm.username" @change="submitQuery"></el-input>
</el-form-item>
<el-form-item label="邮箱" prop="email">
<el-input v-model="queryForm.email" @change="submitQuery"></el-input>
</el-form-item>
<el-form-item label="年龄区间">
<el-input-number v-model="queryForm.age_min" :min="0"></el-input-number>
<span> 至 </span>
<el-input-number v-model="queryForm.age_max" :min="0"></el-input-number>
<el-button type="primary" @click="submitQuery">查询</el-button>
<el-button @click="resetForm">重置</el-button>
</el-form-item>
</el-form>
<el-table :data="tableData" style="width: 100%;">
<el-table-column prop="username" label="用户名"></el-table-column>
<el-table-column prop="email" label="邮箱"></el-table-column>
<el-table-column prop="age" label="年龄"></el-table-column>
<el-table-column prop="status" label="状态"></el-table-column>
</el-table>
</div>
</template>
<script>
import axios from 'axios';
import qs from 'qs';
export default {
name: 'List',
components: {
},
data() {
return {
queryForm: {
username: '',
email: '',
age_min: null,
age_max: null,
},
tableData: [],
};
},
methods: {
submitQuery() {
axios.get('/api/search', {
params: qs.stringify(this.queryForm)
}).then((res) => {
this.tableData = res.data.list;
});
},
resetForm() {
Object.keys(this.$refs).forEach((key) => {
if (this.$refs[key][0] instanceof Vue.$options.components.ElFormItem) {
this.$refs[key][0].resetField();
}
});
this.queryForm = {
username: '',
email: '',
age_min: null,
age_max: null,
};
},
},
mounted() {
this.submitQuery();
}
};
</script>
要求后端接口接受查询请求的参数:
{
username: '', // 查询用户名
email: '', // 查询邮箱
age_min: null, // 年龄最小值
age_max: null, // 年龄最大值
}
后端查询结果返回格式:
{
total: 50, // 总数
list: [{ // 数据列表
username: 'admin', // 用户名
email: 'admin@admin.com', // 邮箱
age: 20, // 年龄
status: 'normal', // 状态
}],
}
示例2
通过Vue实现一个按条件查询文章列表的示例:
<template>
<div>
<el-form :inline="true" :model="queryForm" label-width="100px">
<el-form-item label="标题" prop="title">
<el-input v-model="queryForm.title" @change="submitQuery"></el-input>
</el-form-item>
<el-form-item label="分类" prop="category">
<el-select v-model="queryForm.category" @change="submitQuery">
<el-option label="全部" value=""></el-option>
<el-option label="前端" value="frontend"></el-option>
<el-option label="后端" value="backend"></el-option>
</el-select>
</el-form-item>
<el-form-item label="标签" prop="tags">
<el-select v-model="queryForm.tags" multiple @change="submitQuery">
<el-option label="Vue.js" value="vue"></el-option>
<el-option label="React" value="react"></el-option>
<el-option label="Angular" value="angular"></el-option>
</el-select>
</el-form-item>
<el-form-item label="发布时间" prop="time">
<el-date-picker type="daterange" v-model="queryForm.time" @change="submitQuery"></el-date-picker>
<el-button type="primary" @click="submitQuery">查询</el-button>
<el-button @click="resetForm">重置</el-button>
</el-form-item>
</el-form>
<el-table :data="tableData" style="width: 100%;">
<el-table-column prop="title" label="标题"></el-table-column>
<el-table-column prop="category" label="分类"></el-table-column>
<el-table-column prop="tags" label="标签">
<template v-slot="{ row }">
<el-tag v-for="tag in row.tags" :key="tag">{{ tag }}</el-tag>
</template>
</el-table-column>
<el-table-column prop="time" label="发布时间"></el-table-column>
</el-table>
</div>
</template>
<script>
import axios from 'axios';
import qs from 'qs';
export default {
name: 'List',
components: {
},
data() {
return {
queryForm: {
title: '',
category: '',
tags: [],
time: '',
},
tableData: [],
};
},
methods: {
submitQuery() {
axios.get('/api/search', {
params: qs.stringify(this.queryForm)
}).then((res) => {
this.tableData = res.data.list;
});
},
resetForm() {
Object.keys(this.$refs).forEach((key) => {
if (this.$refs[key][0] instanceof Vue.$options.components.ElFormItem) {
this.$refs[key][0].resetField();
}
});
this.queryForm = {
title: '',
category: '',
tags: [],
time: '',
};
},
},
mounted() {
this.submitQuery();
}
};
</script>
要求后端接口接受查询请求的参数:
{
title: '', // 查询标题
category: '', // 查询分类
tags: [], // 查询标签
time: '', // 发布时间
}
后端查询结果返回格式:
{
total: 50, // 总数
list: [{ // 数据列表
title: 'Vue.js 入门教程', // 标题
category: 'frontend', // 分类
tags: ['vue', 'javascript'], // 标签
time: '2022-01-01 12:00:00', // 发布时间
}],
}
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue实现前端列表多条件筛选 - Python技术站