Vue技术之绑定自定义事件

本文介绍Vue.js中子组件向父组件传递数据的方法,包括自定义事件的绑定与触发过程,展示了具体的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

课程参考尚硅谷Vue全家桶

components:
Student.vue

<template>
    <!-- 组件的结构 -->
    <div class="student">
        <h2>学生姓名:{{studentName}}</h2>
        <h2>学生年龄:{{age}}</h2>
        <button @click="sendStudentName">把学生名给App</button>
        </div>
</template>

<script>
    //组件交互相关的代码(数据、方法等)
    export default {
        // eslint-disable-next-line vue/multi-word-component-names
        name:'Student',
        props:['getStudentName'],
        data(){
            return {
                studentName:'张三',
                age:18
            }
        },
        methods:{
            sendStudentName(){
                //触发Student组件实例身上的atguigu事件
                this.$emit('getStudentName',this.studentName)
            }
        }
    }
        
</script>
<style lang="less"  scoped>
    .student{
    background-color: pink;
    padding: 5px;
    margin-top: 30px;
}
</style>

School.vue

<template>
    <!-- 组件的结构 -->
    <div class="school">
        <h2>学校名称:{{schoolName}}</h2>
        <h2>学校地址:{{address}}</h2>
        <button @click="sendSchoolName">把学校名给App</button>
        </div>
</template>

<script>
    //组件交互相关的代码(数据、方法等)
    export default {
        // eslint-disable-next-line vue/multi-word-component-names
        name:'School',
        data(){
            return {
                schoolName:'xxx大学',
                address:'北京',
            }
        },
        props:['getSchoolName'],
        methods:{
            sendSchoolName(){
                this.getSchoolName(this.schoolName)
            }
        }
    }
        
</script>
<style scoped>
    .school{
        background-color: skyblue;
        padding: 5px;
    }
</style>

App.vue

<template>
 <div class="app">
  <h1>{{msg}}</h1>
  <!-- 通过父组件给子组件传递函数类型的props实现:子给父传递数据 -->
    <School :getSchoolName="getSchoolName" />
  <!-- 通过父组件给子组件传递函数类型的props实现:子给父传递数据(第一种写法,使用@ 或 v-on) -->
    <!-- <Student @getStudentName = "getStudentName"/> -->

  <!-- 通过父组件给子组件传递函数类型的props实现:子给父传递数据(第二种写法,使用ref) -->
    <Student ref="student"/>


 </div>
</template>

<script>
import School from '../src/components/School.vue'
import Student from './components/Student.vue';

 export default {
    name:'App',
    data() {
        return {
          msg:'你好啊'
        };
    },
    components: { School, Student },
    methods:{
      getSchoolName(name){
        console.log('App收到了学校名:',name);
      },
      getStudentName(stuName){
        console.log('App收到了学生名:',stuName);
      }
    },
    mounted() {
      this.$refs.student.$on('getStudentName',this.getStudentName)
    },
}

</script>
<style scoped>
.app{
  background-color: #ddd;
  padding: 5px;

}
</style>

组件的自定义事件

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

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

  3. 绑定自定义事件:

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

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

      <Demo ref="demo"/>
      ......
      mounted(){
         this.$refs.xxx.$on('getStudentName',this.test)
      }
      
    3. 若想让自定义事件只能触发一次,可以使用once修饰符,或$once方法。

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值