1.问题描述
在使用uni-app进行开发时,由于页面内容较多,会出现首页滚动不流畅的问题,这给用户浏览带来了不便,同时也影响了应用的用户体验。
2.问题分析
造成首页滚动不流畅的原因可能有以下几种情况:
2.1 列表数据过多
如果首页中的列表数据过多,会导致页面渲染过程中的性能瓶颈,造成页面滑动卡顿。
onLoad() {
let list = [];
for (let i = 0; i < 500; i++) {
list.push({
id: i,
name: 'name' + i
})
}
this.list = list;
}
以上代码会在页面加载时,生成500条数据,造成渲染过程中卡顿。解决方法是尽量避免一次性生成大量数据,或者采用分页或懒加载的方式减轻渲染压力。
2.2 图片过多或过大
Home界面中的图片通常是大量使用的,如果图片过多或者单张图片过大,会引起页面渲染的性能问题。
<template>
<div v-for="(item, index) in list" :key="index">
<img :src="item.src" />
</div>
</template>
<script>
export default {
data() {
return {
list: [
{src: 'https://xxxx/xxx.jpg'},
{src: 'https://xxxx/xxx.jpg'},
{src: 'https://xxxx/xxx.jpg'},
{src: 'https://xxxx/xxx.jpg'},
{src: 'https://xxxx/xxx.jpg'},
{src: 'https://xxxx/xxx.jpg'},
{src: 'https://xxxx/xxx.jpg'},
{src: 'https://xxxx/xxx.jpg'}
]
}
}
}
</script>
以上代码中,一个页面中会加载8张图片,如果图片大小都超过100kb,那么页面加载的时间会很长,造成页面卡顿的情况。
2.3 页面结构过于复杂
如果页面结构过于复杂,如过多的嵌套和层级,也会造成页面滑动卡顿的问题。
<template>
<div class="swiper-container">
<div class="swiper-wrapper">
<div class="swiper-slide">
<div class="tab">
<div class="tab-item active">项1</div>
<div class="tab-item">项2</div>
<div class="tab-item">项3</div>
<div class="tab-item">项4</div>
</div>
</div>
</div>
</div>
</template>
<style>
.tab {
width: 100%;
display: inline-flex;
justify-content: space-between;
align-items: center;
}
.tab-item {
flex: 1;
height: 60px;
display: flex;
justify-content: center;
align-items: center;
border-top: 1px solid #eee;
border-left: 1px solid #eee;
border-right: 1px solid #eee;
}
</style>
以上代码中的页面结构就过于复杂,并且存在嵌套和层级过多的情况。
2.4 其他原因
除了以上几种情况,首页滑动卡顿还可能是其他一些原因造成的,比如网络请求过多、JS执行效率低下等等。
3. 解决方案
根据以上问题分析,我们提出以下主要解决方案。
3.1 减少列表数据的数量
当列表数据较多时,可以使用动态加载的方式,或者使用分页显示的方式。
onLoad() {
let list = [];
for (let i = 0; i < 20; i++) {
list.push({
id: i,
name: 'name' + i
})
}
this.list = list;
},
// 点击加载更多
onLoadMore() {
let list = [];
for (let i = 20; i < 40; i++) {
list.push({
id: i,
name: 'name' + i
})
}
this.list = [...this.list, ...list];
},
以上代码中,在页面加载时只显示20条数据,当需要加载更多数据时,再去动态加载,可以减轻首页滚动卡顿的问题。
3.2 图片压缩
对于一般的手机设备,大部分屏幕分辨率不高于2K,因此无需过度追求图片的高清显示。在保证品质的前提下,压缩图片大小会极大的提升页面的加载速度。Uni-app提供了LQIP(“ 低质量图片占位符 ”)功能可以有效的解决该问题。
<template>
<div class="item-image">
<img :data-src="item.src" src="../../static/images/placeholder.png" uni-img>
</div>
</template>
<style>
.item-image img {
width: 100%;
height: auto;
}
</style>
<script>
export default {
data() {
return {
list: [
{src: 'https://xxxx/xxx.jpg'},
{src: 'https://xxxx/xxx.jpg'},
{src: 'https://xxxx/xxx.jpg'},
{src: 'https://xxxx/xxx.jpg'},
{src: 'https://xxxx/xxx.jpg'},
{src: 'https://xxxx/xxx.jpg'}
]
}
}
}
</script>
以上代码中,使用了uni-app提供的LQIP功能,可以在图片加载完成之前,先使用占位符进行展示。
3.3 精简页面结构
精简页面结构可以从减少嵌套和层级入手,避免过多无用的标签和样式。
<template>
<div class="tab">
<div class="tab-item active">项1</div>
<div class="tab-item">项2</div>
<div class="tab-item">项3</div>
<div class="tab-item">项4</div>
</div>
</template>
<style>
.tab {
width: 100%;
display: flex;
justify-content: space-between;
align-items: center;
}
.tab-item {
flex: 1;
height: 60px;
display: flex;
justify-content: center;
align-items: center;
border-top: 1px solid #eee;
border-left: 1px solid #eee;
border-right: 1px solid #eee;
}
.tab-item.active {
color: #fff;
background-color: #f25f5c;
}
</style>
以上代码中,通过去掉无用的div层级,优化了页面结构。
3.4 其他方案
尽量减少使用JS对DOM进行频繁的操作,使用一些工具和框架,如vue实现数据动态绑定;
尽量使用CSS3的动画效果,避免使用JS来实现动画效果;
使用缓存、减少网络请求等方法加速数据加载,提升用户体验。
4. 总结
通过分析和解决首页滑动卡顿的问题,可以显著提高用户体验,避免因为滑动卡顿而导致用户流失。在开发过程中,我们应该重视首页滑动卡顿的问题,及时采用一些解决策略,优化首页的性能。