过滤器是处理 Vue 中数据渲染的一种有趣方式,但在少数情况下才有用。首先要了解的是,过滤器并非方法、计算属性或侦听器的替代品,因为 **过滤器不会转换数据,只会转换用户看到的结果**。从 Vue 2.0 开始,没有内置过滤器,我们需要自己构建它们。
我们可以局部或全局使用过滤器,但值得一提的是,如果全局声明 Vue 过滤器,它应该出现在 Vue 实例之前。在这两种情况下,我们都会将值作为参数传递。
//global
Vue.filter('filterName', function(value) {
return // thing to transform
});
//locally, like methods or computed
filters: {
filterName(value) {
return // thing to transform
}
}
过滤器使用管道,紧随您希望在渲染时更改的数据。因此,我们会显示要更改的数据,然后是过滤器
{{ data | filter }}
这是一个小例子,带有一个小费计算器
查看 CodePen 上 Sarah Drasner (@sdras) 的 过滤器。
new Vue({
el: '#app',
data() {
return {
customer1total: 35.43
}
},
filters: {
tip15(value) {
return (value*.15).toFixed(2)
},
tip20(value) {
return (value*.2).toFixed(2)
},
tip25(value) {
return (value*.25).toFixed(2)
}
}
});
<div id="app">
<h2>Tip Calculator</h2>
<p><strong>Total: {{ customer1total }}</strong></p>
<p>15%: {{ customer1total | tip15 }}</p>
<p>20%: {{ customer1total | tip20 }}</p>
<p>25%: {{ customer1total | tip25 }}</p>
</div>
您也可以在 v-bind
指令中使用过滤器,而不仅仅是使用 mustache 模板。过滤器也可以链接。请记住,如果您要链接过滤器:顺序很重要。第一个过滤器将首先应用,第二个过滤器将应用于第一个完成的过滤器,依此类推。
{{ data | filterA | filterB }}
我们也可以像这样将附加参数传递给过滤器
{{ data | filterName(arg1, arg2) }}
// locally, like methods or computed
filters: {
filterName(value, arg1, arg2) {
return //thing to transform
}
}
现在,您可能认为,根据名称,过滤器对于表单来说非常棒,因为当我们只想显示某些数据而不显示其他数据时,我们可以使用它们。但是,过滤器需要在每次更新时重新运行,因此,如果您有像输入这样的东西,它会在每次您键入时更新,那么它效率不高。最好使用 **computed
** 来处理类似的事情,因为它开销更低。结果将根据其依赖项进行缓存,并且不会在每次更新时重新运行。计算属性只有在这些依赖项发生变化时才会重新计算,但也可以处理复杂逻辑。这使得它们成为根据输入过滤信息的绝佳候选者。但是,在某些情况下,您确实需要根据时间的变化进行更新,对于这些情况,最好使用 **method
**。
感谢您的文章。这篇文章是关于响应式过滤器的简单指南。我不知道“响应式过滤”这个术语是否合适
我认为您会发现现在可以通过在过滤器名称后使用空格来设置多个参数
{{ myValue | myFilter mySecondParam }}
此外,Vue 2 支持双向绑定过滤器 - 特别是用于用户输入。有关更多详细信息,最好查看官方文档:https://012.vuejs.org/guide/custom-filter.html
嘿!这些文档非常旧,这些是 0.12 文档,我们现在已经超过了版本 2 - 这些是您应该查看的文档 - 请确保您查看版本号。
https://vuejs.ac.cn/v2/guide/syntax.html#Filters
旧的 vue 过滤器可以作为单独的模块使用 https://npmjs.net.cn/package/vue2-filters
它具有可立即使用的字母大小写
截断
filterBy
OrderBy
Pluralize
http://optimizely.github.io/vuejs.org/api/filters.html
因此,如果我们的需求可以通过这些预定义过滤器满足,则很容易包含该模块
感谢这篇文章!我写了一个小助手方法,将全局或局部声明的过滤器添加为组件方法。这样,您就可以在您的组件中使用它们,就像它们是方法一样。
这与 vuex 用于映射其 getter 或操作的方法类似
map-filters
您可以像这样使用它
export default {
methods: {
...mapFilters(['filterName']),
},
mounted() {
// 代替
const filtered = this.$options.filter.filtername(arg);
// ...您可以写成
const alsoFiltered = this.filterName(arg);
}
}