ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

uni-app重点基础知识

2021-06-21 20:31:26  阅读:538  来源: 互联网

标签:default app 基础知识 export 组件 uni pages 页面


文章目录

uni-app

基础使用

介绍

uni-app是一个使用Vue.js开发的所有的前端的应用框架,开发者编写的一套代码,可以发布到iOS、Android、H5、以及各种小程序。

即使不跨端、uni-app同时也是更好的小程序开发框架

环境搭建

安装HbuilderX和小程序开发者工具

创建项目并运行

1、 双击打开 : HBuilder X

2、 创建项目 :选择 uni-app(U) —> 填写项目名称 —> 项目路径 —> 确认创建 (创建完毕)

3、运行到浏览器 :点击 运行 —> 运行到浏览器 —> 选择谷歌浏览器

注意 第一次打开不会成功哦!

让我们解决一下

配置微信小程序

点击 运行 —> 运行到小程序模拟器 —> 选择 **微信开发者工具(W) - ** —> 弹出一个弹窗 —>

在这里插入图片描述

将此路径 配置弹窗 里面 —> 配置完成后

配置完成后 并不会成功弹出 微信小程序的模拟器,我们还需要一下操作

打开 微信小程序 —> 点击 设置 —> 点击 安全设置 —> 开启 服务端口 —> 回到 **HBuilder ** —> 点击 运行 —> 运行到小程序模拟器 停止一下再重新运行一次 —>就成功了 完毕

项目目录

pages. json 文件用来对uni-app进行全局配置,决定页面文件的路径、窗口样式、原生的导航栏、底部的原生tabbar "等

manifest.json 文件是应用的配置文件,用于指定应用的名称、图标、权限等。

App.vue 是我们的跟组件,所有页面都是在 App.vue下进行切换的,是页面入口文件,可以调用应用的生命周期函数。

main.js 是我们的项目入口文件,主要作用是初始化vue 实例并使用需要的插件。

uni.scss 文件的用途是为了方便整体控制应用的风格。比如按钮颜色、边框风格,uni.scss文件里预置了一批scss变量预置。

unpackage 就是打包目录,在这里有各个平台的打包文件

pages 所有的页面存放目录

static 静态资源目录,例如图片等

components 组件存放目录

开发规范

为了实现多端兼容,综合考虑编译速度、运行性能等因素,uni-app 约定了如下开发规范:

  • 页面文件遵循 Vue 单文件组件 (SFC) 规范
  • 组件标签靠近小程序规范,详见uni-app 组件规范
  • 接口能力(JS API)靠近微信小程序规范,但需将前缀 wx 替换为 uni,详见uni-app接口规范
  • 数据绑定及事件处理同 Vue.js 规范,同时补充了App及页面的生命周期
  • 为兼容多端运行,建议使用flex布局进行开发

全局配置和页面配置

pages.json 初始样式

{
	"pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
		{
			"path": "pages/index/index",
			"style": {
				"navigationBarTitleText": "uni-app"
			}
		}
	],
	"globalStyle": {
		"navigationBarTextStyle": "black",
		"navigationBarTitleText": "uni-app",
		"navigationBarBackgroundColor": "#F8F8F8",
		"backgroundColor": "#F8F8F8"
	}
}

pages 是页面配置

globalStyle 是全局配置

页面配置会覆盖全局配置

全局配置(pages.json)

属性类型默认值描述
navigationBarBackgroundColorHexColor#F7F7F7导航栏背景颜色(同状态栏背景色)
navigationBarTextStyleStringwhite导航栏标题颜色及状态栏的前景颜色,仅支持black/white
navigationBarTitleTextString导航栏标题文字内容
backgroundColorHexColor#ffffff窗口背景色
navigationBarTextTextStringdark下拉loading的样式,仅支持dark/light
enablePullDownRefreshBooleanfalse是否开启下拉刷新
onReachBottomDistanceNumber50页面上拉触底事件触发时距页面底部距离,单位只支持px

页面配置

创建新项目

在pages文件中新建文件

新建目录 message —> 新建文件 message.vue

在 pages.json 配置

"pages": [ //pages数组中第一项表示应用启动页,参考:ttps://uniapp.dcloud.io/collocation/pages
		{
			"path": "pages/message/message"
		}
		{
			"path": "pages/index/index"
		}		
]

注意: pages数组中第一项表示应用启动页,也就是放在数组第一个会在运行的时候被自动显示出来

设置样式

里面用到了 h5(是一个独有的特定的样式)

h5 平台下拉刷新动画,只有circle类型 / 设置 h5 只在里面中影响,不会影响微信小程序的样式

"pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
		{
			"path": "pages/message/message",
			"style":{
				"navigationBarTitleText":"信息页",
				"navigationBarBackgroundColor":"#F0AD4E"
			},
			"h5":{
				"pullToRefresh":{
					"color":"#7D26CD"
				}
			}
		},
		{
			"path": "pages/index/index"
		}		
]

配置基本的tabbar

如果应用是一个多tab应用,可以通过tabBar配置项指定tab栏的表现,以及tab切换时显示的对应页。

Tips
1、 当设置position为 top时,将不会显示 icon
2、 tabBar中的list是一个数组,只能配置最少2个、最多5个 tab, tab 按数组的顺序排序。

属性类型必填默认值描述平台差异说明
colorHexColortab上的文字默认颜色
selectedColorHexColortab上的文字选中时的颜色
backgroundColorHexColortab的背景颜色
borderStyleStringblacktabbar上面边框的演示/仅支持black/whiteApp 2.3.4+支持其他颜色值
listArraytab的列表,只能配置最少2个、最多5个 tab
positionStringbottom可选值bottom/toptop值仅支持小程序

代码演示

{
	"pages": [
		{
			"path": "pages/message/message",
			"style":{
				"navigationBarTitleText":"信息页",
				"navigationBarBackgroundColor":"#C4E1FF"
			},
			"h5":{
				"pullToRefresh":{
					"color":"#7D26CD"
				}
			}
		},
		{
			"path": "pages/index/index"
		},
		{
			"path": "pages/contact/contact"
		}		
	],
	"globalStyle": {
		...
	},
	"tabBar":{
		"list":[
			{
				"text":"首页",
				"pagePath":"pages/index/index",
				"iconPath":"static/tabs/shouye.png",
				"selectedIconPath":"static/tabs/shouye2.png"
			},
			{
				"text":"信息",
				"pagePath":"pages/message/message",
				"iconPath":"static/tabs/xinxi.png",
				"selectedIconPath":"static/tabs/xinxi2.png"
			},
			{
				"text":"我的",
				"pagePath":"pages/contact/contact",
				"iconPath":"static/tabs/wd.png",
				"selectedIconPath":"static/tabs/wd2.png"
			}
		]
	}
}

condition启动模式配置

启动模式配置,仅在开发期间生效,用于模拟直达页面的场景,如:小程序转发后,用户点击所打开的页面

属性说明:

属性类型是否必填描述
currentNumber当前激活的模式,list节点的索引值
listArray启动模式列表

list说明:

属性类型是否必填描述
nameString启动模式名称
pathString启动页面路径
queryString启动参数
{
	"pages": [
		{
			"path": "pages/message/message",
			"style":{
				"navigationBarTitleText":"信息页",
				"navigationBarBackgroundColor":"#C4E1FF"
			},
			"h5":{
				"pullToRefresh":{
					"color":"#7D26CD"
				}
			}
		},
		...
		{
			"path":"pages/detail/detail",
			"style":{
				"navigationBarTitleText":"详情页"
			}
		}		
	],
	"globalStyle": {
		...
	},
	"tabBar":{
		...
	},
	"condition":{
		"current":0,
		"list":[
			{
				"name":"详情页",
				"path":"pages/detail/detail",
				"query":"id=20"
			}
		]
	}
}

基础组件

text 组件的基本使用

属性名类型默认值说明
selectableBooleanfalse文本是否可选
spaceString显示连续空格
decodeBooleanfalse是否解码

space值说明

ensp —> 中文字符空格的一半大小

emsp —> 中文字符空格大小

nbsp —> 根据字体设置的空格大小

Tips
组件内只支持嵌套 ,不支持其它组件或自定义组件,否则会引发在不同平台的渲染差异

  1. decode可以解析的有  < > & '    
  2. 各个操作系统的空格标准并不一致。
  3. 除了文本节点以外的其他节点都无法长按选中
  4. 支持ln方式换行。
  5. 如果使用组件编译时会被转换为

代码演示

<template>
	<view>
		<view>
			<text>小田睡着了</text>
		</view>
		<view>
			<text selectable>小田睡着了</text>
		</view>
		<view>
			<text space="ensp">小田  睡着了</text>
		</view>
		<view>
			<text space="emsp">小田  睡着了</text>
		</view>
		<view>
			<text space="nbsp" style="font-size: 10px;">小田  睡着了</text>
		</view>
		<view>
			<text>&amp</text>
		</view>
	</view>
</template>

效果展示

在这里插入图片描述

view组件的基本使用

代码演示1

<view>
   <view class="box" hover-class="box-active">我是一个大盒子</view>
</view>
<style>
	.box{
		width: 100px;
		height: 100px;
		background-color: #007AFF;
	}
	.box-active{
		background-color: #2C405A;
	}
</style>	

点击box盒子 背景颜色发生变化

代码演示2

<view>
		<view class="box2" hover-class="box2-active">
			<view class="box" hover-class="box-active">我是一个大盒子</view>
		</view>
</view>

<style>
	.box{
		width: 100px;
		height: 100px;
		background-color: #007AFF;
	}
	.box2{
		width: 200px;
		height: 200px;
		background-color: #4CD964;
	}
	.box-active{
		background-color: #2C405A;
	}
	.box2-active{
		background-color:#F0AD4E;
	}
</style>

点击 box2 盒子 box2 盒子背景颜色变化

点击 box盒子 box盒子box2盒子都发生变化

为了避免这种情况 加上 hover-stop-propagation 属性

<view>
		<view class="box2" hover-class="box2-active">
			<view class="box" hover-class="box-active" hover-stop-propagation>我是一个大盒子</view>
		</view>
</view>

hover-start-time 等待一段时间开始

hover-stay-time 保持一段时间结束

<view>
		<view class="box2" hover-class="box2-active">
			<view class="box" :hover-start-time="2000" :hover-stay-time="2000" hover-class="box-active" hover-stop-propagation>我是一个大盒子</view>
		</view>
</view>

button按钮组件的基本使用

点击看这个链接 https://uniapp.dcloud.io/component/button 就可以了

image组件的基本使用

点击看这个链接 https://uniapp.dcloud.io/component/image 就可以了

uni中样式的学习及如何使用scss和字体图标

1、 rpx即响应式px,一种根据屏幕宽度自适应的动态单位。以750宽的屏幕为基准,750rpx恰好为屏幕宽度。屏幕变宽,rpx实际显示效果会等比放大。

2、 使用@import语句可以导入外联样式表,@import后跟需要导入的外联样式表的相对路径,用;表示语句结束

3、 支持基本常用的选择器class.id、element等

4、 在uni-app中不能使用*选择器。

5、 page相当于body节点

6、 定义在App.vue中的样式为全局样式,作用于每一个页面。在pages目录下的vue文件中定义的样式为局部样式,只作用在对应的页面,并会覆盖App.vue中相同的选择器。

7、 uni-app支持使用字体图标,使用方式与普通web项目相同,需要注意以下几点:

  • 字体文件小于40kb.uni-app会自动将其转化为base64格式;
  • 字体文件大于等于40kb,需开发者自己转换,否则使用将不生效;
  • 字体文件的引用路径推荐使用以~@开头的绝对路径。

总结:

1、 把字体图标的文件放在项目static文件中

2、在App.vue文件中 导入

@import url("../static/fonts/iconfont.css")

3、 把需要的导入的文件改一下

url('~@/static/fonts/........')

这样就可以了

scss插件安装

工具 —> 插件安装 —> 找到 scss/sass编译 然后安装

全局样式

uni-scss 文件中 $global-color:red

在其他文件使用:background:$global-color;

颜色就成红色了

基础的数据双向绑定

代码演示

<view>
  <view>{{msg}}</view>
  <view>{{'你好'+'世界'}}</view>
  <view>{{1+1}}</view>
  <view>{{flag? '我是真的' : '我是假的'}}</view>
</view>
<sceipt>
  export default{
      data() {
          return {
              msg:'hello',
              flag:true
          }
      }
  }
</script>

输出结果:

hello

你好世界

2

我是真的

v-bind和v-for的使用

v-bind

<view>
  <view>
    <image :src="imgUrl"></image>
  </view>
</view>
<sceipt>
  export default{
      data() {
          return {
              imgUrl:'http://destiny001.gitee.io/image/monkey_02.jpg',
          }
      }
  }
</script>

v-for

<view>
  <view v-for="(item,index) in arr" :key="item.id">
    序号:{{index}},姓名:{{item.name}},年龄:{{item.age}}
  </view>
</view>
<sceipt>
  export default{
      data() {
          return {
              arr: [
                  {
                      name:'小田',
                      age: 20,
                      id: 1
                  },
                  {
                      name:'小白',
                      age: 24,
                      id: 2
                  },
                  {
                      name:'大田',
                      age: 30,
                      id: 3
                  }
              ]
          }
      }
  }
</script>

如何注册事件和传递参数及获取到事件对象

v-on / @

代码演示

<template>
	<view>
		<button @click="clickHandle(20)">点击我一下吧</button>
	</view>
</template>
<script>
	export default{
		methods:{
			clickHandle(num){
				console.log(num)
			}
		}
	}
</script>

如何拿到事件对象

方法一、

<template>
	<view>
		<button @click="clickHandle()">点击我一下吧</button>
	</view>
</template>
<script>
	export default{
		methods:{
			clickHandle(e){
				console.log(e)
			}
		}
	}
</script>

方法二、

<template>
	<view>
		<button @click="clickHandle(20,$event)">点击我一下吧</button>
	</view>
</template>
<script>
	export default{
		methods:{
			clickHandle(num,e){
				console.log(num,e)
			}
		}
	}
</script>

生命周期函数

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

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

应用生命周期函数:

函数名说明
onLaunch当uni-app初始化完成时触发(全局只触发一次)
onShow当uni-app启动,或从后台进入前台显示
onHide当uni-app从前台进入后台
onError当uni-app报错时触发

页面的生命周期

函数名说明
onLoad监听页面加载,其参数为上个页面传递的数据,参数类型为Object(用于页面传参)
onShow监听页面显示,页面每次出现在屏幕上都触发,包括从下级页面返回露出当前页面
onReady监听页面初始化渲染完成
onHide监听页面隐藏

下拉刷新

需要在 pages.json 文件中,找到当前页面的pages节点,并在style选项中开启 enablePullDownRefresh

"enablePullDownRefresh": true

监听下拉刷新

onPullDownRefresh

<template>
	<view>
		<view>这是列表页</view>
		<view v-for="item in list">
			{{item}}
		</view>
	</view>
</template>

<script>
	export default{
		data() {
			return {
				list:['王力宏','白敬亭','秦奋','田思雨','某人']
			}
		},
		// 触发下拉刷新
		onPullDownRefresh() {
			this.list = ['秦奋','田思雨','王力宏','白敬亭','某人']
		}
	}
</script>

当触发下拉刷新事件时,会立刻刷新列表里面的内容

我们可以设置一个定时器,当触发下拉刷新事件会,2秒后运行

// 触发下拉刷新
 onPullDownRefresh() {
  setTimeout(()=>{
    this.list = ['秦奋','田思雨','王力宏','白敬亭','某人']
  },2000)
 }

关闭下拉刷新

uni.stopPullDownRefresh()

// 触发下拉刷新
 onPullDownRefresh() {
  setTimeout(()=>{
    this.list = ['秦奋','田思雨','王力宏','白敬亭','某人']
    // 停止下拉刷新
    uni.stopPullDownRefresh()
  },2000)
 }

通过点击按钮触发下拉刷新

通过 uni.startPullDownRefresh() 开启下拉刷新

开始下拉刷新,调用后触发下拉刷新动画,效果与用户手动下拉刷新—致。

<button type="default" @click="pullDown">下拉刷新</button>

<script>
	export default{
		data() {
			return {
				list:['王力宏','白敬亭','秦奋','田思雨','某人']
			}
		},
		// 触发下拉刷新
		onPullDownRefresh() {
			setTimeout(()=>{
				this.list = ['秦奋','田思雨','王力宏','白敬亭','某人']
				uni.stopPullDownRefresh()
			},2000)
		},
		methods: {
			pullDown() {
				uni.startPullDownRefresh()
			}
		}
	}
</script>

上拉刷新

1、配置json.js文件

"onReachBottomDistance":200

距离底部200px触发触底事件,如果不配置默认是50px

2、通过 onReachBottom() 监听上拉刷新事件

<template>
	<view>
		<view>这是列表页</view>
		<view class="content" v-for="item in list">
			{{item}}
		</view>
	</view>
</template>

<script>
	export default{
		data() {
			return {
				list:['王力宏','白敬亭','秦奋','田思雨','某人','王力宏','白敬亭','秦奋','田思雨','某人']
			}
		},
		onReachBottom() {
			console.log('页面触底了')
			this.list = [...this.list,...['力宏','小白','大田','小田']]
		}
	}
</script>

<style>
	.content{
		height: 100px;
	}
</style>

当滚动条距离底部200 的时候,触发 onReachBottom() 事件,给list数组追加内容

网络请求

uni.request(OBJECT)

发送网络请求

在各个小程序平台运行时,网络相关的 API 在使用前需要配置域名白名单。

具体内容看:https://uniapp.dcloud.io/api/request/request

简单获取一下值,代码如下:

<template>
	<view>
		<button type="default" @click="get">发生get请求</button>
	</view>
</template>

<script>
	export default{
		methods: {
			get() {
				uni.request({
					url:"http://localhost:8082/api/getlunbo",  // 开发者服务器接口地址
					success(res) {  // 收到开发者服务器成功返回的回调函数
						console.log(res)
					}
				})
			}
		}
	}
</script>

数据缓存

<template>
	<view>
      <button type="default" @click="setStorage">存储数据</button>
      <button type="default" @click="getStorage">获取数据</button>
      <button type="default" @click="removeStorage">清除数据</button>
	</view>
</template>

<script>
	export default{
		methods: {
			setStorage() {
			    // 存储数据
				uni.setStorage({
					key:'id',  // 存储到本地的名称
					data:80,  // 存储到本地的数据
					success () {
						console.log('存储成功')
					}
				})
			},
			getStorage() {
			    //  获取数据
				uni.getStorage({
					key:'id',
					success(res) {
						console.log('获取成功',res)
					}
				})
			},
			removeStorage() {
			    //  清除数据
				uni.removeStorage({
					key:'id',
					success() {
						console.log('移除成功')
					}
				})
			}
		}
	}
</script>

以上方法是异步的,下面我们看看同步方法吧!

<template>
	<view>
		<button type="default" @click="setStorage">存储数据</button>
		<button type="default" @click="getStorage">获取数据</button>
		<button type="default" @click="removeStorage">清除数据</button>
	</view>
</template>

<script>
	export default{
		methods: {
			setStorage() {
				uni.setStorageSync('id',800)
			},
			getStorage() {
				const res = uni.getStorageSync('id')
				console.log(res)
			},
			removeStorage() {
				uni.removeStorageSync('id')
			}
		}
	}
</script>

补充:

异步清理本地数据缓存:uni.clearStorage()

同步清理本地数据缓存:uni.clearStorageSync()

以上方法是清除本地所以数据缓存,一般不使用

图片的上传和预览

<template>
	<view>
		<button type="primary" @click="chooseImg">上传图片</button>
	</view>
</template>

<script>
	export default {
		methods:{
			chooseImg() {
				uni.chooseImage({
					count:5,
					success(res) {
						console.log(res)
					}
				})
			}
		}
	}
</script>

通过以上代码的运行,发现:

在浏览器,一次上传的图片(多选)的数量不受限制,即使你设置了count值是5 ,当我们同时选中6张图片也可以获取到。

在小程序端,如果一次多选6张,只会上传5张

上传图片

<template>
	<view>
		<button type="primary" @click="chooseImg">上传图片</button>
		//  展示图片
		<image v-for="item in imgArr" :src="item"></image>
	</view>
</template>

<script>
	export default {
		data(){
			return {
				imgArr:[]
			}
		},
		methods:{
			chooseImg() {
				uni.chooseImage({
					count:5,  // 限制图片上传数量
					success: res => {
						this.imgArr = res.tempFilePaths
					}
				})
			}
		}
	}
</script>

上传图片并预览

<template>
	<view>
		<button type="primary" @click="chooseImg">上传图片</button>
		<image v-for="item in imgArr" :src="item" @click="previewImg(item)"></image>
	</view>
</template>

<script>
	export default {
		data(){
			return {
				imgArr:[]
			}
		},
		methods:{
			// 上传图片
			chooseImg() {
				uni.chooseImage({
					count:5,
					success: res => {
						this.imgArr = res.tempFilePaths
					}
				})
			},
			// 点击图片预览
			previewImg(current){
				// current 预览的路径
				// urls 需要预览的图片链接列表
				// loop 是否循环预览(小程序和浏览器上没有效果,只有在APP上有效果)
				uni.previewImage({
					current,
					urls:this.imgArr,
					loop:true,
				})
			}
		}
	}
</script>

条件编译跨端兼容

跨端兼容

uni-app 已将常用的组件、JS API 封装到框架中,开发者按照 uni-app 规范开发即可保证多平台兼容,大部分业务均可直接满足。

但每个平台有自己的一些特性,因此会存在一些无法跨平台的情况。

  • 大量写 if else,会造成代码执行性能低下和管理混乱。
  • 编译到不同的工程后二次修改,会让后续升级变的很麻烦。

条件编译

条件编译是用特殊的注释作为标记,在编译时根据这些特殊的注释,将注释里面的代码编译到不同平台。

**写法:**以 #ifdef 或 #ifndef 加 %PLATFORM% 开头,以 #endif 结尾。

  • #ifdef:if defined 仅在某平台存在
  • #ifndef:if not defined 除了某平台均存在
  • %PLATFORM%:平台名称

方法一、

<template>
	<view>
	    <!-- #ifdef H5 -->
		<view>我希望只在h5页面中看见</view>
		<!-- #endif -->
		
		<!-- #ifdef MP-WEIXIN -->
		<view>我希望只在微信小程序页面中看见</view>
		<!-- #endif -->
	</view>
</template>


方法二、

<script>
	export default {
		onLoad() {
			//  #ifdef H5
			console.log('我希望在h5中打印')
			//  #endif
			
			//  #ifdef MP-WEIXIN
			console.log('我希望在微信小程序中打印')
			//  #endif
		}
	}
</script>

方法三、

<template>
	<view>
	    <!-- #ifdef H5 -->
		<view>我希望只在h5页面中看见</view>
		<!-- #endif -->
		
		<!-- #ifdef MP-WEIXIN -->
		<view>我希望只在微信小程序页面中看见</view>
		<!-- #endif -->
	</view>
</template>

<style>
   /* h5中的样式  */
   /* #ifdef H5 */
   view{
	   color: #007AFF;
   }
   /* #endif */
 
   /* 微信小程序中的样式 */
   /* #ifdef MP-WEIXIN */
   view{
	   color: #4CD964;
   }
   /* #endif */
</style>

导航跳转

声明式导航

<template>
	<view>
		<view>导航跳转的学习</view>
		<navigator url="/pages/detail/detail">跳转至详情页</navigator>
		<!-- 跳转到tabber的页面中需要在 open-type 属性中添加 switchTab -->
		<navigator url="/pages/message/message" open-type="switchTab">跳转至信息页</navigator>
	    <!-- 跳转到详情页会销毁前一个页面,没有返回上一页的按钮 -->
		<navigator url="/pages/detail/detail" open-type="redirect">跳转至详情页</navigator>
	</view>
</template>

<script>
	export default{
		// 监听页面卸载函数
		// 当我们点击跳转带有 open-type="redirect" 的导航,会被监听到导航页面卸载了
		onUnload() {
			console.log('导航页面卸载了')
		}
	}
</script>

编程式导航

<template>
	<view>
		<view>导航跳转的学习</view>
		<view>
			<view>编程式导航</view>
			<button @click="goDetail">跳转至详情页</button>
			<button @click="goMessage">跳转至信息页</button>
			<button @click="redirectDetail()">跳转至详情页并关闭当前页面</button>
		</view>
	</view>
</template>

<script>
	export default{
		// 监听页面卸载函数
		onUnload() {
			console.log('导航页面卸载了')
		},
		methods:{
			goDetail() {
				uni.navigateTo({
					url:'/pages/detail/detail'
				})
			},
			goMessage() {
				uni.switchTab({
					url:'/pages/message/message'
				})
			},
			redirectDetail() {
				uni.redirectTo({
					url:'/pages/detail/detail'
				})
			}
		}
	}
</script>

在点击 跳转至信息页 按钮时,我们会发现,运行了 onUnload() 函数,是因为:

uni.switchTab() 跳转到tabBar页面,并且关闭其他所有非tabBar页面

传参

在 navigator.js文件进行传参

<template>
	<view>
			<view>传参</view>
			<navigator url="/pages/detail/detail?id=80&age=19">跳转至详情页</navigator>
    </view>
</template>


在detail.js文件获取

<script>
	export default{
		onLoad(options){
			console.log(options)
		}
	}
</script>

组件的创建和使用

新建一个components文件夹 —> 在文件夹中新建test.vue文件 —> 在需要用到组件的文件中导入:import test from ‘…/…/components/test.vue’ —> 在components函数中:testa:test 在当前文件中展示的时候 用testa 、 展示的时候 要显示的哪个组件 test —> 在template标签中 直接使用 ----> 完毕

代码: test.vue

<template>
	<view>
		<view>这是test组件</view>
	</view>
</template>

<script>
	export default {
		data() {
			return {
			};
		}
	}
</script>

<style>
</style>


代码: index.js

<template>
	<view class="content">
	    <testa></testa>
	</view>
</template>

<script>
	import test from '../../components/test.vue'
	export default {
		data() {
			return {
				title: 'Hello'
			}
		},
		onLoad() {

		},
		methods: {

		},
		components:{
			// 展示的时候 用testa
			// 展示的时候 要显示的哪个组件 test
			testa:test
		}
	}
</script>

<style>
</style>


生命周期函数

生命周期钩子描述H5App端微信小程序说明
beforeCreate在实例初始化之后被调用 详情
created在实例创建完成后被立即调用 详情
beforeMount在挂载开始之前被调用 详情
mounted挂载到实例上去之后调用 详情 注意:此处并不能确定子组件被全部挂载,如果需要子组件完全挂载之后在执行操作可以使用$nextTick 详情
beforeUpdate数据更新时调用,发生在虚拟 DOM 打补丁之前 详情
updated由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用该钩子 详情
activated被 keep-alive 缓存的组件激活时调用 详情x
deactivated被 keep-alive 缓存的组件停用时调用 详情x
beforeDestroy实例销毁之前调用。在这一步,实例仍然完全可用 详情
destroyedVue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁 详情
errorCaptured当捕获一个来自子孙组件的错误时被调用 详情

组件之间的通讯方式

父传子

通过 props 传递参数

父组件 index.vue

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

<script>
  export default{
      data() {
          return {
              title: 'Hello'
          }
      },
      
  }
</script>

子组件 test.vue

<template>
  <view>
     这是父组件传递过来的数据{{title}}
  </view>
</template>

<script>
  export default{
      data() {
          return {
              num:3
          }
      },
      props:['title']
  }
</script>

子传父

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

父组件 index.vue

<template>
	<view class="content">
		<testa @myNum="getNum"></testa>
		<view>{{num}}</view>
	</view>
</template>

<script>
	import test from '../../components/test.vue'
	export default {
		data() {
			return {
				num:0
			}
		}
		methods: {
			getNum(num) {
				this.num = num
				console.log(this.num)
			}
		},
		components:{
			// 展示的时候 用testa
			// 展示的时候 要显示的哪个组件 test
			testa:test
		}
	}
</script>

<style>
</style>


子组件 test.vue

<template>
	<view>
		<view>这是test组件</view>
		<button @click="getNum">给父组件传值</button>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				num:3
			};
		},
		methods: {
			getNum() {
				console.log('给父组件传值')
				this.$emit('myNum',this.num)
			}
		}
	}
</script>

<style>
</style>


兄弟传值

通过 uni.$on 注册一个全局监听事件,通过 uni.$emit 触发全局监听事件

创建组件a,b,引入到index.vue, 在components注册

a.vue

<template>
	<view>
		<button @click="addNum" type="default">这是a组件 我要修改b组件的值</button>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				num:1
			};
		},
		methods:{
			addNum () {
				uni.$emit('updateNum',this.num)
			}
		}
	}
</script>

<style>
</style>


b.vue

<template>
	<view>
		这是b组件的值:{{num}}
	</view>
</template>

<script>
	export default {
		data() {
			return {
				num:3
			};
		},
		created() {
			uni.$on('updateNum',num => {
				this.num+=num
			})
		}
	}
</script>

<style>
</style>


index.vue

<template>
	<view class="content">
		<view>
			<test-a></test-a>
			<test-b></test-b>
		</view>
	</view>
</template>

<script>
	import testA from '../../components/a.vue'
	import testB from '../../components/b.vue'
	export default {
		data() {
			return {
			}
		},
		components:{
			'test-a':testA,
			'test-b':testB
		}
	}
</script>

<style>
</style>


标签:default,app,基础知识,export,组件,uni,pages,页面
来源: https://blog.csdn.net/qq_50613817/article/details/118093808

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有