给小程序list列表加个搜索功能

  • 2019 年 10 月 6 日
  • 笔记

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

今天给小程序添加个搜索功能,需要实现前端一个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秒。另外做一个浮层来直接显示搜索出的结果感觉会更加好。