$emit,$on,$off--vue

父组件可以使用 props 把数据及父组件的的方法传给子组件。例:@click='close'
子组件可以使用 $emit 触发父组件的自定义事件。例:close(){ this.$emit('closeModal')}

vm.$emit( event, arg ) //触发当前实例上的事件,arg是传递给父组件的参数
vm.$on( event, fn )    //监听event事件后运行 fn
$off(type, fn)		   //注销消息方法 type:消息名称	fn:消息回调函数

$emit:

this $emit(‘自定义事件名’,要传送的数据);触发当前实例上的事件,要传递的数据会传给监听器;

//父组件:
<template>
	<view class="content">
        <!-- @closeModal="closeModal" 将closeBodel方法传递给子组件 -->
		<service-modal :tel="tel" @closeModal="closeModal" @tip="tip" />
	</view>
</template>

<script>
	import serviceModal from '@/components/service-modal'
	export default {
		data() {
			return {tel:"12345678900"}
		},
		components: {
			serviceModal
		},
        methods: {
			closeModal(){
				console.log("关闭弹窗方法调用")
			},
            tip(data){
				console.log(data)
			},
		},
	}
</script>
<style lang="scss"></style>
//子组件:
<template>
	<view class="modal">
		<view class="tel-tit">
			<view>客服电话</view>
		</view>
		<view class="tel-con">
			<view>{{tel}}</view>
			<view>工作时间:(09:00-18:00)</view>
		</view>
        <view class="tel-btn">
            <!-- 子组件内部点击事件closeModal -->
			<view @click="closeModal">取消</view>
		</view>
	</view>
</template>

<script>
	import { mapGetters } from 'vuex';
	export default {
		name:'modal',
		props: {
			tel: {
                type: [String,Number]
			},
		},
		data(){
			return{}
		},
		created() {},
		computed: {},
		methods: {
            closeModal(){ // 使用$emit调用父组件方法
				this.$emit('closeModal')
                this.$emit('tip','弹窗已被关闭!')

                // 执行完毕之后控制台会打印两句话
                //   关闭弹窗方法调用
                //   弹窗已被关闭!
			},
        },
	}
</script>
<style lang="scss" scoped></style>

$on

this.$on ( ′ 事 件 名 ′ ,callback ); callback回调emit要传送的数据

监听当前实例上的自定义事件。事件可以由vm.emit触发。回调函数会接收所有传入事件触发函数的额外参数。注:使用$on监听后,记得使用$off`销毁事件。

$off

        1)如果没有提供参数,则移除所有的事件监听器;

        2)如果只提供了事件,则移除该事件所有的监听器;

        3)如果同时提供了事件与回调,则只移除这个回调的监听器。

使用$on和$off后,子组件发生变化

//父组件依然使用上边$emit的父组件
//子组件:
<template>
	<view class="modal">
		<view class="tel-tit">
			<view>客服电话</view>
		</view>
		<view class="tel-con">
            // {{}} 使用插值表达式引用tel(有的人也叫它大胡子表达式)
			<view>{{tel}}</view>
			<view>工作时间:(09:00-18:00)</view>
		</view>
        <view class="tel-btn">
			<view @click="closeModal">取消</view>
		</view>
	</view>
</template>

<script>
	import { mapGetters } from 'vuex';
	export default {
		name:'modal',
		props: {
			tel: {
                type: [String,Number]
			},
		},
		data(){
			return{}
		},
		created() {},
		computed: {},
        mounted() {
            //使用$on去监听$emit
            //当$emit里面的数据变化的时候,就会触发$on中的第二个参数是个函数
            this.$on('closeModal',res=>{
                console.log(res);
            })
        },
        destoryed() {
            //移除事件监听
            this.$off("closeModal");
        },
		methods: {
            closeModal(){ // 使用$emit调用父组件方法
				this.$emit('closeModal')
                this.$emit('tip','弹窗已被关闭!')

                // 执行完毕之后控制台会打印两句话
                //   关闭弹窗方法调用
                //   弹窗已被关闭!
			},
        },
	}
</script>
<style lang="scss" scoped></style>

官方文档:$emit | Vue.js

Vue中,$on、$off、$emit是一些用于组件间通信的方法。可以通过使用$bus实例来传递非父子组件之间的数据。比如,使用$emit方法发送事件,使用$on方法监听事件,使用$off方法移除事件的绑定。 在子组件中,可以通过this.$bus.$emit(eventName, payload)来触发一个事件并传递数据。比如子组件1可以使用this.$bus.$emit("hello", param)来触发名为"hello"的事件,并将param作为数据传递。 在组件中,可以使用this.$bus.$on(eventName, callback)来监听一个事件。当触发了该事件时,绑定的回调函数将被调用。比如在子组件中可以使用this.$on('closeModal', res => {})来监听名为"closeModal"的事件。 同时,也可以使用this.$bus.$off(eventName)来移除绑定的事件。比如在组件销毁前,可以使用this.$off("closeModal")来移除对"closeModal"事件的监听。 通过使用$on、$off、$emit这些方法,可以方便地在Vue组件间进行通信和数据传递。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [vue中$bus的用法及$emit、$on、$off的使用](https://blog.csdn.net/leijie0322/article/details/128210817)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [vue中$emit跟$on,$off跟用法](https://blog.csdn.net/Billow_lamb/article/details/115007731)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [$emit,$on,$off--vue](https://blog.csdn.net/weixin_57844432/article/details/126599659)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值