本文介绍方法搜索效率太低,之前没有想到有更好的方法。现在我用的是直接搜索,然后把匹配结果放进新数组

今天给小程序添加个搜索功能,需要实现前端一个list列表的搜索。

搜索有search()和indexOf()两个方法,搜了一下两者的区别,发现indexOf在搜索字符串的情况下效率更高,于是选择了indexOf

另外存储变量也有两种方案:

  1. 直接给details[id]加多一个HIDDEN变量,details[ID].HIDDEN
  2. 新增一个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秒。另外做一个浮层来直接显示搜索出的结果感觉会更加好。

发表评论

电子邮件地址不会被公开。 必填项已用*标注