22_组件自定义事件

22_组件自定义事件

App.vue

<template>
  <div>
    <img src="./assets/logo.png" alt="logo" />
    <School></School>

    <!-- 第一种写法 once 就生效一次 子给父传递数据-->
    <Student v-on:atguigu.once="getStudentName"></Student>

    <!-- <Student @atguigu="getStudentName"></Student> -->

    <!-- 第二种写法 子给父传递数据-->
    <!-- <Student ref="student" /> -->
  </div>
</template>

<script>
//引入组件
import School from "./components/School";
import Student from "./components/Student";
export default {
  name: "App",
  components: {
    School,
    Student,
  },
  methods: {
    getStudentName(name) {
      console.log("收到的学生名:", name);
    },
  },
  /* 和第二种相匹配
  mounted() {
    //可以等3s再执行 
    setTimeout(() => {
      this.$refs.student.$on("atguigu", this.getStudentName); //绑定自定义事件
      //触发一次 
      //this.$refs.student.$once("atguigu", this.getStudentName); //绑定自定义事件
    }, 3000);
  },    */
};
</script>

<style></style>

Student.vue

<template>
   <div>
       <h2>学生名称:{{name}}</h2>
        <h2>学生年龄: {{age}}</h2>
        <button @click="sendStudentName">把学生名给App</button>
   </div>
</template>

<script>
  export default{
      name:'Student', //变量 一般和文件名一样
      data() {
        return {
          name: "张三",
          age: 18,
        };
      },
      methods:{
      sendStudentName(){
        //触发student组件实例身上的atguigu事件
        this.$emit('atguigu',this.name)
      }
    }
    };
    
   
</script>


<style>
  
</style>

解绑自定义事件

App.vue

<template>
  <div>
    <img src="./assets/logo.png" alt="logo" />
    <School></School>

    <!-- 第一种写法 once 就生效一次 子给父传递数据-->
    <Student v-on:atguigu="getStudentName" @demo="m1"></Student>

  </div>
</template>

<script>
//引入组件
import School from "./components/School";
import Student from "./components/Student";
export default {
  name: "App",
  components: {
    School,
    Student,
  },
  methods: {
    getStudentName(name) {
      console.log("收到的学生名:", name);
    },
    m1(){
      console.log(111);
    }
  },
};
</script>

<style></style>

Student.vue

<template>
  <div>
    <h2>学生名称:{{ name }}</h2>
    <h2>学生年龄: {{ age }}</h2>
    <button @click="sendStudentName">把学生名给App</button>
    <button @click="unbind">解绑atguigu事件</button>
  </div>
</template>

<script>
export default {
  name: "Student", //变量 一般和文件名一样
  data() {
    return {
      name: "张三",
      age: 18,
    };
  },
  methods: {
    sendStudentName() {
      //触发student组件实例身上的atguigu事件
      this.$emit("atguigu", this.name);
      this.$emit("demo");
    },
    unbind(){
    // this.$off('atguigu')   //只是用解绑一个自定义事件
    // this.$off(['atguigu','demo'])
    this.$off() //所有的事件都解绑
    }
  },
};
</script>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值