小程序 - 搜索历史折叠功能

主要思路:

const query = wx.createSelectorQuery().in(this);  方法获取dom的宽度 来计算
通过使用一个 对比的dom让他 绝对定位于 页面之外 作为是否需要折叠的参照物。
首先 默认为折叠状态,参照物 减去 需要显示的高度 是否大于 一个范围值 。大于 则 需要折叠;小于 则 不需要折叠 且 不需要折叠按钮
 
html
<view class="box">
<view class=" showArea {{onFold ? 'search-history-wrapper' : 'search-history-wrapper-on-fold'}}">
    <view class="search-history-item" wx:for="{{ onFold ? list : onFoldList}}" wx:key="index">
        {{item}}
    </view>
    <view class="{{onFold ? 'fold' : 'off-fold'}}" wx:if="{{foldIconVisible}}" bindtap="fold"></view>
</view>
<!-- 用于对比的 -->
<view class="search-history-wrapper hideArea">
    <view class="search-history-item_hidden" wx:for="{{originList}}" wx:key="index">
        {{item}}
    </view>
</view>
</view>

 

css

.search-history-wrapper,.search-history-wrapper-on-fold{
  /* border: 1px solid red; */
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  padding: 0 32rpx;
  box-sizing: border-box;
}
.fold,.off-fold{
  width: 88rpx;
  height: 58rpx;
  background-color: blue;
}
.off-fold{
  background-color: red;
}
.search-history-item,.search-history-item_hidden{
  padding: 12rpx 20rpx;
  box-sizing: border-box;
  background-color: #f0f2f4;
  border-radius: 8px;
  font-size: 24rpx;
  color: #4f5356;
  font-weight: 400;
  margin: 0 12rpx 12rpx 0;
  white-space: nowrap;
  text-overflow: ellipsis;
  overflow: hidden;
  word-break: break-all;
  max-width: 236rpx;
}
.showArea{
  height: 58rpx;
  overflow: hidden;
}
.search-history-wrapper-on-fold{
  height: 126rpx;
}
.hideArea{
  position: fixed;
  top: -100px;
}

 

JS

const app = getApp()

Page({
  data: {
    originList: ["连衣裙", "篮球鞋", "卡酷其", "阿迪王","Nike","衬衣", "Polo", "Benzene", "梅德索拉"], //请求回来的数据
    list: [], //已折叠的数据
    onFoldList: [], // 未折叠的数据
    onFold: true, //用于判断 向上 向下折叠图标
    foldIconVisible:true //折叠图标是否显示
  },
  onLoad() {
    this.checkFold()
  },

  async checkFold() {
    const {
      originList
    } = this.data

    const query = wx.createSelectorQuery().in(this);
    // 计算dom宽度
    await query
      .selectAll('.showArea,.hideArea,.search-history-item_hidden')
      .boundingClientRect((res) => {
        const maxWidth = res[0].width -32; //容器最大宽度 减去 32 是因为有左右padding
        const offFold = [...originList]; // 用于存放 已折叠 数据
        const onFold = [...originList] // 用于存放 未折叠 数据
        // 已折叠
        let offFoldWidth = 0; //统计 一行最大宽度
        let offSpliceIndex = 0; //统计出 需要 分割的 最后一个元素的下标
        // 未折叠
        let onFoldWidth = 0;
        let onSpliceIndex = 0
        // 判断是否是换行了
        if (res[1].height - res[0].height > 10) {
          // 算出 已折叠 时 第一行的数据个数 加上 折叠按钮
          for (let i = 2; i < res.length; i++) {
            // 每个元素 加 6的原因是margin-left:6
            offFoldWidth += res[i].width + 6
            // 50原因是 折叠按钮 width: 44 + margin-left: 6
            if (maxWidth - offFoldWidth > 50) {
              offSpliceIndex = i - 1
            }
          }
          const offFoldList = offFold.splice(0, offSpliceIndex)

           // 算出 未折叠 时 第一行的数据个数 加上 折叠按钮
          for (let i = 2; i < res.length; i++) {
            onFoldWidth += res[i].width + 6;
            if ((maxWidth*2) - onFoldWidth > 50) {
              onSpliceIndex = i - 2
            }
          }
          const onFoldList = onFold.splice(0, onSpliceIndex)
          console.error("onFoldList",onFoldList)
          this.setData({
            list: offFoldList,
            onFoldList
          })
        } else {
          this.setData({
            foldIconVisible:false,
            list: originList,
          })
        }
      })
      .exec();
  },
  fold() {
    const {
      onFold,
    } = this.data
    this.setData({
      onFold: !onFold
    })
  }
})

 



posted @ 2022-04-11 16:10  敲代码的树先生  阅读(188)  评论(0编辑  收藏  举报