页签内容懒加载

一个内容丰富的选项卡,通常会包含许多页签内容。如新闻类应用中,可能会包括:推荐、热点、视频、段子、汽车、社会、娱乐等

直接使用tabs默认会加载所有页签内容,导致 JS 线程持续忙于渲染每个页签,无法响应用户点击事件等,造成体验困扰

为了解决这类问题,开发者可以让页签内容在用户点击时延迟渲染(而不是整个页面初始化时渲染),这项功能可以通过if指令完成

示例代码如下:

  1. <template>
  2. <div class="tutorial-page">
  3. <tabs onchange="onChangeTabIndex">
  4. <tab-bar class="tab-bar" mode="scrollable">
  5. <text for="{{tabHeadList}}" class="{{currentIndex === $idx ? 'active' : ''}}">{{$item.title}}</text>
  6. </tab-bar>
  7. <tab-content class="tab-content">
  8. <div class="tab-content-section" for="{{tabHeadList}}">
  9. <!-- 初始化时,if为false,默认不渲染;页签被首次点击时,对应页签内容的if由false改为true -->
  10. <text if="{{$item.render}}">{{$item.title}}</text>
  11. </div>
  12. </tab-content>
  13. </tabs>
  14. </div>
  15. </template>
  16. <style lang="less">
  17. .tutorial-page {
  18. flex-direction: column;
  19. justify-content: center;
  20. align-items: center;
  21. .tab-bar text{
  22. padding: 0 25px;
  23. text-align: center;
  24. font-size: 34px;
  25. }
  26. .tab-bar .active {
  27. color: #FF0000;
  28. }
  29. .tab-content {
  30. flex: 1;
  31. background-color: #eeeeee;
  32. .tab-content-section {
  33. flex: 1;
  34. margin: 10px;
  35. background-color: #ffffff;
  36. justify-content: center;
  37. text {
  38. text-align: center;
  39. color: #FF0000;
  40. }
  41. }
  42. }
  43. }
  44. </style>
  45. <script>
  46. export default {
  47. private: {
  48. tabHeadList: [
  49. { title: '推荐', render: false },
  50. { title: '热门', render: false },
  51. { title: '视频', render: false },
  52. { title: '段子', render: false },
  53. { title: '汽车', render: false },
  54. { title: '社会', render: false },
  55. { title: '娱乐', render: false },
  56. { title: '军事', render: false },
  57. { title: '体育', render: false },
  58. { title: '财经', render: false }
  59. ],
  60. currentIndex: 0
  61. },
  62. onInit () {
  63. this.$page.setTitleBar({ text: '页签内容懒加载' })
  64. },
  65. /**
  66. * 修改列表中对应索引的数据项
  67. * @param index
  68. */
  69. modifyListItemData (index) {
  70. this.tabHeadList[index].render = true
  71. },
  72. /**
  73. * 监听tabs组件index的改变,index默认为0
  74. * @param evt
  75. */
  76. onChangeTabIndex (evt) {
  77. this.currentIndex = evt.index
  78. this.modifyListItemData(evt.index)
  79. }
  80. }
  81. </script>