瀑布流问题,好奇image组件在onload的时候是不是做了什么?
发布于 5 年前 作者 haojun 9329 次浏览 来自 问答

因为第一次页面加载的时候显示不正常,之后切换页面就显示的跟预期一样

wxml

  <!-- js高度计算瀑布流  -->
  <view class="left" id="left-box">
    <view wx:for="{{leftList}}" class="item" wx:key="text">
      <image class="item-nail" src="{{item.nail}}" mode="widthFix"></image>
      <view class="item-text">推文{{item.text}}</view>
    </view>
  </view>
  <view class="right" id="right-box">
    <view wx:for="{{rightList}}" class="item" wx:key="text">
      <image class="item-nail" src="{{item.nail}}" mode="widthFix"></image>
      <view class="item-text">推文{{item.text}}</view>
    </view>
  </view>
</view>

js

waterfall(arr, index = 0) {
    if (arr.length <= index) {
      return
    }
    const query = wx.createSelectorQuery().in(this)
    query.select('#left-box').boundingClientRect()
    query.select('#right-box').boundingClientRect()
    query.exec(rects => {
      console.log('eee', rects)
      if ( rects[0].height <= rects[1].height ) {
        this.setData({
          leftList: this.data.leftList.concat([arr[index]])
        })
      } else {
        this.setData({
          rightList: this.data.rightList.concat([arr[index]])
        })
      }
      wx.nextTick(() => {
        this.waterfall(arr, ++index) 
      })
    })
  },

第一次 1,2 ,4,3…

之后1,2,3,4…正常了

为什么呀?,怎么规避第一次即第一次onload 进入出现的问题呢?

3 回复
mode="widthFix"

你用了这个属性,检查元素可以看见会给 image 加上含内样式 height ,而这个 height 毫无疑问是在图片加载下来之后才能通过 width 计算获取的。而你的瀑布流计算到底放入左还是右时,图片并不一定已经加载完成(但第二次执行时大概率是已经加载完成了的,可以根据 network 查看图片加载时间和你的代码执行时间对比来判断到底是不是这个问题)。除了以上nextTick(延时)执行的方案,更应该在image loaded 加载完成后来执行,但这又引出在多少图片loaded之后执行才合理的问题。以及其他未考虑到的优化问题。具体可以找轮子参考一下。

第一次加载慢呗,有没有缓存了自然就快了

回到顶部