在Vue.js中,过滤器主要用于文本的格式化,或者数组数据的过滤与排序等。从Vue.js2.0.0版本开始,内置的过滤器被删除了,如果使用过滤器,需要自己编写。过滤器可以用在两个地方:双花括号插值和v-bind表达式,使用时通过管道符( | )添加到表达式的尾部使用。
<!-- 在双花括号中 -->
{{ message | capitalize }}
<!-- 在 `v-bind` 中 -->
<div v-bind:id="rawId | formatId"></div>
过滤器本质是一个函数。Vue中的过滤器分为两种:局部过滤器和全局过滤器
一、全局过滤器:使用Vue.filter()方法来注册,该方法接收两个参数,第一个参数是过滤器的ID(即名字),第二个参数是一个函数对象,过滤器要实现的功能在这个函数中定义。语法形式如下:
Vue.filter(id,[definition])
示例:
<div id="app">
<input type="text" v-model="message">
{{ message | capitalize }}
</div>
<script>
Vue.filter('capitalize', function (value) {
if (!value) return ''
value = value.toString()
return value.toUpperCase();
})
new Vue({
el:'#app',
data:{
message:'java'
}
})
</script>
过滤器函数总接收表达式的值 (之前的操作链的结果) 作为第一个参数。在上述例子中,capitalize 过滤器函数将会收到 message 的值作为第一个参数。
二、局部过滤器:是在Vue实例的选项对象中使用filters选项来注册
例如:
<div id="app">
<input type="text" v-model="message">
{{ message | capitalize }}
</div>
<script>
new Vue({
el:'#app',
data:{
message:'java'
},
filters:{
capitalize:function (value) {
if (!value) return ''
value = value.toString()
return value.toUpperCase();
}
}
})
</script>
三、过滤器的串联:
1、{{ message | filterA | filterB }}
filterA 被定义为接收单个参数的过滤器函数,表达式 message 的值将作为参数传入到函数中。然后继续调用同样被定义为接收单个参数的过滤器函数 filterB,将 filterA 的结果传递到 filterB 中。
2、过滤器是 JavaScript 函数,因此可以接收参数:
{{ message | filterA('arg1', arg2) }}
这里,filterA 被定义为接收三个参数的过滤器函数。其中 message 的值作为第一个参数,普通字符串 'arg1' 作为第二个参数,表达式 arg2 的值作为第三个参数。
四、综合示例
<style>
div{
width: 850px;
margin: 50px auto;
}
</style>
<div id="app">
<h2 style="text-align: center;">过滤器应用举例</h2>
<div>
<label>
ID:
<input type="text" placeholder="请输入编号" v-model="id" v-bind:disabled="id_flag">
</label>
<label>
Name:
<input type="text" placeholder="请输入名称" v-model="name">
</label>
<label>
Delivery Time:
<input type="datetime-local" v-model="ctime"/>
</label>
<button @click="add" v-bind:disabled="add_flag">Add</button>
<button v-bind:disabled="edit_flag" @click="edit_option">Edit</button>
<br><br>
<label>
请输入搜索关键字:
<input type="text" placeholder="请输入搜索关键字" v-model="keyword">
</label>
<button @click="search(keyword)">Search</button>
</div>
<table border="1">
<thead>
<tr>
<th width="100">编号</th>
<th width="200">名称</th>
<th width="300">出厂时间</th>
<th width="200">操作</th>
</tr>
</thead>
<tbody>
<tr v-for="(item,index) in search(keyword)" :key="item.id" align="center">
<td>{{ item.id }}</td>
<td>{{ item.name }}</td>
<td>{{ item.ctime | dateFormat }}</td>
<td>
<a href="#" @click.prevent="edit(item)">{{ item.options[0] }}</a>
<a href="#" @click.prevent="del(index)">{{ item.options[1] }}</a>
</td>
</tr>
</tbody>
</table>
</div>
<script>
new Vue({
el: '#app',
data: {
id: '',
name: '',
ctime: new Date(),
keyword: '',
id_flag: false, //id框可用
add_flag: false,//add按钮可用
edit_flag: true, //edit按钮不可用
list: [
{ id:1001,name:'宝马520',ctime:new Date(),options:['Edit','Delete'] },
{ id:1002,name:'宝马730',ctime:new Date(),options:['Edit','Delete'] },
{ id:1003,name:'宝马X5',ctime:new Date(),options:['Edit','Delete'] },
{ id:1004,name:'奔驰s350',ctime:new Date(),options:['Edit','Delete'] },
{ id:1005,name:'奔驰s450',ctime:new Date(),options:['Edit','Delete'] },
{ id:1006,name:'红旗L5',ctime:new Date(),options:['Edit','Delete'] },
{ id:1007,name:'红旗L7',ctime:new Date(),options:['Edit','Delete'] },
{ id:1008,name:'红旗X90',ctime:new Date(),options:['Edit','Delete'] }
]
},
filters: { //局部过滤器
dateFormat: function(d){
let date = new Date(d);
let dy = date.getFullYear();
let dm = date.getMonth()+1;
dm = dm>=10?dm:'0'+dm;
let dd = date.getDate();
dd = dd>=10?dd:'0'+dd
let h = date.getHours();
h = h>=10?h:'0'+h
let m = date.getMinutes();
m = m>=10?m:'0'+m
let s = date.getSeconds();
s = s>=10?s:'0'+s
return `${dy}-${dm}-${dd}T${h}:${m}:${s}`
}
},
methods:{
add(){
let temp_id = this.id;
let temp_name = this.name;
let temp_date = this.ctime;
this.list.push({
id: temp_id,
name: temp_name,
ctime: temp_date,
options:['Edit','Delete']
});
this.id = '';
this.name = '';
this.ctime = '';
},
edit(item){
this.add_flag = true; //add按钮不可用
this.edit_flag = false; //edit按钮可用
this.id = item.id;
this.name = item.name
this.ctime = this.$options.filters.dateFormat(item.ctime);
this.id_flag = true //id框不可用
},
edit_option(){
let arr = this.list.filter(temp=>{ //查找需要编辑的元素
return temp.id === this.id
})
arr[0].name = this.name
arr[0].ctime = this.ctime
this.list = this.list.map(item=>{ //替换元素
return item.id === arr[0].id?arr[0]:item
})
this.id_flag = false //id框可用
this.add_flag = false //add按钮可用
this.edit_flag = true //edit按钮不可用
this.id=''
this.name=''
this.ctime = ''
},
del(index){
this.list.splice(index,1)
},
search(name){
var arr=[];
this.list.forEach((item,i)=>{
if(item.name.indexOf(name)!=-1){
arr.push(item);
}
});
return arr
}
}
})
</script>