Vuejs列表与过滤器的简单应用

设置一组json数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
var DATA = {
"datas": [{
"id": 1,
"type": 1,
"data": "这是分类一的第一项"
}, {
"id": 2,
"type": 1,
"data": "这是分类一的第二项"
}, {
"id": 3,
"type": 1,
"data": "这是分类一的第三项"
}, {
"id": 4,
"type": 2,
"data": "这是分类二的第一项"
}, {
"id": 5,
"type": 2,
"data": "这是分类二的第二项"
}, {
"id": 6,
"type": 3,
"data": "这是分类三的第一项"
}, {
"id": 7,
"type": 3,
"data": "这是分类三的第二项"
}, {
"id": 8,
"type": 3,
"data": "这是分类三的第三项"
}, {
"id": 9,
"type": 3,
"data": "这是分类三的第四项"
}]
}

并进行列表的双向绑定,加上过滤器选择type为1的项。

1
2
3
4
var list = new Vue({
el:'#type-1',
data:DATA
})
1
2
3
<div id="type-1">
<li v-for="data in datas|filterBy '1' in 'type'">{{data.data}}</li>
</div>

可以看到结果是

blob.png

显然过滤器发挥了作用。在vuejs源码中可以看到filterby函数的代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/**
* Filter filter for arrays
*
* @param {String} search
* @param {String} [delimiter]
* @param {String} ...dataKeys
*/

function filterBy(arr, search, delimiter){
arr = convertArray(arr);
if (search == null){
return arr;
} //如果没有指定过滤中搜索的值,则将arr原样返回
if (typeof search === 'function'){ //“===”means 严格等于
return arr.filter(search); //在arr中直接用原生filter过滤出search的项
}
search = ('' + search).toLowerCase();//toLowerCase 将String转换为小写字符串
var n = delimiter === 'in' ? 3 : 2;//x?y:z 若x为true,结果显示y,若x为false,则结果显示z。
//如果delimiter是in,则n=3,否则n=2
var keys=toArray(arguments,n).reduce(function(prev,cur) {
return prev.concat(cur);//concat用于连接数组的值或具体的值。
},[]);//见reduce用法
var res = [];
var item,key,val,j;
for (var i = 0, l = arr.length; i < l; i++) {//遍历arr
item=arr[i];
val=item&&item.$value||item;
j=keys.length;
if(j){
while (j--) {
key = keys[j];
if (key === '$key' && contains$1(item.$key, search) || contains$1(getPath(val,key),search)) {
//如果在item中的delimiter找到了search,则将这个item放到res数组中
res.push(item);
break;
}
}
}else if (contains$1(item,search)) {//遍历item各级搜索search,如果有则放入res
res.push(item);
}
}
return res;//返回结果
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/**
* String contain helper
*
* @param {*} val
* @param {String} search
*/

function contains$1(val, search) {
var i;
if (isPlainObject(val)) {
var keys = Object.keys(val);
i = keys.length;
while (i--) {
if (contains$1(val[keys[i]], search)) {
return true;
}
}
} else if (isArray(val)) {
i = val.length;
while (i--) {
if (contains$1(val[i], search)) {
return true;
}
}
} else if (val != null) {
return val.toString().toLowerCase().indexOf(search) > -1;
}
}