首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用组件和v-bind筛选Vue中的posts :类

如何使用组件和v-bind筛选Vue中的posts :类
EN

Stack Overflow用户
提问于 2020-04-12 04:02:46
回答 1查看 248关注 0票数 1

我试着用我从这里得到的笔做一个例子:https://codepen.io/conradolandia/pen/YzyPmrv

但是我想使用vue路由器,我已经尝试过了:(pen:https://codepen.io/conradolandia/pen/vYNERPW)

HTML:

代码语言:javascript
复制
<main class="wrap">
    <div id="app">
        <router-view></router-view>
    </div>
</main>

<template id="post-list-template">
    <div class="container">
        <div class="row">
            <h4>Filter by album:</h4>
            <div class="filters">
                <button class="btn" v-bind:class="{ active: currentFilter === 'ALL' }" v-on:click="setFilter('ALL')">all</button>
                <button class="btn" v-bind:class="{ active: currentFilter === 'art' }" v-on:click="setFilter('art')">art</button>
                <button class="btn" v-bind:class="{ active: currentFilter === 'doodles' }" v-on:click="setFilter('doodles')">doodles</button>
                <button class="btn" v-bind:class="{ active: currentFilter === 'workshops' }" v-on:click="setFilter('workshops')">workshops</button>
            </div>
        </div>
        <div class="columns is-multiline">
            <div class="column is-3" v-if="currentFilter === post.category || currentFilter === 'ALL'" v-bind:key="post.title" v-for="post in posts">
                <div class="card post">
                    <img class="card-img-top" v-bind:src="post.image">
                    <div class="card-body">
                        <div class="card-title">{{ post.title }}</div>
                        <small class="tags">{{ post.category }}</small>
                    </div>
                </div> <!-- .post -->
            </div> <!-- .col-md-4 -->
        </div> <!-- .row -->
    </div> <!-- .container -->
</template>

CSS:

代码语言:javascript
复制
body{
    background-color: #ccc;
    box-sizing:border-box;
    -webkit-box-sizing:border-box;
    -moz-box-sizing:border-box;
}

.post {
    margin-bottom: 20px;
}

.post img{ width: 100%;}

.tags {background-color: #ccc; padding: 3px 5px;}

.filters {
    margin-bottom: 20px;
}

联署材料:

代码语言:javascript
复制
var postList = Vue.extend({

    template: "#post-list-template",

    data: function(){
        return {
            currentFilter:'ALL',
            posts: [
                {title: "Artwork", image: "https://picsum.photos/g/200?image=122", category: 'art'},
                {title: "Charcoal", image: "https://picsum.photos/g/200?image=116", category: 'art'},
                {title: "Sketching", image: "https://picsum.photos/g/200?image=121", category: 'doodles'},
                {title: "Acrillic", image: "https://picsum.photos/g/200?image=133", category: 'workshops'},
                {title: "Pencil", image: "https://picsum.photos/g/200?image=134", category: 'doodles'},
                {title: "Pen", image: "https://picsum.photos/g/200?image=115", category: 'art'},
                {title: "Inking", image: "https://picsum.photos/g/200", category: 'workshops'},
                {title: "Artwork", image: "https://picsum.photos/g/200?image=121", category: 'art'},
                {title: "Charcoal", image: "https://picsum.photos/g/200?image=115", category: 'art'},
                {title: "Sketching", image: "https://picsum.photos/g/200?image=124", category: 'doodles'},
                {title: "Acrillic", image: "https://picsum.photos/g/200?image=13", category: 'workshops'},
                {title: "Pencil", image: "https://picsum.photos/g/200?image=14", category: 'doodles'},
            ]
        }
    },
    methods: {
        setFilter: function(filter) {
            this.currentFilter = filter;
        }
    },
})

// Start a new instance of router (instead of router.map)
var router = new VueRouter({
    routes: [
        { path: '/', component: postList }
    ]
})

// Start a new instance of the Application required (instead of router.start)
new Vue({
    el: '#app',
    router: router,
})

到目前为止,还没有运气。过滤类工作,第一次单击I就激活了一个筛选选项,但随后所有过滤器都停止工作,火狐抱怨说"TypeError: e是未定义的“。

有人能给我指明正确的方向吗?我不明白为什么第一个代码链接工作,但第二个不工作。

澄清:当我点击任何过滤器,过滤某种工作,但如果我点击“所有”过滤器,一切停止工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-12 04:09:42

尝试使用计算函数

代码语言:javascript
复制
computed:{
  filteredPosts:function(){
    if(this.currentFilter==='ALL'){
       return this.posts;
    }
    return this.posts.filter(post=>{
      return post.category === this.currentFilter;
    })
  }
}

循环时可以使用filteredPosts而不是posts

代码语言:javascript
复制
    <div class="columns is-multiline">
        <div class="column is-3" :key="post.title" v-for="post in filteredPosts">
            <div class="card post">
                <img class="card-img-top" :src="post.image">
                <div class="card-body">
                    <div class="card-title">{{ post.title }}</div>
                    <small class="tags">{{ post.category }}</small>
                </div>
            </div> <!-- .post -->
        </div> <!-- .col-md-4 -->
    </div> <!-- .row -->

您不需要在循环时使用任何条件,因为computed函数将完成这项工作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61166696

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档