小程序 view wx:for 循环太多时,如何在循环结束执行某个事件?

小程序 view wx:for 时,大概500个循环时, 页面load显示出来比较慢,怎么才能在渲染 wx:for完成最后一个循环时,定义给 事件,加给提示加载完成呢??
一般从网络获取数据时,在返回success时可以加给个提示。但是数据返回后,下一步就是渲染 view 层的 wx:for ,往往慢的就是这个wx:for 因为循环要绑定许多东西,导致空白8秒,这8秒结束后,如何加个提示完成绑定完成。 或者执行某个绑定结束的自定义事件呢??

该回答引用ChatGPT

请参考下面的解决方案,如果可行 ,还请点击,如果有问题 可以私信,感谢支持!

可以在渲染完成后通过 WXML 中的 data-bind 和 JavaScript 中的 wx:if 进行判断,从而实现在渲染完成时触发自定义事件,提示加载完成。

在 wx:for 渲染的最后一个元素的元素上绑定 data-bind 属性,并在其中进行判断,在渲染完成后可以判断是否为最后一个元素,从而触发自定义事件。

代码示例

<view wx:for="{{list}}" data-index="{{index}}">
  <!-- 数据 -->
</view>



js

Page({
  data: {
    list: [1, 2, 3, 4, ..., 500]
  },
  onLoad: function() {
    var that = this;
    this.setData({
      list: that.data.list
    }, function() {
      // wx:for 渲染完成后执行
      if (that.data.list.length == 500) {
        console.log("Load Complete");
        // 触发自定义事件
      }
    })
  }
})


这样就可以在 wx:for 渲染完成时触发自定义事件,提示加载完成。

//

在小程序中,可以通过在wx:for渲染数据的代码前后加入wx.showLoading和wx.hideLoading来实现加载提示。在wx:for绑定完数据后,可以触发自定义事件,通知其他页面或组件绑定已经完成。例如:

wx.showLoading({
  title: '加载中',
})

// 加载数据并绑定到wx:for

wx.hideLoading();

this.triggerEvent('bindDataEnd', {});


在接收该事件的页面或组件中,可以通过监听该事件来处理绑定完成后的逻辑。例如:


<template>
  <view>
    <!-- 监听自定义事件 -->
    <template is="xxx" data="{{...data}}" bind:bindDataEnd="bindDataEnd"></template>
  </view>
</template>

<script>
Page({
  bindDataEnd(e) {
    console.log('bindDataEnd');
  }
})
</script>


基于GPT和 Monster组的编写,有用请你采纳:
可以在渲染 wx:for 完成时触发自定义事件,以便显示加载完成的提示。在页面的 js 文件中,可以通过监听 wx:for 指令的渲染完成事件,来实现这个功能。

具体实现方式如下:

在模板中添加 wx:for 指令,并为该指令指定唯一的标识符。

<view wx:for="{{array}}" wx:key="uniqueKey">
   <!-- 你的内容 -->
</view>



在页面的 js 文件中,使用 $wx.createIntersectionObserver 方法监听该指令的渲染完成事件。

const observer = $wx.createIntersectionObserver()

observer
  .relativeToViewport({ bottom: -1 })
  .observe(`view[wx:key=uniqueKey]`, (res) => {
    if (res.isIntersecting) {
      // 触发自定义事件
      this.triggerEvent('customEvent', {}, {})
    }
  })



在页面的 wxml 文件中,使用 bind:customEvent 绑定该自定义事件,在该事件中显示加载完成的提示。

<view bind:customEvent="showLoadingCompleteTip">
  <!-- 你的内容 -->
</view>


在页面的 js 文件中,实现 showLoadingCompleteTip 方法,该方法用于显示加载完成的提示。

methods: {
  showLoadingCompleteTip() {
   // 显示你的加载完成提示
  }
}


以上代码中的 uniqueKey 和 customEvent 都是可以自定义的。这个方法应该能帮到你。

您可以考虑将wx:for循环改为每次循环渲染一定量的数据,并通过使用setData方法刷新页面。每次循环完成后,检查是否已渲染完所有数据,如果是,请触发完成提示或自定义事件。这样可以避免空白,并使页面更流畅。

该回答引用GPT,有帮助的话请帮我点个采纳

在 wx:for 渲染结束后可以在页面的 js 中定义一个 onReady() 生命周期函数,在此函数中触发提示加载完成的事件。例如:

Page({
onReady: function() {
console.log('wx:for渲染完成');
wx.showToast({
title: '加载完成',
});
}
})

该方法保证了在 wx:for 渲染完成后再触发 onReady 函数,从而在渲染完成后展示提示。

可以在循环结束后的函数调用中触发自定义事件,例如:

<view wx:for="{{array}}" wx:for-index="idx" wx:for-item="item">
  {{item}}
</view>

Page({
  data: {
    array: []
  },
  onLoad: function () {
    this.setData({
      array: new Array(500)
    }, () => {
      this.triggerEvent('finishRender')
    })
  }
})



在父组件中监听该事件:

<child-component bind:finishRender="finishRender"></child-component>

Page({
  methods: {
    finishRender() {
      console.log('wx:for render finished')
    }
  }
})


在这样的情况下,当循环完成后,页面就会触发 finishRender 事件,您就可以在父组件中执行相应的操作,例如显示加载完成的提示。

哈哈哈,最近发现问答榜怎么这么多用 chatgpt 回答内容的,服了😅。。。

我给你思路,不一定能帮助到你,如有帮助,望采纳😄

首先,如果是数据渲染太慢,建议:使用类似分页的功能做“分批次渲染”,能加快页面呈现数据。

再者,你问如何知道渲染到最后一条数据结束是不?

<view wx:for="{{array}}" wx:for-index="idx" wx:for-item="itemName">
  {{idx}}: {{itemName.message}}
</view>

你看循环的时候是可以知道 index 下标的,所以可以判断数据长度和下标,进行比较来判断是否渲染到最后一条了。

如有帮助,望采纳。。。