|
|
Q:微信小程序怎样在加载可视区域的内容的时候,发送当前可视区域的内容作为参数去向PHP后端发送异步请求?
- Page({
- data: {
- list: [], // 列表数据
- loading: false, // 是否正在加载
- page: 1 // 当前页码
- },
- onLoad() {
- // 初始加载
- this.loadData()
- },
- // 监听页面滚动
- onPageScroll(e) {
- // 获取可视区域信息
- wx.createIntersectionObserver().relativeToViewport().observe('.item', (res) => {
- if (res.intersectionRatio > 0) { // 元素进入可视区域
- // 获取当前元素的数据
- const dataset = res.dataset
- // 发送请求
- this.loadItemData(dataset)
- }
- })
- },
- // 加载列表数据
- loadData() {
- if (this.data.loading) return
-
- this.setData({ loading: true })
-
- wx.request({
- url: 'your_api_url',
- data: {
- page: this.data.page
- },
- success: (res) => {
- this.setData({
- list: [...this.data.list, ...res.data],
- page: this.data.page + 1
- })
- },
- complete: () => {
- this.setData({ loading: false })
- }
- })
- },
- // 加载单个元素详细数据
- loadItemData(params) {
- wx.request({
- url: 'your_detail_api',
- data: params,
- success: (res) => {
- // 处理返回数据
- }
- })
- }
- })
复制代码- <view class="container">
- <view
- wx:for="{{list}}"
- wx:key="id"
- class="item"
- data-id="{{item.id}}"
- data-type="{{item.type}}"
- >
- <!-- 列表项内容 -->
- </view>
-
- <!-- 加载提示 -->
- <view class="loading" wx:if="{{loading}}">加载中...</view>
- </view>
复制代码
主要实现要点:
1.使用 createIntersectionObserver() 创建交叉观察器:
- 监听元素是否进入可视区域
- 可以设置触发阈值和观察的视口范围
2.数据加载控制:
- 使用 loading 状态防止重复请求
- 分页加载数据
- 可以使用节流函数控制请求频率
3.优化建议:
- 3. 优化建议:
- ```javascript
- // 添加节流函数
- function throttle(fn, delay = 500) {
- let timer = null
- return function(...args) {
- if (timer) return
- timer = setTimeout(() => {
- fn.apply(this, args)
- timer = null
- }, delay)
- }
- }
- // 使用节流优化滚动监听
- onPageScroll: throttle(function(e) {
- // 滚动处理逻辑
- })
- ```
复制代码 4. PHP 后端示例:
- <?php
- // 接收前端参数
- $visibleArea = $_POST['visible_area'];
- $page = $_POST['page'];
- // 处理数据
- $result = [
- 'list' => [], // 查询数据
- 'total' => 0,
- 'page' => $page
- ];
- // 返回 JSON
- echo json_encode($result);
复制代码
|
|