uniapp微信小程序系列(1)基础与入门

uni-app 是一个使用 Vue.js (opens new window)开发所有前端应用的框架,支持iOS、Android、Web及各平台小程序。本系列文章为uni-app开发微信小程序知识点的归纳总结。

项目创建推荐

如果你是新手,项目创建一般推荐:uni-ui项目,该项目架构包含了uni官方提供的内嵌UI组件库,方便直接使用。

如果你已经对uni-app很熟悉,能熟练使用uView等UI框架及相关配置,建议创建 “默认模板” 新建项目。

页面生命周期归纳

uni-app中的页面文件,通常会存放在工程根目录下的pages文件夹。

每次新建页面,均需在pages.json中配置pages列表;未在pages.json -> pages 中配置的页面,uni-app会在编译阶段进行忽略。pages.json的完整配置参考(官网):全局文件。

小程序页面的生命周期,主要包括:

onLoad:监听页面加载事件,其参数为上个页面传递的数据,参数类型为 Object(用于页面传参),当页面来源为回退操作navigateBack或tab切换时,该函数不再重复执行

onShow:监听页面显示事件。页面每次出现在屏幕上都触发,包括页面来源为回退操作navigateBack或tab切换

onReady:监听页面初次渲染完成。注意如果渲染速度快,会在页面进入动画完成前触发,当页面来源为回退操作navigateBack或tab切换时,该函数不再重复执行

扫描二维码关注公众号,回复: 15621773 查看本文章

正常情况下的执行顺序:1)onLoad —— 2)onShow —— 3)onReady

onUnload:监听页面卸载事件

onResize:监听窗口尺寸变化

onPullDownRefresh:监听用户下拉动作,下拉刷新,需要在page.json开启该页面下拉刷新权限

onReachBottom:页面滚动到底部的事件。可在pages.json里定义具体页面底部的触发距离onReachBottomDistance,比如设为50,那么滚动页面到距离底部50px时,就会触发onReachBottom事件。

onTabItemTap:点击 tab 切换时触发,参数为Object

onShareAppMessage:小程序右上角分享给好友

onShareTimeline:小程序右上角分享至朋友圈

onAddToFavorites:小程序右上角收藏

onPageScroll:监听页面滚动,参数为Object。回调参数scrollTop表示页面在垂直方向已滚动的距离

App.vue文件概述

App.vue是uni-app的主组件,所有页面都是在App.vue下进行切换的,是页面入口文件。App.vue本身不是页面,这里不能编写视图元素,也就是没有<template>

这个文件的作用包括:调用应用生命周期函数、配置全局样式、配置全局的存储globalData

1)应用主要生命周期:

onLaunch:初始化完成时触发(全局只触发一次)

onShow:应用启动或从后台进入前台触发

onHide:从前台进入后台触发

onPageNotFound:页面不存在监听函数。比如通过分享卡片、小程序码且发现页面不存在,才会触发,通过路由api实现跳转不存在的页面不会触发(如 uni.navigateTo)

2)应用全局变量定义:globalData

在子页面中使用 getApp().globalData 获取变量对象,可以对全局变量对象进行修改

在App.vue中定义代码如下:

<script>
	export default {
		globalData: {
			text: '20220922'
		},
		onLaunch: function() {
			console.log('App Launch')
			console.log(this.globalData.text) 
		},
		onShow: function() {
			console.log('App Show')
		},
		onHide: function() {
			console.log('App Hide')
		}
	}
</script>

在子页面中使用全局变量 globalData:

<script>
	export default {
		data() {
			return {}
		},
		// 页面加载
		onLoad() {
			console.log('onLoad');
			const app = getApp();
			console.log(app.globalData.text) // '20220922'
			app.globalData.text = 'abc'; //  允许对全局变量进行修改
			console.log(app.globalData.text) // 'abc'
		}
	}
</script>

css全局样式配置,如:

<style lang="scss">
	// 设置整个项目的背景色
	page {
		background-color: #f5f5f5;
	}
</style>

3)获取页面路由栈:getCurrentPages()

getCurrentPages() 函数用于获取当前页面栈的实例,以数组形式按栈的顺序给出,第一个元素为首页,最后一个元素为当前页面。该函数仅用于展示页面栈的情况,请勿修改页面栈,以免造成页面状态错误。

路由方式 页面栈表现 触发时机
初始化 新页面入栈 uni-app 打开的第一个页面
打开新页面 新页面入栈 调用 API   uni.navigateTo  、使用组件  <navigator open-type="navigate"/>
页面重定向 当前页面出栈,新页面入栈 调用 API   uni.redirectTo  、使用组件  <navigator open-type="redirectTo"/>
页面返回 页面不断出栈,直到目标返回页 调用 API  uni.navigateBack   、使用组件 <navigator open-type="navigateBack"/> 、用户按左上角返回按钮、安卓用户点击物理back按键
Tab 切换 页面全部出栈,只留下新的 Tab 页面 调用 API  uni.switchTab  、使用组件  <navigator open-type="switchTab"/>  、用户切换 Tab
重加载 页面全部出栈,只留下新的页面 调用 API  uni.reLaunch  、使用组件  <navigator open-type="reLaunch"/>

在跳转页面传递参数时,url有长度限制,太长的字符串会传递失败,可使用窗体通信、全局变量,或encodeURIComponent等多种方式解决,如下为encodeURIComponent示例。

<navigator :url="'/pages/navigate/navigate?item='+ encodeURIComponent(JSON.stringify(item))"></navigator>
// navigate.vue页面接受参数
onLoad: function (option) {
	const item = JSON.parse(decodeURIComponent(option.item));
}

页面间全局通讯API应用

与EventBus使用规则一致

触发事件:uni.$emit(eventName,OBJECT)

监听事件:uni.$on(eventName,callback)

监听事件(只触发一次):uni.$once(eventName,callback)

移除事件:uni.$off([eventName, callback])

移除事件注意项:

  • 如果没有提供参数,则移除所有的事件监听器;
  • 如果只提供了事件,则移除该事件所有的监听器;
  • 如果同时提供了事件与回调,则只移除这个回调的监听器;
  • 提供的回调必须跟$on的回调为同一个才能移除这个回调的监听器;

uni.scss的优缺点

uni.scss为uni-app新建项目自带工程文件,使用的预处理器为sass/scss,由此可见,uni-app官方推荐的是scss,不建议在 uni-app中使用less、stylus等。

uni.scss具有如下一些特点:

  • 无需引入,uni-app在编译时,会自动引入此文件
  • 在此中定义的scss变量,可以全局使用,可以在此定义一些颜色,主题,尺寸等变量
  • uni.scss会编译到每个scss文件中(请着重理解这一句话)

综上所述,我们可以得知,uni.scss主要是利用scss的特性,定义一些全局变量,供各个写了lang=scss的style标签引用,但是这引出了一个重要的问题:
uni.scss中所写的一切内容,都会注入到每个声明了scss的文件中,这意味着,如果您的uni.scss如果有几百行,大小10k左右,那么这个10k都会被注入所有的 其他scss文件(页面)中,如果您的应用有50个页面,那么有可能因此导致整体的包体积多了50 * 10 = 500k的大小,这可能会导致小程序包太大而无法预览和发布, 所以,我们建议您只将scss变量相关的内容放到uni.scss中。

提个题外话,如果使用uView组件库配合开发,如何修改组件原生样式呢?可以使用::v-deep,值得注意的是,在微信小程序中要求::v-deep或/deep/前面必须还要有父元素的类名存在。如:

// 定义一个u-button组件
<template>
	<view class="container">
		<u-button type="primary" text="确定" @click="click"></u-button>
	</view>
</template>

// 修改u-button组件内置样式
<style lang="scss" scoped>
	.container ::v-deep button {
		background-color: #FFFF00;
	}
</style>

猜你喜欢

转载自blog.csdn.net/zeping891103/article/details/126952270