本文介绍方法搜索效率太低,之前没有想到有更好的方法。现在我用的是直接搜索,然后把匹配结果放进新数组
今天给小程序添加个搜索功能,需要实现前端一个list列表的搜索。
搜索有search()和indexOf()两个方法,搜了一下两者的区别,发现indexOf在搜索字符串的情况下效率更高,于是选择了indexOf。
另外存储变量也有两种方案:
- 直接给details[id]加多一个HIDDEN变量,details[ID].HIDDEN
- 新增一个hidden变量,hidden[id]
试了一下,直接在wx:if中使用item.HIDDEN比hidden[index]速度更加快。
刚开始打算使用Change函数,直接input输入实时进行搜索。
handleZanFieldChange(e) {
for(var i = 0; i < this.data.details.length; i++)
{
var data = this.data.details[i];
if (data.NAME.indexOf(e.detail.value) == -1)
{
var str = "details[" + i + "].HIDDEN"
this.setData({
[str]: true
})
}
else
{
var str = "details[" + i + "].HIDDEN"
this.setData({
[str]: false
})
}
}
}
后来发现每输入一个字符就会被触发一次,变成回调重复执行。后来改成了handleZanFieldBlur
。
也在xml中纠结了一下要用wx:if还是hidden,官方文档这样写:
wx:if vs hidden
因为 wx:if 之中的模板也可能包含数据绑定,所有当 wx:if 的条件值切换时,框架有一个局部渲染的过程,因为它会确保条件块在切换时销毁或重新渲染。同时 wx:if 也是惰性的,如果在初始渲染条件为 false,框架什么也不做,在条件第一次变成真的时候才开始局部渲染。
相比之下,hidden 就简单的多,组件始终会被渲染,只是简单的控制显示与隐藏。
一般来说,wx:if 有更高的切换消耗而 hidden 有更高的初始渲染消耗。因此,如果需要频繁切换的情景下,用 hidden 更好,如果在运行时条件不大可能改变则 wx:if 较好。
最后选择了wx:if。
<view class="zan-panel">
<navigator class="zan-cell zan-cell--access" wx:for="{{details}}" wx:key="{{item.SID}}" bindtap="changeSchool" data-sid="{{item.SID}}" data-name="{{item.NAME}}" wx:if="{{item.HIDDEN != true}}">
<view class="zan-cell__bd">{{item.NAME}}</view>
<view class="zan-cell__ft"></view>
</navigator>
</view>
最后在整个测试流程中,无论是用indexOf还是search,wx:if还是hidden,搜索时list都会有一个比较明显的刷新过程,将近200条的list,搜索用了大概10秒。另外做一个浮层来直接显示搜索出的结果感觉会更加好。
发表回复