页签内容懒加载
一个内容丰富的选项卡
,通常会包含许多页签内容。如新闻类应用中,可能会包括:推荐、热点、视频、段子、汽车、社会、娱乐等
直接使用tabs
默认会加载所有页签内容,导致 JS 线程持续忙于渲染每个页签,无法响应用户点击事件等,造成体验困扰
为了解决这类问题,开发者可以让页签内容在用户点击时延迟渲染(而不是整个页面初始化时渲染),这项功能可以通过if指令
完成
示例代码如下:
<template>
<div class="tutorial-page">
<tabs onchange="onChangeTabIndex">
<tab-bar class="tab-bar" mode="scrollable">
<text for="{{tabHeadList}}" class="{{currentIndex === $idx ? 'active' : ''}}">{{$item.title}}</text>
</tab-bar>
<tab-content class="tab-content">
<div class="tab-content-section" for="{{tabHeadList}}">
<!-- 初始化时,if为false,默认不渲染;页签被首次点击时,对应页签内容的if由false改为true -->
<text if="{{$item.render}}">{{$item.title}}</text>
</div>
</tab-content>
</tabs>
</div>
</template>
<style lang="less">
.tutorial-page {
flex-direction: column;
justify-content: center;
align-items: center;
.tab-bar text{
padding: 0 25px;
text-align: center;
font-size: 34px;
}
.tab-bar .active {
color: #FF0000;
}
.tab-content {
flex: 1;
background-color: #eeeeee;
.tab-content-section {
flex: 1;
margin: 10px;
background-color: #ffffff;
justify-content: center;
text {
text-align: center;
color: #FF0000;
}
}
}
}
</style>
<script>
export default {
private: {
tabHeadList: [
{ title: '推荐', render: false },
{ title: '热门', render: false },
{ title: '视频', render: false },
{ title: '段子', render: false },
{ title: '汽车', render: false },
{ title: '社会', render: false },
{ title: '娱乐', render: false },
{ title: '军事', render: false },
{ title: '体育', render: false },
{ title: '财经', render: false }
],
currentIndex: 0
},
onInit () {
this.$page.setTitleBar({ text: '页签内容懒加载' })
},
/**
* 修改列表中对应索引的数据项
* @param index
*/
modifyListItemData (index) {
this.tabHeadList[index].render = true
},
/**
* 监听tabs组件index的改变,index默认为0
* @param evt
*/
onChangeTabIndex (evt) {
this.currentIndex = evt.index
this.modifyListItemData(evt.index)
}
}
</script>