Vue.js为空过滤结果

And*_*lis 16 vue.js

在Vue中,我必须过滤一些数据:

<input v-model="search">
<ul>
    <li v-repeat="photo in photos | filterBy search in 'name'">
        <img src="{{ photo.src }}" alt="{{ photo.name }}">
    </li>
    <li v-if="!photos.length">
        No results, sorry!
    </li>
</ul>
Run Code Online (Sandbox Code Playgroud)

如何检测空的过滤器结果并向用户显示相应的消息?

编辑

我目前正在做以下工作,我觉得这是一个hacky解决方法:

HTML:

<input v-model="search">
<ul>
    <li v-repeat="photo in photos">
        <img src="{{ photo.src }}" alt="{{ photo.name }}">
    </li>
    <li v-if="!photos.length">
        No results, sorry!
    </li>
</ul>
Run Code Online (Sandbox Code Playgroud)

使用Javascript:

var v = new Vue({
    data: {
        allPhotos: [...],
        photos: [],
        search: '',
    },
    ready: function () {
        var filter = Vue.filter('filterBy');
        var self = this;
        this.$watch('search', function () {
            self.photos = filter(self.allPhotos, self.search, 'name');
        }, {
            immediate: true
        });
    }
})
Run Code Online (Sandbox Code Playgroud)

Jęd*_*bek 14

Vue 2.x(更新)

在Vue 2.x过滤器中,现在只能在文档插值中使用文档插值:

Vue 2.x过滤器只能在胡子绑定中使用.要在指令绑定中实现相同的行为,您应该使用Computed属性.

您可以使用JavaScript内置filter方法和计算属性实现相同的行为.

<input v-model="searchQuery">

<span v-if="!filteredItems.length">No results.</span>

<ul>
    <li v-for="item in filteredItems"></li>
</ul>
Run Code Online (Sandbox Code Playgroud)
computed: {
  filteredItems: function () {
    var self = this;
    return self.items.filter(function (item) {
      return item.indexOf(self.searchQuery) !== -1;
    })
  }
}
Run Code Online (Sandbox Code Playgroud)

Vue 1.x(原始答案)

目前有两种方式.在所有情况下,模板看起来都一样.

<input v-model="searchQuery">

<span v-if="!filteredItems.length">No results.</span>

<ul>
    <li v-for="item in filteredItems"></li>
</ul>
Run Code Online (Sandbox Code Playgroud)

过滤

原始filterBy方法通过访问$options.

computed: {
    filteredItems: function () {
        return this.$options.filters.filterBy(this.items, this.searchQuery);
    }
}
Run Code Online (Sandbox Code Playgroud)

$ EVAL

一点点清洁的方法.Eval表达式就像您在模板中所做的那样.

computed: {
  filteredItems: function () {
    return this.$eval('items | filterBy searchQuery');
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用[`$ eval`](http://vuejs.org/api/#vm-eval)来保持它更清洁,并且像`return this.$ eval('items | searchQuery')`和它还可以让你清楚地链接更多过滤器. (2认同)

Jih*_*ada 8

在HTML中:

<input v-model="search">
<h4 v-if="!filteredPhotos.length">No results</h4>
<ul>
    <li v-for="photo in filteredPhotos">
        <img :src="photo.src" :alt="photo.name">
    </li>
</ul>
Run Code Online (Sandbox Code Playgroud)

在JS中,您需要使用如下计算属性:

computed: {
  filteredPhotos: function () {
      return this.photos.filter(function(photo){
          return photo.name.indexOf(this.search) > -1;
      }.bind(this));
  }
}
Run Code Online (Sandbox Code Playgroud)

演示:http://jsfiddle.net/crswll/Lr9r2kfv/37/

  • 一段时间后再次访问此问题.这绝对是正确的方法,尤其是Vue 2.0. (2认同)