1. 简介
Vue是一个流行的JavaScript框架,用于构建用户界面和单页应用程序(SPA),而Element-UI是一个基于Vue的UI框架。它提供了各种UI组件和工具,可用于用于快速构建漂亮且易于使用的用户界面。在本文中,我们将使用Vue和Element-UI来演示如何对数据进行筛选和排序。
2. 数据格式
要演示数据筛选和排序,我们将使用以下图书数据作为示例:
const books = [
{ title: '《Vue.js实战》', author: '梁灏', price: 79.0, pubdate: '2018-03-01' },
{ title: '《JavaScript高级程序设计》', author: 'Nicholas C. Zakas', price: 99.0, pubdate: '2013-03-01' },
{ title: '《Node.js开发指南》', author: 'BYVoid', price: 89.0, pubdate: '2012-06-01' },
{ title: '《CSS揭秘》', author: 'Lea Verou', price: 78.0, pubdate: '2015-08-01' },
{ title: '《HTML5与CSS3基础教程》', author: '廖凡', price: 69.0, pubdate: '2014-06-01' },
{ title: '《React Native入门与实战》', author: '顾伟伟', price: 79.0, pubdate: '2016-06-01' },
{ title: '《深入浅出Node.js》', author: '朴灵', price: 59.0, pubdate: '2013-07-01' },
{ title: '《编写高质量代码:Web前端开发修炼之道》', author: '郑晓峰', price: 56.0, pubdate: '2018-05-01' },
{ title: '《JavaScript设计模式与开发实践》', author: '曾探', price: 59.0, pubdate: '2015-06-01' },
{ title: '《ECMAScript 6 入门》', author: '阮一峰', price: 58.0, pubdate: '2015-09-01' }
]
这个数据包含10本书的信息,包括书名、作者、价格和出版日期。我们将使用这些数据进行筛选和排序。
3. 数据筛选
3.1 筛选组件的设计
我们将使用Element-UI的<Input>
组件和<Button>
组件来创建筛选工具栏:
<template>
<div class="filter-bar">
<el-input
v-model="keyword"
placeholder="请输入关键字"
class="filter-input"
clearable
@clear="handleFilter">
</el-input>
<el-button
type="primary"
icon="el-icon-search"
@click="handleFilter">
筛选
</el-button>
</div>
</template>
<script>
export default {
data() {
return {
keyword: ''
}
},
methods: {
handleFilter() {
this.$emit('filter', this.keyword.trim())
}
}
}
</script>
<style scoped>
.filter-bar {
margin-bottom: 15px;
}
.filter-input {
width: 240px;
}
</style>
在这个组件中,我们创建了一个输入框来输入关键字,并创建了一个筛选按钮来启动筛选操作。当点击筛选按钮时,我们将关键字作为参数通过$emit
事件发送到父组件中。
3.2 筛选操作的实现
在使用筛选组件时,我们需要在父组件中处理筛选操作。我们为父组件创建了一个<Result>
组件来显示筛选结果:
<template>
<div>
<filter-bar
@filter="handleFilter">
</filter-bar>
<result
:books="filteredBooks">
</result>
</div>
</template>
<script>
import FilterBar from './FilterBar.vue'
import Result from './Result.vue'
export default {
components: { FilterBar, Result },
data() {
return {
books: [...]
}
},
computed: {
filteredBooks() {
return this.books.filter(book => {
const keyword = this.keyword.toLowerCase()
const title = book.title.toLowerCase()
const author = book.author.toLowerCase()
return title.indexOf(keyword) > -1 || author.indexOf(keyword) > -1
})
}
},
methods: {
handleFilter(keyword) {
this.keyword = keyword
}
}
}
</script>
在父组件中,我们创建了一个books
数组来保存所有的图书数据。我们使用计算属性filteredBooks
来返回筛选后的图书数据。在计算属性中,我们使用filter
方法来过滤books
数组,只保留满足搜索关键字的项。
为了实现筛选操作,我们必须监测输入框中的关键字变化。对于这个目的,我们在FilterBar组件中使用了v-model
来绑定输入框的值,并在点击筛选按钮时通过$emit
事件将关键字发送到父组件中。通过这种方式,我们可以实时地更新计算属性中的关键字,从而动态地更新筛选结果。
4. 数据排序
4.1 排序组件的设计
我们将使用Element-UI的<Select>
组件来创建排序工具栏:
<template>
<el-select
v-model="sortOrder"
placeholder="请选择排序方式"
class="sort-selector">
<el-option
v-for="option in options"
:key="option.value"
:label="option.label"
:value="option.value">
</el-option>
</el-select>
</template>
<script>
export default {
data() {
return {
sortOrder: '',
options: [
{ label: '按价格升序排列', value: 'priceAsc' },
{ label: '按价格降序排列', value: 'priceDesc' },
{ label: '按出版日期升序排列', value: 'pubdateAsc' },
{ label: '按出版日期降序排列', value: 'pubdateDesc' }
]
}
},
watch: {
sortOrder() {
this.$emit('sort', this.sortOrder)
}
}
}
</script>
<style scoped>
.sort-selector {
width: 200px;
}
</style>
在这个组件中,我们创建了一个下拉菜单来选择排序方式,并使用v-model
来绑定选中项。当选中项发生变化时,我们将进行排序操作,并将排序方式作为参数通过$emit
事件发送到父组件中。
4.2 排序操作的实现
在使用排序组件时,我们需要在父组件中处理排序操作。我们可以使用计算属性来返回排序后的图书数据:
<template>
<div>
<sort-selector
@sort="handleSort">
</sort-selector>
<result
:books="sortedBooks">
</result>
</div>
</template>
<script>
import SortSelector from './SortSelector.vue'
import Result from './Result.vue'
export default {
components: { SortSelector, Result },
data() {
return {
books: [...],
sortOrder: ''
}
},
computed: {
sortedBooks() {
const comparator = this.getComparator(this.sortOrder)
return this.books.slice().sort(comparator)
}
},
methods: {
handleSort(sortOrder) {
this.sortOrder = sortOrder
},
getComparator(sortOrder) {
switch (sortOrder) {
case 'priceAsc':
return (a, b) => a.price - b.price
case 'priceDesc':
return (a, b) => b.price - a.price
case 'pubdateAsc':
return (a, b) => new Date(a.pubdate) - new Date(b.pubdate)
case 'pubdateDesc':
return (a, b) => new Date(b.pubdate) - new Date(a.pubdate)
default:
return undefined
}
}
}
}
</script>
在父组件中,我们创建了一个sortOrder
变量来保存排序方式。在计算属性sortedBooks
中,我们使用slice
方法复制books
数组,并使用sort
方法对复制的数组进行排序,从而避免对原始数组进行改动。
为了实现排序操作,我们必须监测下拉菜单中的选中项变化。对于这个目的,我们在SortSelector组件中使用了v-model
来绑定选中项,并在选中项变化时通过$emit
事件将排序方式发送到父组件中。通过这种方式,我们可以实时地更新计算属性中的排序方式,从而动态地更新排序结果。
5. 总结
在本文中,我们演示了如何使用Vue和Element-UI来进行数据筛选和排序。我们通过创建筛选组件和排序组件,并在父组件中实现筛选和排序操作,来动态地更新计算属性中的数据。使用Vue和Element-UI可以让我们快速地构建漂亮且易于使用的数据筛选和排序功能。