组件自定义事件

1. 一种组件间通信的方式,适用于:子组件===>父组件

2.使用场景: A是父组件, B是子组件,B想给A传数据,那么就要在A中给B绑定自定义事件(事件的回调在A中)。

3.绑定自定义事件:

1.第一种方式,在父组件中: <Demo @atguigu="test"/> 或 <Demo v-on:atguigu="test"/>

        2.第二种方式,在父组件中:       

<Demo ref="demo"/>

...

mounted(){

   this.$refs.xxx.$on('atguigu',this.test)

}

3.若想让自定义事件只能触发一次, 可以使用once修饰符,或$once方法。

4.触发自定义事件:this.$emit('atguigu',数据)

5.解绑自定义事件this.$off('atguigu')

6.组件上也可以绑定原生DOM事件,需要使用native修饰符。

    7.注意:通过this.$refs.xxx.x $on('atguigu',回调)绑定自定义事件时,回调要么配置在methods中,要么用箭头函数,否则this指向会出问题!

App

 <template lang="">
    <div class="app">
        <h1>{{msg}},学生姓名是:{{studentName}}</h1>
        <!-- 通过父组件给子组件传递函数类型的props实现:子给父传递数据 -->
        <School :getSchoolName="getSchoolName" />

        <!-- 通过父组件给子组件绑定一个自定义实现:子给父传递数据(第一种写法:使用v-on) -->
        <!-- <Student v-on:atguigu="getStudentName" @demo="m1" /> -->
        <!-- <Student @atguigu.once="getStudentName" /> //一次性-->

        <!-- 通过父组件给子组件绑定一个自定义实现:子给父传递数据(第二种写法:ref) -->
        <Student ref="student" @click.native="show"/>
    </div>
</template>

<script>
    // 引入Student组件
    import Student from './components/Student'
    import School from './components/School'

    export default {
        name:'App',
        components:{Student,School},
        data(){
            return {
                msg:'你好啊!',
                studentName:''
            }
        },
        methods: {
            getSchoolName(name){
                console.log('App收到了学校名:',name);
            },
            getStudentName(name,...params){
                console.log('App收到了学生名:',name,params);
                this.studentName = name
            },
            m1(){
                console.log('demo事件被触发');
            },
            show(){
                alert(123)
            }
        },
        mounted() {
            // 延迟三秒再触发
            /* setTimeout(()=>{
                this.$refs.student.$on('atguigu',this.getStudentName)
            },3000) */
            // this.$refs.student.$once('atguigu',this.getStudentName)//绑定自定义事件(一次性)
        },
    }
</script>

<style scoped>
    .app{
        background-color: gray;
        padding: 5px;
    }
</style>

Student



<template >
    <div class="school">
        <h2>学生姓名:{{name}}</h2>
        <h2>学生性别:{{sex}}</h2>
        <h2>当前求和为:{{number}}</h2>
        <button @click="add">点我number++</button>
        <button @click="sendStudentName">把学生名给App</button>
        <button @click="unbind">解绑atguigu事件</button>
        <button @click="death">销毁当前Student组件的实例(vc)</button>
    </div>
</template>

<script>
    export default {
        name:'Student',
        data(){
            return {
                name:'张三',
                sex:'男',
                number:0
            }
        },
        methods: {
            add(){
                console.log('add回调被调用了');
                this.number++
            },
            sendStudentName(){
                // 触发Student组件实例身上的atguigu事件
                this.$emit('atguigu',this.name,366,888,999)
                // this.$emit('demo')
                // this.$emit('click')
            },
            unbind(){
                this.$off('atguigu') //只适用于解绑一个自定义事件
                // this.$off(['atguigu','demo']) //解绑多个自定义事件
                // this.$off() //解绑所有自定义事件
            },
            death(){
                this.$destroy()//销毁了当前Student组件的实例,销毁后所有Student实例的自定义事件都不奏效
            }
        },
    }
</script>

<style scoped>
    .school{
        background-color: orange;
        padding: 5px;
        margin-top: 30px;
    }
</style>

School



<template >
    <div class="school">
        <h2>学校名称:{{name}}</h2>
        <h2>学校地址:{{address}}</h2>
        <button @click="sendSchoolName">把学校名给App</button>
    </div>
</template>

<script>
    export default {
        name:'School',
        props:['getSchoolName'],
        data(){
            return {
                name:'尚硅谷',
                address:'北京',
            }
        },
        methods: {
            sendSchoolName(){
                this.getSchoolName(this.name)
            }
        },
    }
</script>

<style scoped>
    .school{
        background-color: skyblue;
        padding: 5px;
    }
</style>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值