我正在尝试点击按钮时过滤数据。
我已经成功过滤了控制台日志中的数据,但是我不知道如何返回该数据。
这是我使用的方法:
<script>
export default {
name: 'allevents',
components: {
},
data: () => ({
date: new Date().toISOString().substr(0, 10),
menu2: true,
project:projects
}),
data() {
return {
projects: [
{ cate: 'Technical', title: 'Top 10 Australian beaches', date: '2019-10-25', name: 'Whitehaven Beach', place: 'Whitsunday Island, Whitsunday Islands', sorce: 'https://cdn.vuetifyjs.com/images/cards/docks.jpg'},
{ cate: 'Sports', title: 'Top 10 Australian beaches', date: '2019-11-5', name: 'Whitehaven Beach', place: 'Block 14, Near Tuck Shop', sorce: 'https://cdn.vuetifyjs.com/images/cards/house.jpg'},
{ cate: 'Music', title: 'Top 10 Australian beaches', date: '2020-01-7', name: 'Whitehaven Beach', place: 'Block 14, Near Tuck Shop', sorce: 'https://cdn.vuetifyjs.com/images/cards/road.jpg'},
{ cate: 'Creative', title: 'Top 10 Australian beaches', date: '2019-11-3', name: 'Whitehaven Beach', place: 'Block 14, Near Tuck Shop', sorce: 'https://cdn.vuetifyjs.com/images/cards/plane.jpg'},
{ cate: 'Sports', title: 'Top 10 Australian beaches', date: '2019-10-20', name: 'Whitehaven Beach', place: 'Block 14, Near Tuck Shop', sorce: 'https://cdn.vuetifyjs.com/images/cards/house.jpg'},
{ cate: 'Music', title: 'Top 10 Australian beaches', date: '2019-11-5', name: 'Whitehaven Beach', place: 'Block 14, Near Tuck Shop', sorce: 'https://cdn.vuetifyjs.com/images/cards/road.jpg'},
{ cate: 'Adventure', title: 'Top 10 Australian beaches', date: '2019-12-14', name: 'Whitehaven Beach', place: 'Block 14, Near Tuck Shop', sorce: 'https://cdn.vuetifyjs.com/images/cards/plane.jpg'},
{ cate: 'Sports', title: 'Top 10 Australian beaches', date: '2020-03-12', name: 'Whitehaven Beach', place: 'Block 14, Near Tuck Shop', sorce: 'https://cdn.vuetifyjs.com/images/cards/house.jpg'},
{ cate: 'Music', title: 'Top 10 Australian beaches', date: '2019-11-9', name: 'Whitehaven Beach', place: 'Block 14, Near Tuck Shop', sorce: 'https://cdn.vuetifyjs.com/images/cards/road.jpg'},
{ cate: 'Adventure', title: 'Top 10 Australian beaches', date: '2019-10-26', name: 'Whitehaven Beach', place: 'Block 14, Near Tuck Shop', sorce: 'https://cdn.vuetifyjs.com/images/cards/plane.jpg'},
{ cate: 'Sports', title: 'Top 10 Australian beaches', date: '2019-09-21', name: 'Whitehaven Beach', place: 'Block 14, Near Tuck Shop', sorce: 'https://cdn.vuetifyjs.com/images/cards/house.jpg'},
{ cate: 'Music', title: 'Top 10 Australian beaches', date: '2019-08-15', name: 'Whitehaven Beach', place: 'Block 14, Near Tuck Shop', sorce: 'https://cdn.vuetifyjs.com/images/cards/road.jpg'},
{ cate: 'Creative', title: 'Top 10 Australian beaches', date: '2019-11-11', name: 'Whitehaven Beach', place: 'Block 14, Near Tuck Shop', sorce: 'https://cdn.vuetifyjs.com/images/cards/plane.jpg'},
{ cate: 'Sports', title: 'Top 10 Australian beaches', date: '2019-11-17', name: 'Whitehaven Beach', place: 'Block 14, Near Tuck Shop', sorce: 'https://cdn.vuetifyjs.com/images/cards/house.jpg'},
{ cate: 'Music', title: 'Top 10 Australian beaches', date: '2019-12-04', name: 'Whitehaven Beach', place: 'Block 14, Near Tuck Shop', sorce: 'https://cdn.vuetifyjs.com/images/cards/road.jpg'},
{ cate: 'Creative', title: 'Top 10 Australian beaches', date: '2020-05-05', name: 'Whitehaven Beach', place: 'Block 14, Near Tuck Shop', sorce: 'https://cdn.vuetifyjs.com/images/cards/plane.jpg'},
],
}
clicked: false
},
methods: {
filter(event){
if(event.target.innerText.toLowerCase() != 'all'){
console.log(this.projects.filter(({cate})=>cate.toLowerCase() == event.target.innerText.toLowerCase()));
} else {
console.log(this.projects)
}
},
},
}
</script>
这是HTML。
在这里,我通过将v卡传递到数组中来创建了v卡(正在使用vue vutify)。
<template>
<div class="allevents ">
<div class="ma-2">
<v-row class="text-center ma-3">
<v-content
class="d-flex pa-2 text-center"
>
<v-hover v-slot:default="{ hover }">
<v-btn @click="filter($event)" :elevation="hover ? 20 : 4" outlined color="indigo">All</v-btn>
</v-hover>
<v-hover v-slot:default="{ hover }">
<v-btn @click="filter($event)" :elevation="hover ? 20 : 4" class="ma-2" outlined color="indigo">Adventure</v-btn>
</v-hover>
<v-hover v-slot:default="{ hover }">
<v-btn @click="filter($event)" :elevation="hover ? 20 : 4" class="ma-2" outlined color="indigo">Creative</v-btn>
</v-hover>
<v-hover v-slot:default="{ hover }">
<v-btn @click="filter($event)" :elevation="hover ? 20 : 4" class="ma-2" outlined color="indigo">Entertainment</v-btn>
</v-hover>
<v-hover v-slot:default="{ hover }">
<v-btn @click="filter($event)" :elevation="hover ? 20 : 4" class="ma-2" outlined color="indigo">Startups</v-btn>
</v-hover>
<v-hover v-slot:default="{ hover }">
<v-btn @click="filter($event)" :elevation="hover ? 20 : 4" class="ma-2" outlined color="indigo">Gaming </v-btn>
</v-hover>
<v-hover v-slot:default="{ hover }">
<v-btn @click="filter($event)" :elevation="hover ? 20 : 4" class="ma-2" outlined color="indigo">Technical</v-btn>
</v-hover>
<v-hover v-slot:default="{ hover }">
<v-btn @click="filter($event)" :elevation="hover ? 20 : 4" class="ma-2" outlined color="indigo">Sports</v-btn>
</v-hover>
<v-hover v-slot:default="{ hover }">
<v-btn @click="filter($event)" :elevation="hover ? 20 : 4" class="ma-2" outlined color="indigo">Music</v-btn>
</v-hover>
</v-content>
</v-row>
</div>
<div class="ma-2" >
<v-row class="text-center ma-3">
<v-content
class="d-flex pa-2 text-center">
<v-hover v-slot:default="{ hover }">
<v-btn class="ma-2" :elevation="hover ? 20 : 4" outlined color="indigo" >All</v-btn>
</v-hover>
<v-hover v-slot:default="{ hover }">
<v-btn class="ma-2" :elevation="hover ? 20 : 4" outlined color="indigo" >Today</v-btn>
</v-hover>
<v-hover v-slot:default="{ hover }">
<v-btn class="ma-2" :elevation="hover ? 20 : 4" outlined color="indigo" >Tomorrow</v-btn>
</v-hover>
<v-hover v-slot:default="{ hover }">
<v-btn class="ma-2" :elevation="hover ? 20 : 4" outlined color="indigo" >Weekend</v-btn>
</v-hover>
</v-content>
</v-row>
</div >
<div class="ma-2">
<v-row class="ma-3" >
<v-col cols="40" sm="6" md="2" class="">
<v-menu
v-model="menu2"
:close-on-content-click="true"
:nudge-right="30"
transition="scale-transition"
offset-y
min-width="290px"
>
<template v-slot:activator="{ on }">
<v-text-field
v-model="date"
label="Date"
prepend-icon="event"
readonly
v-on="on"
></v-text-field>
</template>
<v-date-picker v-model="date" @input="menu2 = false"
></v-date-picker>
</v-menu>
</v-col>
</v-row>
</div>
<v-row class="justify-center ma-6" >
<v-content
v-for="project in projects"
:key="project"
class="pa-3"
>
<v-hover v-slot:default="{ hover }">
<v-card
class="ma-auto "
max-width="400"
:elevation="hover ? 24 : 4"
>
<v-img
class="white--text"
max-height="200px"
:src="project.sorce"
>
<div align="right">
<v-chip
class="ma-2 text-uppercase font-weight-bold"
color="primary"
label
>
{{project.cate}}
</v-chip>
</div>
<v-card-title class="align-center fill-height" >{{ project.title }}</v-card-title>
</v-img>
<v-card-text>
<span>{{ project.date }}</span><br>
<span class="text--primary">
<span>{{ project.name }}</span><br>
<span>{{ project.place}}</span>
</span>
</v-card-text>
<v-card-actions>
<v-btn
text
color="orange"
@click="next"
>
Share
</v-btn>
<v-btn
text
color="orange"
>
Explore
</v-btn>
</v-card-actions>
</v-card>
</v-hover>
</v-content>
</v-row>
</div>
</template>
我想根据我单击的按钮过滤数据。
请帮助我找到一种过滤数据的方法。
答案 0 :(得分:0)
创建一个计算属性filteredProjects
和一个数据字段event
。在v-for中使用filteredProjects
显示项目,它将包含使用event
变量过滤的所有项目。
此外,您可能应该为event
或mounted()
中的created()
数据字段提供一个值,以便在初始化组件时它包含一个非空值。我在filteredProjects
中为此添加了一个空检查。
export default {
name: 'allevents',
components: {},
data: () => ({
date: new Date().toISOString().substr(0, 10),
menu2: true,
project: [
{ cate: 'Technical', title: 'Top 10 Australian beaches', date: '2019-10-25', name: 'Whitehaven Beach', place: 'Whitsunday Island, Whitsunday Islands', sorce: 'https://cdn.vuetifyjs.com/images/cards/docks.jpg'},
{ cate: 'Sports', title: 'Top 10 Australian beaches', date: '2019-11-5', name: 'Whitehaven Beach', place: 'Block 14, Near Tuck Shop', sorce: 'https://cdn.vuetifyjs.com/images/cards/house.jpg'},
{ cate: 'Music', title: 'Top 10 Australian beaches', date: '2020-01-7', name: 'Whitehaven Beach', place: 'Block 14, Near Tuck Shop', sorce: 'https://cdn.vuetifyjs.com/images/cards/road.jpg'},
{ cate: 'Creative', title: 'Top 10 Australian beaches', date: '2019-11-3', name: 'Whitehaven Beach', place: 'Block 14, Near Tuck Shop', sorce: 'https://cdn.vuetifyjs.com/images/cards/plane.jpg'},
{ cate: 'Sports', title: 'Top 10 Australian beaches', date: '2019-10-20', name: 'Whitehaven Beach', place: 'Block 14, Near Tuck Shop', sorce: 'https://cdn.vuetifyjs.com/images/cards/house.jpg'},
{ cate: 'Music', title: 'Top 10 Australian beaches', date: '2019-11-5', name: 'Whitehaven Beach', place: 'Block 14, Near Tuck Shop', sorce: 'https://cdn.vuetifyjs.com/images/cards/road.jpg'},
{ cate: 'Adventure', title: 'Top 10 Australian beaches', date: '2019-12-14', name: 'Whitehaven Beach', place: 'Block 14, Near Tuck Shop', sorce: 'https://cdn.vuetifyjs.com/images/cards/plane.jpg'},
{ cate: 'Sports', title: 'Top 10 Australian beaches', date: '2020-03-12', name: 'Whitehaven Beach', place: 'Block 14, Near Tuck Shop', sorce: 'https://cdn.vuetifyjs.com/images/cards/house.jpg'},
{ cate: 'Music', title: 'Top 10 Australian beaches', date: '2019-11-9', name: 'Whitehaven Beach', place: 'Block 14, Near Tuck Shop', sorce: 'https://cdn.vuetifyjs.com/images/cards/road.jpg'},
{ cate: 'Adventure', title: 'Top 10 Australian beaches', date: '2019-10-26', name: 'Whitehaven Beach', place: 'Block 14, Near Tuck Shop', sorce: 'https://cdn.vuetifyjs.com/images/cards/plane.jpg'},
{ cate: 'Sports', title: 'Top 10 Australian beaches', date: '2019-09-21', name: 'Whitehaven Beach', place: 'Block 14, Near Tuck Shop', sorce: 'https://cdn.vuetifyjs.com/images/cards/house.jpg'},
{ cate: 'Music', title: 'Top 10 Australian beaches', date: '2019-08-15', name: 'Whitehaven Beach', place: 'Block 14, Near Tuck Shop', sorce: 'https://cdn.vuetifyjs.com/images/cards/road.jpg'},
{ cate: 'Creative', title: 'Top 10 Australian beaches', date: '2019-11-11', name: 'Whitehaven Beach', place: 'Block 14, Near Tuck Shop', sorce: 'https://cdn.vuetifyjs.com/images/cards/plane.jpg'},
{ cate: 'Sports', title: 'Top 10 Australian beaches', date: '2019-11-17', name: 'Whitehaven Beach', place: 'Block 14, Near Tuck Shop', sorce: 'https://cdn.vuetifyjs.com/images/cards/house.jpg'},
{ cate: 'Music', title: 'Top 10 Australian beaches', date: '2019-12-04', name: 'Whitehaven Beach', place: 'Block 14, Near Tuck Shop', sorce: 'https://cdn.vuetifyjs.com/images/cards/road.jpg'},
{ cate: 'Creative', title: 'Top 10 Australian beaches', date: '2020-05-05', name: 'Whitehaven Beach', place: 'Block 14, Near Tuck Shop', sorce: 'https://cdn.vuetifyjs.com/images/cards/plane.jpg'},
],
event: null,
clicked: false
}),
computed:
{
filteredProjects()
{
if(this.event != null && this.event.target.innerText.toLowerCase() != 'all')
{
return this.projects.filter(({cate})=>cate.toLowerCase() == this.event.target.innerText.toLowerCase());
}
else
{
return this.projects;
}
}
},
methods:
{
filter(event)
{
this.event = event;
}
}
}
PS:我不明白为什么您有两个单独的数据功能,所以我将它们合并为一个。 :)
编辑:查看计算的属性here。简而言之,它们的行为与普通属性(您在data
中定义的属性)相同,但是它们的值是由函数计算的,并且只要它们的任何依赖项发生更改,它们就会更新。例如:
data: () => ({
a: 4,
}),
computed:
{
b()
{
return this.a * 2;
}
},
methods:
{
print()
{
console.log(this.b);
}
}
this.b
更改时,a
的值将更新。
如果您呼叫print()
,它将输出8。
如果将a
设置为6,然后调用print()
,它将输出12。
此外,请记住,您无法执行this.b = 14
。计算的属性是只读的。