uni-app 组件之间的通讯

字组件给父组件传值


若组件与组件之间是平级关系

在Vue中给出的是全局事件总线这个开发思路。

在uni-app中有一个页面通讯 - uni-app官网 (dcloud.io)
uni.$emit(eventName,OBJECT)

触发全局的自定事件。附加参数都会传给监听器回调。

属性类型描述
eventNameString事件名
OBJECTObject触发事件携带的附加参数

代码示例

    uni.$emit('update',{msg:'页面更新'})
uni.$on(eventName,callback)

监听全局的自定义事件。事件可以由 uni.$emit 触发,回调函数会接收所有传入事件触发函数的额外参数。

属性类型描述
eventNameString事件名
callbackFunction事件的回调函数

代码示例

    uni.$on('update',function(data){
        console.log('监听到事件来自 update ,携带参数 msg 为:' + data.msg);
    })
uni.$once(eventName,callback)

监听全局的自定义事件。事件可以由 uni.$emit 触发,但是只触发一次,在第一次触发之后移除监听器。

属性类型描述
eventNameString事件名
callbackFunction事件的回调函数

代码示例

    uni.$once('update',function(data){
        console.log('监听到事件来自 update ,携带参数 msg 为:' + data.msg);
    })
uni.$off([eventName, callback])

移除全局自定义事件监听器。

属性类型描述
eventNameArray<String>事件名
callbackFunction事件的回调函数

Tips

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

组件与组件之间的通讯

b.vue

created(){
	uni.$on('updateNum',num1=>{
    	this.num+=num1
    })
}

触发$on事件的时候是会传递一些数据的

a.vue

<template>
    <div>
        <h2>这是a组件里的值:{{num}}</h2> 
        <button type="primary" size="mini" @click="cdB">给B组件传值</button>
        <button type="primary" size="mini" @click="gotoNavi">这里跳回'navigateor'</button>
        <button type="primary" size="mini" @click="gotoB">这里跳到'b'组件</button>
       
    </div>
</template>

<script>
    export default{
        name:'a',
        components:{},
        data() {
            return {
                num: 10
            }
        },
        methods: {
            gotoNavi(){
                uni.navigateTo({
                    url:'/pages/navigator_learn/navigator_learn'
                })
            },
            gotoB(){
                uni.navigateTo({
                    url: '/pages/components/b'
                })
            },
            cdB(){
                uni.$emit('updateNum',10)
            }
        },
    }
</script>

<style scoped>

</style>

注意:我这里的使用到了uni中的导航跳转。你在同一个界面中你的b值是在刷新,但是你点击了给B组件传值的按键再按下这里跳到'b'组件跳到b组件,发现你的B值还是0,你的b.vue可以加个:

created(){
    uni.$on('updateNum',(num)=>{
    	console.log(this.num)
        console.log(num)
        this.num = this.num + num
	})
}

发现this.num值一直在a组件传过来的+10而回调里面的num一直都是10;当你返回后,发现b的值已经变了;说明你在跳转的时候用uni.navigateTo都是一个新的页面,若你在跳转前杀掉(uni.redirectTo)全部的a和b组件,那就永远禁止

若是a组件用redirectTo,b组件用navigateTo, 跟a、b组件全都用redirectTo一个效果

若是a组件用navigateTo,b组件用redirectTo也是不行

这里的结论就是要么都用navigateTo然后一直返回;要么就不用导航跳转,直接给父组件

你可以在index.vue(首页)里面不用导航跳转直接引入a,b俩组件(因为与原有的a标签重复,所以取名为(AB)):

index.vue

<template>
	<view class="content">
		<image class="logo" src="/static/logo.png"></image>
		<view>
			<text class="title">{{title}}</text>
		</view>
		<A></A><!--把A组件放在容器中-->
		<B></B><!--把B组件放在容器中-->
	</view>
</template>

<script>
	import A from '../components/a.vue'//引入a组件
	import B from '../components/b.vue'//引入b组件
	export default {
		data() {
			return {
				title: 'Hello'
			}
		},
		onLoad() {

		},
		methods: {

		},
		components:{A,B}//注册a、b组件
	}
</script>

<style>
	.content {
		display: flex;
		flex-direction: column;
		align-items: center;
		justify-content: center;
	}

	.logo {
		height: 200rpx;
		width: 200rpx;
		margin: 200rpx auto 50rpx auto;
	}

	.text-area {
		display: flex;
		justify-content: center;
	}

	.title {
		font-size: 36rpx;
		color: #8f8f94;
	}
</style>

怎么配置Vue的组件详情请看

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
您可以使用uni-appuni-download组件来实现下载图片功能。uni-download组件是下载文件的通用组件,可以下载任何类型的文件,包括图片文件。以下是一个简单的示例,演示如何使用uni-download组件来下载图片: ```html <template> <view> <image :src="imgUrl"></image> <button @click="downloadImg">下载图片</button> </view> </template> <script> export default { data() { return { imgUrl: 'https://example.com/image.png' } }, methods: { downloadImg() { uni.downloadFile({ url: this.imgUrl, success: (res) => { if (res.statusCode === 200) { uni.saveImageToPhotosAlbum({ filePath: res.tempFilePath, success: () => { uni.showToast({ title: '保存成功' }) }, fail: () => { uni.showToast({ title: '保存失败', icon: 'none' }) } }) } else { uni.showToast({ title: '下载失败', icon: 'none' }) } }, fail: () => { uni.showToast({ title: '下载失败', icon: 'none' }) } }) } } } </script> ``` 在上述代码中,我们首先在data中声明了一个imgUrl变量,用于存储图片的地址。然后,在页面中展示该图片,并在按钮的点击事件中调用downloadImg方法来触发下载操作。在downloadImg方法中,我们使用uni.downloadFile来下载图片,并在下载完成后使用uni.saveImageToPhotosAlbum来保存图片到相册中。 请注意,为了使uni.downloadFile能够下载图片文件,必须在manifest.json文件中配置网络权限。您可以在manifest.json中添加以下代码: ```json { "permission": { "scope.userLocation": { "desc": "获取用户位置信息" }, "scope.writePhotosAlbum": { "desc": "保存图片到相册" }, "scope.record": { "desc": "麦克风" }, "scope.camera": { "desc": "摄像头" }, "scope.album": { "desc": "相册" }, "scope.userInfo": { "desc": "用户信息" }, "scope.userLocationBackground": { "desc": "后台定位" }, "scope.werun": { "desc": "微信运动步数" }, "scope.writeVideo": { "desc": "保存视频到相册" }, "scope.cameraRecord": { "desc": "拍摄小视频" }, "scope.invoice": { "desc": "获取发票" }, "scope.invoiceTitle": { "desc": "获取发票抬头" }, "scope.address": { "desc": "获取通讯地址" }, "scope.recordPreset": { "desc": "前置摄像头" }, "scope.writeContacts": { "desc": "通讯录" }, "scope.readSMS": { "desc": "短信" }, "scope.sensor": { "desc": "传感器" }, "scope.location": { "desc": "地理位置" }, "scope.phone": { "desc": "拨打电话" }, "scope.microphone": { "desc": "麦克风" }, "scope.notification": { "desc": "通知" }, "scope.cameraAlbum": { "desc": "拍照" }, "scope.calendar": { "desc": "日历" }, "scope.appointment": { "desc": "约会" }, "scope.reminder": { "desc": "提醒" }, "scope.bluetooth": { "desc": "蓝牙" }, "scope.chooseAddress": { "desc": "选择收货地址" }, "scope.addressBook": { "desc": "通讯录" }, "scope.locationBackground": { "desc": "后台定位" } } } ``` 在上述代码中,我们添加了"scope.writePhotosAlbum"权限,以允许应用程序保存图片到用户的相册中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

结城明日奈是我老婆

支持一下一直热爱程序的菜鸟吧

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

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

打赏作者

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

抵扣说明:

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

余额充值