-
2浏览
0关注
739博文
0收益
-
0浏览
0点赞
0打赏
0留言
通过事例讲解如果在 Vue 创建及使用过滤器
@大迁世界 发布时间:2020-06-18 08:30:00 ,浏览量:2
与 AngularJS 类似,Vue.js 也有自己的数据转换和过滤方法,但是必须记住,过滤器并不改变原始数据,它们只改变输出并返回过滤后的数据。过滤器在很多不同的情况下都很有用,比如保持API响应尽可能干净,在前端处理数据的格式。希望通过将所有逻辑封装在可重用代码块之后来避免重复和连接的情况下,它们同样非常有效。
定义和使用过滤器
使用 Vue,我们可以通过两种不同的方式注册过滤器:全局和本地。前者方式可以访问所有组件中的过滤器,而后者则只能在定义该组件的组件内部使用过滤器。
过滤器是简单的 JS 函数,它们将要转换的值作为第一个参数,但是也可以传入尽可能多的其他参数来返回该值的格式化版本。
全局过滤器
全局过滤器如下所示:
// 在此示例中,我们将注册一个全局过滤器用来在价格前面添加美元符号:
// 声明
Vue.filter('toUSD', function (value)) {
return `$${value}`
}
// 使用
{{ 351.99 | toUSD }}
过滤器定义必须始终在主Vue实例之上,否则会得到一个Failed to resolve filter: toUSD
错误。
// DECLARATION
Vue.filter('toUSD', function (value) {
return `$${value}`;
});
new Vue({
el: '#app',
data: {
price: 351.99
}
});
// USAGE
{{ price | toUSD }}
本地过滤器
本地过滤器注册到一个Vue组件作用域中,来看看如何创建:
// 在此示例中,我们将创建一个过滤器,将字符串变成大写。
// 声明
new Vue({
el: '#app',
data: {
name: 'scotch.io'
},
filters: {
// Filter definitions
Upper(value) {
return value.toUpperCase();
}
}
});
// 用法
{{ name | Upper }}
如上面的示例中看到的那样,本地过滤器作为“filters”
属性内的函数存储在Vue组件中。我们可以注册任意多个:
...
filters: {
Upper(value) {
return value.toUpperCase();
},
Lower(value) {
return value. toLowerCase();
},
}
....
附加参数设置
正如我们在本文引言中所提到的,过滤器可以根据需要接受任意多个参数
// 声明
Vue.filter('readMore', function (text, length, suffix) {
return text.substring(0, length) + suffix;
});
new Vue({
el: '#app',
data: {
text: 'Lorem ipsum dolor sit amet, consectetur adipisicing elit. Non ab modi repellendus labore facere, fugiat ipsam quae accusantium commodi voluptas nesciunt dolor similique ipsum accusamus earum eligendi suscipit laborum quod.'
}
});
// 用法
{{ text | readMore(10, '...') }}
在此示例中,我们创建了一个名称为“readMore”
的过滤器,该过滤器会将字符串的长度限制为给定的字符数,并且还会在其中添加所选择的后缀。Vue.js 将要过滤的值作为第一个参数 text 传递,length
和 suffix
作为第二个和第三个参数传递。
链式过滤器
关于过滤器,我最喜欢的一点是能够使用管道(|
)符号将它们链接起来,并通过一系列转换器运行单个值。再举一个价格的例子,我们想限制价格的小数位以及加价格的单位。
// JS
Vue.filter('toFixed', function (price, limit) {
return price.toFixed(limit);
});
Vue.filter('toUSD', function (price) {
return `$${price}`;
});
new Vue({
el: '#app',
data: {
price: 435.333
}
});
// HTML
{{ price | toFixed(2) | toUSD }}
示例
接下来,我们通过一些事例来巩固一下。
将 JS 值转换为JSON字符串
// JS
Vue.filter('json', function (value) {
return JSON.stringify(value);
});
new Vue({
el: '#app',
data: {
user: {
username: 'johndoe',
email: 'john@example.com',
countryCode: 'U.K.'
}
}
});
// HTML
{{ user | json }}
从对象数组中提取属性值列表
Vue.filter('pluck', function (objects, key) {
return objects.map(function(object) {
return object[key];
});
});
new Vue({
el: '#app',
data: {
users: [
{
"id": 4,
"first_name": "Eve",
"last_name": "Holt"
},
{
"id": 5,
"first_name": "Charles",
"last_name": "Morris"
},
{
"id": 6,
"first_name": "Tracey",
"last_name": "Ramos"
}
]
}
});
// HTML
{{ users | pluck('last_name') }}
返回给定索引处的元素
Vue.filter('at', function (value, index) {
return value[index];
});
new Vue({
el: '#app',
data: {
videos: ['Zi_XLOBDo_Y', 'sOnqjkJTMaA', 'sOnqjkJTMaA']
}
});
// HTML
{{ videos | at(1) }}
返回给定列表中的最小值
// JS
Vue.filter('min', function (values) {
return Math.min(...values);
});
new Vue({
el: '#app',
data: {
ages: [23, 19, 45, 12, 32]
}
});
// HTML
{{ ages | min }}
随机排列元素列表:
Vue.filter('shuffle', function (values) {
for (var i = values.length - 1; i > 0; i--) {
var j = Math.floor(Math.random() * (i + 1));
var temp = values[i];
values[i] = values[j];
values[j] = temp;
}
return values;
});
new Vue({
el: '#app',
data: {
cards: ['Lahire', 'Judith', 'Lancelot', 'Alexandre']
}
});
// HTML
{{ cards | shuffle }}
返回数组的第一个元素:
Vue.filter('first', function (values) {
if(Array.isArray(values)) {
return values[0];
}
return values;
});
new Vue({
el: '#app',
data: {
consoles: ['PlayStation', 'Nintendo DS', 'Xbox', 'Atari']
}
});
// HTML
{{ consoles | first }}
返回数组的最后一个元素
Vue.filter('last', function (values) {
if(Array.isArray(values)) {
return values[values.length - 1];
}
return values;
});
new Vue({
el: '#app',
data: {
consoles: ['PlayStation', 'Nintendo DS', 'Xbox', 'Atari']
}
});
// HTML
{{ consoles | last }}
返回过滤指定元素的数组的副本
Vue.filter('without', function (values, exclude) {
return values.filter(function(element) {
return !exclude.includes(element);
});
});
new Vue({
el: '#app',
data: {
unpaidInvoices: ['#1001', '#1002', '#1003', '#1004']
}
});
// HTML
{{ unpaidInvoices | without('#1003') }}
删除数组中重复的元素
Vue.filter('unique', function (values, unique) {
return values.filter(function(element, index, self) {
return index == self.indexOf(element);
});
});
new Vue({
el: '#app',
data: {
recentViewedPosts: [13, 43, 23, 13, 43, 3, 98, 42, 65]
}
});
// HTML
{{ recentViewedPosts | unique }}
在字符串后加上文本
Vue.filter('prepend', function (string, prepend) {
return `${string}${prepend}`;
});
new Vue({
el: '#app',
data: {
greeting: 'Hello'
}
});
// HTML
{{ greeting | prepend(' World!') }}
重复一个字符串n次
Vue.filter('repeat', function (string, times) {
return string.repeat(times);
});
new Vue({
el: '#app',
data: {
greeting: 'Hello'
}
});
// HTML
{{ greeting | repeat(3) }}
总结
希望读者们从这篇文章中能学到了一些东西,现在知道如何创建和使用过滤器,最重要的是,你现在可以重构你的代码,用过滤器来清理它。
作者:Ed Zynda 译者:前端小智 来源:scotch.io
原文:https://scotch.io/tutorials/getting-started-with-vue-router
相关热门推荐
【第 244 期】小智周末学习发现了 10 个好用JavaScript图像处理库
【第 243 期】前端!7个快速发现 bug 神仙调试工具
【第 242 期】小智在这3年开发中遇到的 CSS 问题及解决方案,有大佬帮他总结好了 !
「前端编程实战 40」新拟物 checkbox 特效
【第 241 期】JavaScript重构技巧 — 条件
【第 240 期】ES2020 新特性出炉了,你最喜欢哪一个呢?
【第 239 期】JavaScript重构技巧 — 对象和值

1664287990
查看更多评论
立即登录/注册
微信扫码登录