1. 什么是uniapp
Uniapp是一种基于Vue.js开发的跨平台应用开发框架,它集成了HBuilderX开发工具,可以进行编译、预览、调试等操作,支持多端发布。Uniapp可以将一个Vue项目同时编译成H5、iOS、Android、小程序等多种平台的应用,大大简化了跨平台应用的开发难度和工作量。Uniapp的架构图如下:
├── dist // 编译后的文件
├── public // 公共资源文件
│ ├── index.html // 入口页面
│ └── favicon.ico // 网站图标
├── src // 源码目录
│ ├── components // 公共组件
│ ├── pages // 页面
│ ├── static // 静态资源
│ ├── App.vue // 根组件
│ ├── main.js // 入口文件
│ ├── manifest.json // 配置文件
│ └── uni.scss // 全局样式
├── unpackage // 打包文件
│ ├── android // 安卓平台
│ ├── ios // ios平台
│ ├── weixin // 小程序
│ ├── H5 // H5
├── .gitignore // 忽略提交的文件
├── package.json // 项目配置文件
└── README.md // 项目说明
2. uniapp中的页面跳转机制
在uniapp中,页面跳转可以使用uniapp提供的API或者Vue路由的方式。无论使用哪种方式,都需要注意当前页的清空问题。
2.1 使用uniapp提供的API进行页面跳转
uniapp提供了以下API进行页面跳转:
navigateTo
redirectTo
switchTab
reLaunch
其中,navigateTo和redirectTo都是普通的跳转方式,不同的是navigateTo可以返回上一页,而redirectTo则不行。switchTab则是跳转到tabBar页面,reLaunch是先关闭所有页面再跳转。这些API的使用方式都类似,以navigateTo为例:
uni.navigateTo({
url: '/pages/index/index'
})
这会跳转到名为index的页面。其中,url字段表示目标页面的路径。需要注意的是,如果目标页面和当前页属于同一页面级别,则不会进行页面跳转,而是会触发uniapp的刷新机制。如果目标页面和当前页属于同一页面级别,但需要进行页面跳转,则需要手动清空当前页。
2.2 使用Vue路由进行页面跳转
如果想要在uniapp中使用Vue路由的方式进行页面跳转,需要先安装vue-router插件,具体使用方式可参考Vue路由官方文档。在使用Vue路由跳转页面时,同样需要注意当前页的清空问题。
3. 为什么需要清空当前页
在上文中已经提到,如果目标页面和当前页属于同一页面级别,则不会进行页面跳转,而是会触发uniapp的刷新机制。在uniapp中,页面的刷新是基于Vue实现的,类似于Vue的单页应用,因此在进行页面跳转时,如果不手动清空当前页,可能会导致数据残留或者事件监听器未清除等问题,进而影响到程序的正常运行。具体原因如下:
数据残留问题:在使用Vue进行页面开发时,一个组件中的数据和方法是独立的,和其他组件中的数据和方法是隔离的。但是如果在进行页面跳转时,不清空当前页,可能会导致当前组件中的数据和方法没有被清空,进而影响到目标组件中的数据和方法。
事件监听器未清除问题:在Vue中,当一个组件销毁时,会自动销毁该组件中的事件监听器,避免错乱。但如果在进行页面跳转时,不清空当前页,可能会导致当前组件中的事件监听器未被清除,进而影响到其他组件的表现。
缓存问题:uniapp支持对页面进行缓存,缓存的页面可以在下次进入相同页面时直接使用缓存,省去了重新渲染的时间。但是如果在进行页面跳转时,不清空当前页,可能会导致缓存的页面和当前页冲突,进而导致页面样式和数据的错误。
4. 如何清空当前页
在uniapp中,清空当前页的方式有以下几种:
手动清空:可以在页面的生命周期方法中手动清空数据和监听器,以确保当前页被完全清空。代码如下:
export default {
data() {
return {
count: 0
}
},
created() {
console.log('created')
},
mounted() {
console.log('mounted')
},
beforeDestroy() {
console.log(this.count)
this.count = null // 清空数据
this.$off() // 清空监听器
}
}
使用uniapp提供的页面生命周期:uniapp提供了onHide、onUnload等生命周期方法,可以在这些方法中进行数据清空。需要注意的是,onHide和onUnload的调用时机不同,具体可以参考uniapp官方文档。代码如下:
export default {
data() {
return {
count: 0
}
},
onHide() {
console.log(this.count)
this.count = null // 清空数据
},
onUnload() {
console.log(this.count)
this.count = null // 清空数据
}
}
使用Vue的Keep-Alive组件:在uniapp中,使用Keep-Alive组件可以对页面进行缓存,从而减少页面重复渲染的时间。使用Keep-Alive组件时,需要注意与当前页的清空问题。代码如下:
<template>
<keep-alive>
<router-view></router-view>
</keep-alive>
</template>
<script>
export default {
name: 'App',
created() {
console.log('created')
},
mounted() {
console.log('mounted')
},
beforeDestroy() {
console.log('beforeDestroy')
}
}
</script>
5. 总结
在uniapp中,页面跳转是一个常见的操作,需要注意当前页的清空问题。没有清空当前页可能会导致数据残留、事件监听器未清除、缓存问题等问题。可以通过手动清空、使用uniapp提供的页面生命周期、使用Vue的Keep-Alive组件等方式进行当前页的清空,以确保程序的正常运行。