③ uni-app 生命周期(应用,页面,组件)、导航跳转+传参

本文深入讲解了uni-app的应用和页面生命周期、导航跳转方法及参数传递技巧、组件的创建与通信方式等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


写下博客主要用来分享知识内容,便于自我复习和总结。
如有错误之处,望各位指出。


生命周期

生命周期的概念:一个对象从创建、运行、销毁的整个过程被成为生命周期。

生命周期函数:在生命周期中每个阶段会伴随着每一个函数的触发,这些函数被称为生命周期函数。


应用的生命周期

uni-app 支持如下应用生命周期函数:

函数名说明
onLaunchuni-app 初始化完成时触发(全局只触发一次)
onShowuni-app 启动,或从后台进入前台显示
onHideuni-app 从前台进入后台
onErroruni-app 报错时触发

这部分应该很好理解。(通常写在App.vue)

<script>
export default {
	onLaunch: function() {
		// 常用来初始化相关信息,比如刚进入应用获取用户信息
		console.log('App Launch');
	},
	onShow: function() {
		console.log('App Show');
	},
	onHide: function() {
		console.log('App Hide');
	},
	onError: function(err){
		console.log('出现异常',err);
	}
};
</script>

在这里插入图片描述


页面的生命周期

uni-app 支持如下页面生命周期函数:

函数名说明平台差异说明最低版本
onLoad监听页面加载,其参数为上个页面传递的数据,参数类型为Object(用于页面传参),参考示例
onShow监听页面显示。页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面
onReady监听页面初次渲染完成。
onHide监听页面隐藏
onUnload监听页面卸载

演示:

<template>
	<view>详情页</view>
</template>

<script>
export default {
	data() {
		return {

		};
	},
	onLoad: function(){
		console.log('页面 Load');
	},
	onShow: function(){
		console.log('页面 Show');
	},
	onReady: function(){
		console.log('页面 Ready');
	},
	onHide: function(){
		console.log('页面 Hide');
	},
	onUnload: function(){
		console.log('页面 Unload');
	},
};
</script>

<style>
</style>

在这里插入图片描述
这里需要注意:

  • tabbar 切换第一次加载时可能渲染不及时,可以在每个tabbar页面的onLoad生命周期里先弹出一个等待雪花(hello uni-app使用了此方式)
  • tabbar 的页面展现过一次后就保留在内存中,再次切换 tabbar 页面,只会触发每个页面的onShow,不会再触发onLoad。

生命周期到底有什么用?接下来介绍一个重要的用法:导航跳转。


导航跳转


利用navigator进行跳转

navigator详细文档:文档地址

跳转到普通页面

<navigator url="/pages/about/about" hover-class="navigator-hover">
  <button type="default">跳转到about页面</button>
</navigator>

但是如果我们想跳转到tabbar的页面,上面的方式是跳转不过去的,必须要添加一个open-type:

<navigator url="/pages/message/message" open-type="switchTab">
  <button type="default">跳转到message页面</button>
</navigator>

这种方式还是很简单的。更多内容参考文档即可。

需要补充的是,open-type里的属性值redirect,会触发onUnload。


利用编程式导航进行跳转

利用navigateTo进行导航跳转

<button type="primary" @click="goAbout">跳转到关于页面</button>

通过navigateTo方法进行跳转到普通页面

methods: {
	goAbout () {
  		uni.navigateTo({
    		url: '/pages/about/about',
  		})
	}
}

同样地,我们不能用这种方式跳转到tabbar页面。

通过switchTab跳转到tabbar页面

跳转到tabbar页面

<button type="primary" @click="goMessage">跳转到message页面</button>

通过switchTab方法进行跳转

methods: {
	goMessage () {
  		uni.switchTab({
    		url: '/pages/message/message'
  		})
	}
}

导航跳转传递参数

这部分就是关键了。我们在导航进行跳转到下一个页面的同时,可以给下一个页面传递相应的参数,接收参数的页面可以通过onLoad生命周期进行接收。

传递参数的页面

<template>
	<view>
		<view>详情页</view>
		<button type="default" @click="goAbout">跳转</button>
	</view>
</template>

<script>
export default {
	methods: {
		goAbout(){
			uni.navigateTo({
				url: '../about/about?id=80'
			})
		}
	}
};
</script>

接收参数的页面

<template>
	<view>
		<view>about页面</view>
	</view>
</template>

<script>
export default {
	onLoad: function(options){
		console.log('页面 Load', options);
	}
};
</script>

此时我们点击按钮进行跳转,我们可以发现参数已经传递过来了。
在这里插入图片描述

不知道各位还记不记之前在介绍condition启动模式配置的时候,我们也传递了参数。现在就可以用这种方式来接收参数了。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
如果是动态传参,我们可以这样:

<script>
export default {
	data(){
		return{
			id: 80
		}
	},
	methods: {
		goAbout(){
			uni.navigateTo({
				url: '../about/about?id='+ this.id
			})
		}
	}
};
</script>

也可以这样:

<script>
export default {
	data(){
		return{
			id: 80,
			age: 20
		}
	},
	methods: {
		goAbout(){
			const {id,age} = this;
			let obj = {
				id,
				age
			}
			uni.navigateTo({
				url: '../about/about?'+ JSON.stringify(obj)
			})
		}
	}
};
</script>
<script>
export default {
	onLoad: function(options){
		for(let key in options){
			console.log('页面 Load', JSON.parse(key));
		}
	}
};
</script>

在这里插入图片描述


下拉刷新

在页面的生命周期中,有一个onPullDownRefresh
在这里插入图片描述
对于下拉刷新,之前的时候说过,要开启下拉刷新需要在page.json中配置enablePullDownRefresh为true:

	"globalStyle": { // 全局配置:如果页面配置有同名配置,全局配置将失效
		"navigationBarTextStyle": "white",
		"navigationBarTitleText": "uni-app",
		"navigationBarBackgroundColor": "#007AFF",
		"backgroundColor": "#70B575",	// 窗口背景色,当页面下拉时才能看到
		"enablePullDownRefresh": true,	// 开启下拉(只有在小程序开发工具才能看到效果)
		"backgroundTextStyle": "light"
	},

当然下拉刷新不必放在全局配置中,也可以放在指定的页面配置中。

页面中是转圈效果,小程序中是下拉刷新。

除此以外,其实还可以通过API方式去下拉刷新:api文档
无论用那种方式去下拉刷新,它都会去触发下拉生命周期:

<template>
	<view>
		<button @click="refresh">刷新</button>
	</view>
</template>

<script>
export default {
	methods: {
		refresh(){
			uni.startPullDownRefresh()
		}
	},
	onPullDownRefresh(){
		console.log('下拉刷新')
	}
};
</script>

<style>
</style>

如果我们在页面中使用下拉刷新,我们会发现转圈效果不会消失。
在这里插入图片描述
但我们其实可以为其设置什么时候停止当前页面下拉刷新:

<template>
	<view>
		<button @click="refresh">刷新</button>
	</view>
</template>

<script>
export default {
	methods: {
		refresh(){
			uni.startPullDownRefresh()
		}
	},
	onPullDownRefresh(){
		setTimeout(()=>{
			// 触发刷新,可以在这里调用接口,刷新数据
			// .......
			// 1000ms后,停止刷新(时间可以根据调接口耗时调整)
			uni.stopPullDownRefresh()
		},1000)
	}
};
</script>

<style>
</style>

上拉加载

对于上拉加载,我们依然先要去page.json中进行配置。
在这里插入图片描述

	"globalStyle": { 
		"navigationBarTextStyle": "white",
		"navigationBarTitleText": "uni-app",
		"navigationBarBackgroundColor": "#007AFF",
		"backgroundColor": "#70B575",
		"enablePullDownRefresh": true,	
		"backgroundTextStyle": "light",
		"onReachBottomDistance": 50 // 上拉触底事件触发时距页面底部距离
	},

然后页面中有一个生命周期onReachBottom,它就会在触底的时候触发。通常用于下拉下一页数据。
在这里插入图片描述

<template>
	<view>
		<view v-for="(item,index) in arr" :key="index">
			{{item}}
		</view>
	</view>
</template>

<script>
export default {
	data(){
		return{
			arr: ['JS','HTML','CSS','JS','HTML','CSS','JS','HTML','CSS','JS','HTML','CSS']
		}
	},
	onReachBottom(){
		console.log('触底了')
		// 调用接口,获取下一页数据
		// ......
		// this.arr.push('JS','HTML','CSS')
		this.arr = [...this.arr,...['JS','HTML','CSS']]
	}
};
</script>

<style>
	view{
		height: 100px;
		line-height: 100px;
	}
</style>

组件的创建

虽然之前提到不会再赘述Vue内容,但是uni-app中确实不可忽略组件的使用。组件部分内容需要有Vue基础,所以如果没学过Vue,再次推荐先去系统地学习一下Vue。这里为了整体内容完整性,简单的回顾一下,不详细说明。

在uni-app中,可以通过创建一个后缀名为vue的文件,即创建一个组件成功,其他组件可以将该组件通过impot的方式导入,在通过components进行注册即可。

组件的作用简单来说就是将多个组件共用的内容提取出来或者将未来可能改变的内容提取出来,方便之后的维护和管理。

  • 创建login组件,在component中创建login目录,然后新建login.vue文件

    <template>
    	<view>
    		这是一个自定义组件
    	</view>
    </template>
    
    <script>
    </script>
    
    <style>
    </style>
    
  • 在其他组件中导入该组件并注册

    import login from "@/components/login/login.vue"
    
  • 注册组件

    components: {login}
    
  • 使用组件

    <login></login>
    

在这里插入图片描述

知道以上内容后,我们就可以用这种方式使用uni-ui。

简单举例:

uni-ui文档

1、导入组件

import uniGrid from "@/components/uni-grid/uni-grid.vue"
import uniGridItem from "@/components/uni-grid-item/uni-grid-item.vue"

2、注册组件

components: {uniGrid,uniGridItem}

3、使用组件

<uni-grid :column="3">
  <uni-grid-item>
    <text class="text">文本</text>
  </uni-grid-item>
  <uni-grid-item>
    <text class="text">文本</text>
  </uni-grid-item>
  <uni-grid-item>
    <text class="text">文本</text>
  </uni-grid-item>
</uni-grid>

组件的生命周期

不在这里详细演示了,感兴趣的可以参考官方文档,或者我的文章Vue基本用法

beforeCreate在实例初始化之后被调用。详见
created在实例创建完成后被立即调用。详见
beforeMount在挂载开始之前被调用。详见
mounted挂载到实例上去之后调用。详见 注意:此处并不能确定子组件被全部挂载,如果需要子组件完全挂载之后在执行操作可以使用$nextTickVue官方文档
beforeUpdate数据更新时调用,发生在虚拟 DOM 打补丁之前。详见仅H5平台支持
updated由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用该钩子。详见仅H5平台支持
beforeDestroy实例销毁之前调用。在这一步,实例仍然完全可用。详见
destroyedVue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。详见

组件通信

Vue里的组件通信:我的文章

简单回顾常用用法:

通过props来接受外界传递到组件内部的值

<template>
	<view>
		这是一个自定义组件 {{msg}}
	</view>
</template>

<script>
	export default {
		props: ['msg']
	}
</script>

<style>
</style>

其他组件在使用login组件的时候传递值

<template>
	<view>
		<test :msg="msg"></test>
	</view>
</template>

<script>
	import test from "@/components/test/test.vue"
	export default {
		data () {
			return {
				msg: 'hello'
			}
		},
		components: {test}
	}
</script>

通过$emit触发事件进行传递参数

<template>
	<view>
		这是一个自定义组件 {{msg}}
		<button type="primary" @click="sendMsg">给父组件传值</button>
	</view>
</template>

<script>
	export default {
		data () {
			return {
				status: '打篮球'
			}
		},
		props: {
			msg: {
				type: String,
				value: ''
			}
		},
		methods: {
			sendMsg () {
				this.$emit('myEvent',this.status)
			}
		}
	}
</script>

父组件定义自定义事件并接收参数

<template>
	<view>
		<test :msg="msg" @myEvent="getMsg"></test>
	</view>
</template>
<script>
	import test from "@/components/test/test.vue"
	export default {
		data () {
			return {
				msg: 'hello'
			}
		},
		methods: {
			getMsg (res) {
				console.log(res)
			}
		},
		components: {test}
	}
</script>

<think>我们正在使用uni-app框架,需要实现a标签跳转本地页面的功能。根据uni-app的文档,它不支持传统的HTMLa标签进行页面跳转,而是提供了自己的导航API。在uni-app中,我们可以使用`<navigator>`组件或者调用API如`uni.navigateTo`来实现页面跳转。根据提供的引用:引用[3]提到了在pages.json中配置tabBar以及页面跳转,说明uni-app页面跳转是基于路由的。引用[1]展示了通过按钮点击事件进行跳转,使用了`uni.navigateTo`(但示例中是`goAbout`方法,假设其内部使用了uni.navigateTo或类似API)。因此,我们可以这样实现:1.使用`<navigator>`组件,它类似于a标签,可以指定跳转的url。2.使用事件处理函数,在函数中调用`uni.navigateTo`等API。但是,用户特别提到要使用a标签。由于uni-app不支持标准的a标签跳转本地页面,我们需要用其他方式模拟。解决方案:方案一:使用`<navigator>`组件,设置url属性指向本地页面路径(相对于pages目录,无需后缀)。示例:`<navigatorurl="/pages/about/about">跳转到关于页面</navigator>`方案二:使用`<view>`或`<text>`等标签,添加点击事件,在事件中调用`uni.navigateTo`。根据引用[1]的示例,我们可以这样写:```html<buttontype="primary"@click="goAbout">跳转到关于页面</button>```在methods中:```javascriptmethods:{goAbout(){uni.navigateTo({url:'/pages/about/about'});}}```但是,用户要求使用a标签。我们可以这样解释:uni-app中并没有提供a标签的跳转功能,但是我们可以通过样式将一个文本或按钮样式化为类似a标签(带下划线、蓝色等),然后给它绑定点击事件。然而,如果我们坚持使用a标签,可以这样尝试(虽然不推荐,因为uni-app会将其视为普通标签):```html<ahref="javascript:void(0);"@click="goAbout">跳转到关于页面</a>```然后在goAbout方法中使用uni.navigateTo跳转。但这样做的缺点是,a标签在uni-app中可能没有默认样式,且不符合uni-app组件规范。所以,最佳实践是使用`<navigator>`组件,因为它就是uni-app中用于页面跳转组件,其行为类似于a标签。总结:推荐使用`<navigator>`组件。步骤:1.在pages.json中已经配置了页面路由(假设我们要跳转页面已经配置好了)。2.在模板中使用`<navigator>`,并设置url属性。示例代码:```html<navigatorurl="/pages/about/about">关于我们</navigator>```如果需要传递参数,可以像这样:```html<navigatorurl="/pages/about/about?id=1">关于我们</navigator>```在目标页面的onLoad生命周期函数中可以获取参数。另外,注意`<navigator>`组件默认是内联元素,可以设置样式使其看起来像链接(比如蓝色文字,下划线等)。相关问题:1.如何在uni-app中实现页面间传递参数?2.uni-app中的导航API有哪些?它们有什么区别?3.如何配置uni-app页面路由?根据以上思路,我们给出回答。</think>在 uni-app 中实现类似 a 标签的本地页面跳转,推荐使用以下两种方法(原生 HTML 的 `<a>` 标签无法直接实现 uni-app 的路由跳转): ### 方法一:使用 `<navigator>` 组件(最佳实践) 这是 uni-app 官方推荐的导航组件,行为类似 a 标签: ```html <navigator url="/pages/about/about" hover-class="navigator-hover"> 跳转到关于页面 </navigator> <!-- 带参数跳转 --> <navigator url="/pages/detail/detail?id=123&type=news">商品详情</navigator> ``` **特点**: 1. 通过 `url` 属性指定目标页面路径(基于 `pages.json` 配置的路径) 2. 支持传递查询参数(如 `?id=123`) 3. 可添加 `hover-class` 实现点击反馈效果 4. 默认打开方式为 `navigateTo`(保留当前页) ### 方法二:通过事件触发 API 跳转 使用点击事件调用 uni-app 路由 API: ```html <view @click="gotoPage('/pages/about/about')" class="link-style">关于我们</view> ``` 在 `methods` 中定义跳转逻辑: ```javascript methods: { gotoPage(path) { uni.navigateTo({ url: path }); } } ``` ### 关键配置说明 1. **页面路径配置**: 所有可跳转页面必须在 `pages.json` 中注册[^3],例如: ```json "pages": [ {"path": "pages/index/index"}, {"path": "pages/about/about"} ] ``` 2. **路由 API 对比**: | API | 效果 | 对应组件 | |-------------------|-----------------------------|---------------------| | `uni.navigateTo` | 保留当前页(有返回按钮) | `<navigator>` 默认 | | `uni.redirectTo` | 关闭当前页(无返回) | `<navigator open-type="redirect">` | | `uni.switchTab` | 切换 TabBar 页面 | `<navigator open-type="switchTab">` | | `uni.reLaunch` | 关闭所有页打开新页 | `<navigator open-type="reLaunch">` | ### 样式建议 添加 CSS 使元素看起来像传统链接: ```css .link-style { color: #007AFF; text-decoration: underline; cursor: pointer; } ``` ### 注意事项 1. 跳转路径**不需要**文件后缀(如 `.vue` 或 `.nvue`) 2. 路径前加 `/` 表示绝对路径(从项目根目录开始) 3. TabBar 页面必须使用 `switchTab` 跳转[^3] 4. 传递对象参数需先通过 `JSON.stringify` 转换 > 通过 `<navigator>` 组件或路由 API 实现页面跳转uni-app 的标准做法,这确保了跨平台兼容性(H5/小程序/App)[^1][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端Jerry_Zheng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值