uni-app【事件绑定、下拉刷新、上传图片、导航跳转、组件通讯】

uni-app中的样式

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

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

  • 支持基本常用的选择器class、id、element等。

  • uni-app中不能使用*选择器。

  • page相当于body节点

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

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

    • 字体文件小于40kb,uni-app 会自动将其转换为 base64 格式;

    • 字体文件大于等于40kb,需开发者自己转换,否则使用将不生效;

    • 字体文件的引用路径推荐使用以~@ 开头的绝对路径。

      @font-face{
          font-family:test1-icon;
          src:url('~@/static/iconfont.ttf')
      }
      
    • 如何使用scss或者less

uni-app中的数据绑定

在页面中需要定义数据,和vue一模一样,直接在data中定义数据即可。

export default{
    data(){
        return{
            msg:'hello-uni'
        }
    }
}

插值表达式的使用

  • 利用插值表达式渲染基本数据

    <view>{{msg}}</view>
    
  • 在插值表达式中使用三元运算

    <view>{{ flag ? '我是真的' : '我是假的' }}</view>
    
  • 基本运算

    <view>{{1+1}}</view>
    

v-bind动态绑定属性

在data中定义了一张图片,我们希望把这张图片渲染到页面上

export default{
    data(){
        return{
            img:'https://rabbiter.top/oss/blogs/imgs/img_0fdd34398df_1601132059427.jpg'
        }
    }
}

利用v-bind进行渲染

<image v-bind:src="img"></image>

开可以缩写成:

<image :src="img"></image>

v-for的使用

data中定义一个数组,最终将数据渲染到页面上

data(){
    return{
        arr:[
            {name:'小明',age:20},
            {name:'小亮',age:22},
            {name:'小梁',age:21},
            {name:'小张',age:22},            
        ]
    }
}

利用v-for进行循环

<view v-for="{item,index} in arr" :key="index">名字:{{item.name}}---年龄:{{item.age}}</view>

uni中的事件

事件绑定

在uni中事件绑定和vue中是一样的,通过v-on进行事件的绑定,也可以简写为@

<button @click="tapHandle">点击我</button>

事件函数定义在methods中

methods:{
    tapHandle(){
        console.log('真的点我了')
    }
}

事件传参

  • 默认如果没有传递参数,事件函数第一个形参为事件对象

    // template
    <button @click="tapHandle">点我啊</button>
    // script
    methods:{
    	tapHandle(e){
    		console.log(e)
    	}
    }
    
  • 如果给事件函数传递参数了,则对应的事件函数形参接收的则是传递过来的数据

    // template
    <button @click="tapHandle(1)">点我啊</button>
    // script
    methods: {
      tapHandle (num) {
        console.log(num)
      }
    }
    
  • 如果获取事件对象也想传递参数

    // template
    <button @click="tapHandle(1,$event)">点我啊</button>
    // script
    methods: {
      tapHandle (num,e) {
        console.log(num,e)
      }
    }
    

uni的生命周期

应用的生命周期

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

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

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

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

在这里插入图片描述

页面一加载会执行:onLaunchonShow函数

缩小页面,再重新打开页面会执行:onHideonShow函数

页面的生命周期

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

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

在这里插入图片描述

页面一加载会执行:onLoadonShowonReady

页面一隐藏,再打开会执行:onHideonShow

页面一切换,会执行:onHide;页面再切回来,会执行:onShow

下拉刷新

开启下拉刷新

在uni-app中有两种方式开启下拉刷新

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

  • 通过调用uni.startPullDownRefresh方法来开启下拉刷新

    在这里插入图片描述

通过配置文件开启

创建list页面进行演示

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

<script>
	export default {
		data () {
			return {
				arr: ['前端','java','ui','大数据']
			}
		}
	}
</script>

<style>
</style>

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

{
  "path":"pages/list/list",
    "style":{
      "enablePullDownRefresh": true
    }
}

通过API开启

api文档

uni.startPullDownRefresh()

监听下拉刷新

通过onPullDownRefresh可以监听到下拉刷新的动作

export default {
  data () {
    return {
      arr: ['前端','java','ui','大数据']
    }
  },
  methods: {
    startPull () {
      uni.startPullDownRefresh()
    }
  },
  onPullDownRefresh () {
    console.log('触发下拉刷新了')
  }
}

案例代码

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

<script>
	export default {
		data() {
			return {
				list: ['早上好', '中午好', '晚上好']
			}
		},
		onPullDownRefresh(){
			console.log('触发下拉刷新')
			this.list=['罗非鱼', '鲤鱼', '金枪鱼']
		}
	}
</script>

运行效果

在这里插入图片描述

点击按钮实现下拉刷新代码

<template>
	<view>
		<view>这是列表页面</view>
		<view v-for="item in list">
			{{item}}
		</view>
		<button @click="pullDown">点击实现下拉刷新</button>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				list: ['早上好', '中午好', '晚上好']
			}
		},
		onPullDownRefresh(){
			console.log('触发下拉刷新')
			this.list=['罗非鱼', '鲤鱼', '金枪鱼']
		}	
		,
		methods:{
			pullDown() {
				uni.startPullDownRefresh()
			}
		}
	}
</script>

最终效果:最终代码加了个关闭下拉的计时器

在这里插入图片描述

关闭下拉刷新

uni.stopPullDownRefresh()

停止当前页面下拉刷新。

案例演示

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

<script>
	export default {
		data() {
			return {
				list: ['早上好', '中午好', '晚上好']
			}
		},
		onPullDownRefresh () {
			setTimeout(()=> {
				this.list=['罗非鱼', '鲤鱼', '金枪鱼']
				uni.stopPullDownRefresh()
			}, 1000);
		}
	}
</script>

运行效果

在这里插入图片描述

上拉加载

通过在pages.json文件中找到当前页面的pages节点下style中配置onReachBottomDistance可以设置距离底部开启加载的距离,默认为50px

通过onReachBottom监听到触底的行为

<template>
	<view>
		<view>这是列表页面</view>
		<view class="box-item" v-for="item in list">
			{{item}}
		</view>
	</view>
</template>
<script>
	export default {
		// 数据
		data() {
			return {
				list: ['早上好', '中午好', '晚上好','周一好','周二好','周三好','周四好','周五好','周六好','周日好']
			}
		},
		// 上拉触底            
		onReachBottom () {
			console.log('触底了')
		}
	}
</script>

<style>
	.box-item{
		height: 100px;
		line-height: 100px;
	}
</style>

最终效果

在这里插入图片描述

小问题:很显然还没到底,就会触发触底了提示。

通过在pages.json文件中找到当前页面的pages节点下style中配置onReachBottomDistance可以设置距离底部开启加载的距离,默认为50px

pages.json文件中的onReachBottomDistance改成200

在这里插入图片描述

运行效果

在这里插入图片描述

网络请求

在uni中可以调用uni.request方法进行请求网络请求

需要注意的是:在小程序中网络相关的 API 在使用前需要配置域名白名单。

发送get请求

<template>
	<view>
		<button @click="sendGet">发送请求</button>
	</view>
</template>
<script>
	export default {
		methods: {
			sendGet () {
				uni.request({
					url: 'http://localhost:8082/api/getlunbo',
					success(res) {
						console.log(res)
					}
				})
			}
		}
	}
</script>

上传图片、预览图片

上传图片

uni.chooseImage方法从本地相册选择图片或使用相机拍照。

案例代码

<template>
	<view>
		<button type="primary" @click="chooseImg">上传图片</button>
		<view>
			<image v-for="item in imgArr" :src="item"></image>
		</view>
	</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>
		<view>
			<image v-for="item in imgArr" :src="item" @click="previewImg"></image>
		</view>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				imgArr: []				
			}
		},
		methods: {
			chooseImg(){
				uni.chooseImage({
					count:5,
					success:res=>{
						this.imgArr=res.tempFilePaths
					}
				})
			},
			previewImg(current){
				uni.previewImage({
					current:'',
					urls:this.imgArr,
					// 循环预览
					loop:true,
					// 底部图片指示器
					indication:'number'
				})
			}
		}
	}
</script>

上面写的循环预览底部指示器两个效果只能在手机端显示出来效果,微信小程序和网页协商那段代码也不显示。

最终效果

在这里插入图片描述

条件注释实现跨段兼容

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

写法:以 #ifdef 加平台标识 开头,以 #endif 结尾。

平台标识

平台参考文档
APP-PLUS5+AppHTML5+ 规范
H5H5
MP-WEIXIN微信小程序微信小程序
MP-ALIPAY支付宝小程序支付宝小程序
MP-BAIDU百度小程序百度小程序
MP-TOUTIAO头条小程序头条小程序
MP-QQQQ小程序(目前仅cli版支持)
MP微信小程序/支付宝小程序/百度小程序/头条小程序/QQ小程序

组件的条件注释

代码演示

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

最终效果

在这里插入图片描述

api的条件注释

代码演示

onLoad () {
  //#ifdef MP-WEIXIN
  console.log('微信小程序')
  //#endif
  //#ifdef H5
  console.log('h5页面')
  //#endif
}

最终效果

在这里插入图片描述

样式的条件注释

代码演示

/* #ifdef H5 */
view{
  height: 100px;
  line-height: 100px;
  background: red;
}
/* #endif */
/* #ifdef MP-WEIXIN */
view{
  height: 100px;
  line-height: 100px;
  background: green;
}
/* #endif */

最终效果

在这里插入图片描述

uni中的导航跳转

利用navigator进行跳转

navigator详细文档:文档地址

跳转到普通页面

<navigator url="/pages/detail/detail">跳转至详情页</navigator>

跳转到tabbar页面

<navigator url="/pages/message/message" open-type="switchTab">跳转至信息页</navigator>

最终效果

在这里插入图片描述

利用编程式导航进行跳转

导航跳转文档

利用navigateTo进行导航跳转

保留当前页面,跳转到应用内的某个页面,使用uni.navigateBack可以返回到原页面。

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

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

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

通过switchTab跳转到tabbar页面

跳转到tabbar页面

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

通过switchTab方法进行跳转

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

redirectTo进行跳转

关闭当前页面,跳转到应用内的某个页面。

<!-- template -->
<button type="primary" @click="goMessage">跳转到message页面</button>
<!-- js -->
goMessage () {
  uni.switchTab({
    url: '/pages/message/message'
  })
}

通过onUnload测试当前组件确实卸载

onUnload () {
  console.log('组件卸载了')
}

导航跳转传递参数

在导航进行跳转到下一个页面的同时,可以给下一个页面传递相应的参数,接收参数的页面可以通过onLoad生命周期进行接收

传递参数的页面

goAbout () {
  uni.navigateTo({
    url: '/pages/about/about?id=80',
  });
}

接收参数的页面

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

uni-app中组件的创建

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

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

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

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

    components: {test}
    
  • 使用组件

    <test></test>
    

    在这里插入图片描述

组件的生命周期函数

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

兄弟组件通讯

uni-ui的使用

uni-ui文档

1、进入Grid宫格组件

2、使用HBuilderX导入该组件

3、导入该组件

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

4、注册组件

components: {uniGrid,uniGridItem}

5、使用组件

<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>

版权声明:本文为December_shi原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。