Skip to content

uniapp 实现超过两行的搜索历史具有展开收起功能

实现思路

将搜索历史封装为一个组件,传入搜索历史数据。在组件的 mounted 钩子里计算判断搜索历史数据是否需要展开收起功能。

代码

获取历史项的 left 值,以第一个历史项为基准,当出现一个历史项的 left 值与第一个相同时,说明此时的行数应该加 1。

然后把搜索历史的占用行数、第 n(3)行的最后一个历史项的 index 记录在 data 里。

然后我们就根据占用行数、最后一个历史项的索引来实现搜索历史的展开和收起功能。

js
<!-- 搜索历史组件 -->
<search-history :search-history="searchHistory" />

<!-- 搜索历史组件的mounted钩子 -->
mounted() {

    uni.createSelectorQuery().in(this).selectAll('.search-history-item').boundingClientRect(data=>{
      let firstItemLeft = 0
      if(data.length > 0) {
        firstItemLeft = data[0].left
      }
      for(let i = 0; i < data.length; i++) {
        let item = data[i]
        if(item.left === firstItemLeft) {
          this.lineNum ++
          if(this.lineNum >= 3) {
            this.lastIndex = i - 1
            break
          }
        }
      }
    }).exec()

}

提示

使用 v-if 让组件重新渲染时,会重新触发 mounted 钩子,利用这里点我们可以计算变动的搜索历史数据。当搜索时,我们先让搜索历史组件消失,搜索出结果并往搜索历史里新增一条数据后,我们再重新渲染搜索历史组件,根据行的搜索历史数据算出占用行数、最后历史项的索引。

Released under the MIT License.