在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>

如何检测空的筛选结果并向用户显示适当的消息?

EDIT

我目前正在做以下工作,我觉得这是一个很难解决的问题:

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>

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
        });
    }
})

推荐答案

Vue 2.x (Update)

在Vue 2中.x过滤器现在只能在文本插值中使用,as docs say个:

Vue 2.x过滤器只能在mustache 绑定中使用.要在指令绑定中实现相同的行为,应该改用计算(computed)属性.

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

<input v-model="searchQuery">

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

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

Vue 1.x (Original Answer)

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

<input v-model="searchQuery">

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

<ul>
    <li v-for="item in filteredItems"></li>
</ul>

肮脏的

最初的肮脏的方法通过$options访问.

computed: {
    filteredItems: function () {
        return this.$options.filters.肮脏的(this.items, this.searchQuery);
    }
}

$eval

更干净一点的方法.像在模板中一样判断表达式.

computed: {
  filteredItems: function () {
    return this.$eval('items | 肮脏的 searchQuery');
  }
}

Vue.js相关问答推荐

当props 的值改变时如何更新类'

vue3中的转换可以在滑入但不能滑出时工作

为什么v-show需要组件的包装元素?

如何在AXIOS调用响应中动态导入视频并创建它的绝对路径?

从组件中检索 Shopware CMS 编辑器中的自定义实体数据

Vuetify 3 v-radio-group 将模型设置为 null

Nuxt3: 安装vue3-spinner (error: require is not defined in ES module scope)

在移动版本中使用标准的 v-data-table

在 Vue.js 2.6 的 Javascript 中访问 的内容

如何通过 setup() 发出多个参数?

VueJS:向左,元素的顶部位置?

使用 vee-validate 在 vue js 中进行验证有错误

eslint – 如何知道 defined定义规则的位置

Vue 和 TypeScript 所需的props

Keycloak:用户基于角色的客户端登录访问限制

NuxtServerInit 在 Vuex 模块模式下不起作用 - Nuxt.js

Vue:如何在按钮单击时调用 .focus()

按键删除对象不会更新vue组件

VueJS 路由 - 使用子路由和 Vuetify 时如何停止多个活动路由(active routes)?

$set 不是函数