您的位置:

微信小程序列表渲染最佳实践

一、选择合适的列表渲染方式

在微信小程序中,列表渲染方式有两种:wx:for和

对于较简单的列表结构,可以直接使用wx:for进行渲染,在wxml文件中引入js文件中定义的数据即可。例如:




   
  
    
    
     {{item.content}}
     
  
    

   

// JS代码
data: {
  list: [
    {id: 1, content: 'item1'},
    {id: 2, content: 'item2'},
    {id: 3, content: 'item3'}
  ]
}

如果列表结构比较复杂,可以使用




   
  
    
  
    

   

// JS代码
data: {
  list: [
    {id: 1, title: 'title1', content: 'content1'},
    {id: 2, title: 'title2', content: 'content2'},
    {id: 3, title: 'title3', content: 'content3'}
  ]
}

二、优化列表性能

对于较大的列表,直接使用wx:for进行渲染会影响性能,可以考虑使用scroll-view组件进行优化。scroll-view组件会在屏幕上渲染可见区域和几个即将出现的元素,而不会渲染整个列表,大大提高了渲染速度。例如:




   
  
    
    
     {{item.content}}
     
  
    

   

// JS代码
data: {
  list: [
    {id: 1, content: 'item1'},
    {id: 2, content: 'item2'},
    {id: 3, content: 'item3'},
    {id: 4, content: 'item4'},
    {id: 5, content: 'item5'},
    {id: 6, content: 'item6'},
    {id: 7, content: 'item7'},
    {id: 8, content: 'item8'},
    {id: 9, content: 'item9'},
    {id: 10, content: 'item10'}
  ]
}

另外,还可以使用分页加载的方式对列表进行优化。在首次加载时只渲染部分数据,在用户滑动到底部时加载更多数据。这种方式可以减少首次加载时间,提高用户体验。例如:


// JS代码
data: {
  list: [],
  page: 1,
  size: 10,
  hasMore: true,
  loadingMore: false
},

onLoad: function() {
  this.loadData()
},

onReachBottom: function() {
  if (!this.data.loadingMore && this.data.hasMore) {
    this.loadData()
  }
},

loadData: function() {
  this.setData({
    loadingMore: true
  })
  wx.request({
    url: 'https://api.example.com/list',
    data: {
      page: this.data.page,
      size: this.data.size
    },
    success: res => {
      let data = res.data
      if (data.length < this.data.size) {
        this.setData({
          hasMore: false
        })
      }
      this.setData({
        list: this.data.list.concat(data),
        page: this.data.page + 1,
        loadingMore: false
      })
    }
  })
}

三、优化列表渲染性能

在列表渲染时,避免频繁地对DOM进行操作可以提高性能。可以将要更新的数据保存在一个新的对象中,再使用setData一次性更新到页面中。例如:


// JS代码
data: {
  list: [],
  dataMap: {}
},

loadData: function() {
  wx.request({
    url: 'https://api.example.com/list',
    success: res => {
      let list = res.data
      let dataMap = {}
      list.forEach(item => {
        dataMap['id_' + item.id] = item
      })
      this.setData({
        list: list,
        dataMap: dataMap
      })
    }
  })
},

onClickItem: function(e) {
  let id = e.currentTarget.dataset.id
  let item = this.data.dataMap['id_' + id]
  // ...
}

另外,可以使用虚拟滚动的方式优化列表渲染性能。虚拟滚动是一种只渲染可见部分的列表渲染方式,可以减少DOM操作和渲染时间,提高性能。注意,虚拟滚动需要自己实现,需要考虑多种情况,如滑动方向、滑动速度等。这里只提供一个简单的示例:


// JS代码
data: {
  startIndex: null,
  endIndex: null,
  list: []
},

onScroll: function(e) {
  let scrollTop = e.detail.scrollTop
  let itemHeight = 50
  let height = e.detail.height
  let startIndex = Math.floor(scrollTop / itemHeight)
  let endIndex = Math.min(startIndex + height / itemHeight + 1, this.data.list.length - 1)
  this.setData({
    startIndex: startIndex,
    endIndex: endIndex
  })
},

loadData: function() {
  wx.request({
    url: 'https://api.example.com/list',
    success: res => {
      this.setData({
        list: res.data
      })
    }
  })
}

四、过滤、排序与分组

在实际应用中,列表渲染往往需要进行数据过滤、排序和分组等操作。可以使用JavaScript内置的方法,如filter、sort和reduce等,对列表数据进行操作。例如:


// JS代码
data: {
  list: [
    {id: 1, status: 1, name: 'item1'},
    {id: 2, status: 2, name: 'item2'},
    {id: 3, status: 1, name: 'item3'},
    {id: 4, status: 2, name: 'item4'},
    {id: 5, status: 3, name: 'item5'}
  ]
},

onFilter: function() {
  let filtered = this.data.list.filter(item => item.status === 1)
  this.setData({
    list: filtered
  })
},

onSort: function() {
  let sorted = this.data.list.sort((a, b) => b.id - a.id)
  this.setData({
    list: sorted
  })
},

onGroup: function() {
  let grouped = this.data.list.reduce((groups, item) => {
    let groupId = 'group_' + item.status
    if (!groups[groupId]) {
      groups[groupId] = {
        id: groupId,
        name: 'Group ' + item.status,
        list: []
      }
    }
    groups[groupId].list.push(item)
    return groups
  }, {})
  let list = []
  for (let key in grouped) {
    list.push(grouped[key])
  }
  this.setData({
    list: list
  })
}

微信小程序列表渲染最佳实践

2023-05-22
渲染序列,maya渲染序列

2022-11-29
微信小程序关键词推荐:如何使用wx:for实现列表渲染

2023-05-18
微信小程序js动画,微信小程序各种动画

本文目录一览: 1、微信小程序—用动画实现自定义轮播图 2、重磅:微信小程序发布WeUI.js 官方视觉组件库! 3、微信小程序之自定义模态弹窗(带动画)实例 微信小程序—用动画实现自定义轮播图 新接

2023-12-08
微信小程序js动画,微信小程序各种动画

本文目录一览: 1、微信小程序—用动画实现自定义轮播图 2、重磅:微信小程序发布WeUI.js 官方视觉组件库! 3、微信小程序之自定义模态弹窗(带动画)实例 微信小程序—用动画实现自定义轮播图 新接

2023-12-08
微信小程序中引入js(添加微信小程序)

本文目录一览: 1、微信小程序 怎么用第三方js库 jquery 2、微信小程序,weixin,小程序怎么引入js闭包 3、微信小程序wxml中使用js函数 4、微信小程序(上) 5、重磅:微信小程序

2023-12-08
微信小程序字体大小调整

2023-05-16
cssjs渲染机制,html渲染机制

本文目录一览: 1、渲染机制、回流、重绘 2、浏览器中动画渲染效率原生js高还是css高? 3、浏览器的渲染过程及涉及到的缓存机制 4、前端性能优化总结(一)-js、css优化 渲染机制、回流、重绘

2023-12-08
Vue.js实现组件化开发-最佳实践

2023-05-17
js和微信小程序(js和微信小程序关联)

本文目录一览: 1、重磅:微信小程序发布WeUI.js 官方视觉组件库! 2、微信小程序wxml中使用js函数 3、微信小程序wxs的使用(当页面数据渲染前添加js操作) 4、怎样用js开发微信小程序

2023-12-08
Renders:一个高性能的网页渲染引擎

2023-05-21
微信小程序js改变dom(微信小程序appjs)

本文目录一览: 1、微信小程序 动态修改元素class 2、微信小程序点击切换class 3、微信小程序怎么将EBD格式的文件转化成json? 4、微信小程序不能操作dom吗 5、微信小程序怎么开发

2023-12-08
Java微信小程序开发教程

2023-05-20
笔记本渲3dmax太慢怎么提升,3dmax渲染特别慢怎么调

2022-12-01
微信小程序js上下文,微信小程序appjs

本文目录一览: 1、微信小程序是用什么技术实现的? 2、微信小程序的index.js怎么写?详细代码见下方↓ 3、微信小程序wxs的使用(当页面数据渲染前添加js操作) 4、怎样用js开发微信小程序

2023-12-08
wx:forwx:key是如何影响列表渲染的

2023-05-21
微信小程序复选框的实现方法

2023-05-20
关于微信小程序jsdata的信息

本文目录一览: 1、微信小程序怎么在js中获取定义在page data里的值 2、微信小程序javascript修改data值的问题 3、微信小程序如何获取javascript 里的数据 4、微信小程

2023-12-08
数据库的笔记mysql,数据库管理系统笔记

2022-11-24
vue:key--实现高效渲染

2023-05-22