Vue中设置组件的自定义事件和解绑组件的自定义事件

news/2024/7/24 13:18:17 标签: 前端, javascript, vue.js

组件的自定义事件

  • 设置School组件实现props,子给父传数据。School组件用于和Student组件做对比。

  • App向School组件传getSchoolName,School组件通过props接收存入School的VueConponent。随后通过调用getSchoolName实现子给父传递数据

  • 想让组件标签识别原生Vue提供的事件。需要加入native

    <School @click.native='show'/>
  • <template>
      <div class="school">
       <h2>学校的名字:{{ name  }}</h2>
       <button @click="sendSchoolName">测试sendSchoolName方法</button>
      </div>
    </template>
    ​
    <script>
    export default {
      props: ['getSchoolName'],
        data(){
            return {
             name: '小猴子的玩具商'
            }
        },
        methods:{
          sendSchoolName(){
            this.getSchoolName(this.name)
          }
        },
    }
    </script>
    <style scoped>
      .school {
        background-color: pink;
        padding: 5px;
        margin-top: 30px;
      }
    </style>>
    ​
  • Student组件实现功能也是子给父传递数据。但用组件的自定义事件来实现

  • <template>
      <div class="blue">
        <h2>学生的名字:{{ name }}</h2>
        <h2>学生的名字:{{ address }}</h2>
       <button @click="sendStudentName">测试sendStudentName方法</button>
      </div>
    </template>
    <script>
    export default {
        name:'Student',
        data(){
            return {
                name:'boy',
                address:'老地方'
            }
        },
        methods: {
            sendStudentName(){
                // 事件在谁身上则在哪里触发,故触发Student组件实例身上的boy事件,emit有发射的意思。传了一个参数name给App
                this.$emit('boy',this.name)
            }
        },
    }
    </script>
    <style scoped>
        .blue{
            background-color: blue;
            padding: 5px;
        }
    </style>
     
  • Student和School组件实现的区别在于

    1、App中的getSchoolName方法是直接给School组件,School组件需要props接收一下,自己调用一下。

    2、App中的getStudentName方法不直接传给Student组件,而是利用触发事件( this.$emit() ) 的方式,调用demo

  • <template>
      <div class="title">
        <router-view/>
        <h2>{{ mas }}</h2>
        <!-- 给组件的实列对象VueComponent上绑定事件(boy事件)。如果触发boy事件demo就被调用 -->
        <!-- 第一种写法,<Student v-on:boy = "demo"/> -->
        <!-- 第二种写法,用ref获取Student组件的VueComponent-->
          <Student ref="student"/>
          
        <!-- 通过父组件给子组件传递函数类型的props实现:子给父传递数据 -->
        <School :getSchoolName ='getSchoolName'/>
      </div>
    </template>
    ​
    <script>
    import Student from '../src/components/Student.vue'
    import School from '../src/components/School.vue'
    export default {
      name: 'App',
      components:{Student,School},
      data(){
        return {
          mas: '你好啊'
        }
      },
      methods: {
          //接收School组件传过来的name
        getSchoolName(name){
          console.log('发送成功了',name);
        },
        //接收Student组件传过来的name
        demo(name){
          console.log('demo被调用',name)
        }
      }
    },
     // 第二种写法的灵活性更高,当要求是:延迟3秒才触发事件。第二种方法可以实现。如下
      mounted(){
        setTimeout(()=>{
          // this.$refs.student为获取到Student组件的VueComponent,$on为当什么的时候。括号内的第一个元素为事件名,第二个元素为触发事件回调的方法
        this.$refs.student.$on('boy', this.demo)
        },3000)
      }
    </script>
    <style scoped>
       .title {
        background-color: gray;
        padding: 5px;
       }
     

    解绑组件的自定义事件

    • this.$off()//解绑一个自定义事件

    • this.$off([ ])//解绑多个自定义事件

    • this.$off()//解绑所有的自定义事件

    • this.$destroy()销毁当前组件的VueConponent,而Vue提供的事件还能响应

    • <template>
        <div class="blue">
          <h2>学生的名字:{{ name }}</h2>
          <h2>学生的名字:{{ address }}</h2>
         <button @click="sendStudentName">测试sendStudentName方法</button>
         <button @click="unbind">解绑自定义事件</button>
         <button @click="death">销毁当前组件的实例化对象</button>
      ​
        </div>
      </template>
      ​
      <script>
      export default {
          name:'Student',
          data(){
              return {
                  name:'boy',
                  address:'老地方'
              }
          },
          methods: {
              sendStudentName(){
                  // 事件在谁身上则在哪里触发,故触发Student组件实例身上的boy事件,emit有发射的意思。传了一个参数name
                  this.$emit('boy',this.name)
                  this.$emit('girl')
              },
              unbind(){
                  this.$off('boy')//解绑一个自定义事件
                  this.$off(['boy','girl'])//解绑多个自定义事件
                  this.$off()//解绑所有的自定义事件
              },
              death(){
                  //销毁当前的Student组件的实例,销毁后所有的Student实列的自定义事件全都不奏效。
                  this.$destroy()
              }
          },
      }
      </script>
      <style scoped>
          .blue{
              background-color: blue;
              padding: 5px;
          }
      </style>


http://www.niftyadmin.cn/n/5295585.html

相关文章

通信原理课设(gec6818) 007:语音识别

目录 1、去科大讯飞官网下载对应的sdk 2、科大讯飞文件夹的意思 3、配置ARM的录音环境 4、编程实现语音识别 我们的需求是将一个语音文件从客户端传到服务器&#xff0c;因此我们最好是选用tcp 现在市面上面常用的语音识别解决方案为&#xff1a;科大讯飞c和百度c 离…

解密垃圾邮件分类:基于SVM的数据挖掘项目

垃圾邮件&#xff08;Spam&#xff09;的泛滥成灾一直是电子邮件系统中的一个严峻问题。随着垃圾邮件技术的不断演变&#xff0c;传统的过滤方法逐渐显得力不从心。因此&#xff0c;本项目旨在利用支持向量机&#xff08;SVM&#xff09;这一强大的机器学习工具&#xff0c;实现…

面试要点,算法,数据结构等练习大全

有趣的算法&#xff0c;面试常常碰到&#xff0c;多种语言实现~ 1 从数组中找出两个数字使得他们的和是给定的数字 tags: #hash 使用一个散列&#xff0c;存储数字和他对应的索引。然后遍历数组&#xff0c;如果另一半在散列当中&#xff0c;那么返回 这两个数的索引&#x…

1154. 一年中的第几天 --力扣 --JAVA

题目 给你一个字符串 date &#xff0c;按 YYYY-MM-DD 格式表示一个 现行公元纪年法 日期。返回该日期是当年的第几天。 解题思路 将每个月包含的日期数枚举出来(12月可枚举也可不枚举)&#xff1b;通过分割字符串获取当前日期的年、月、日&#xff1b;计算当前年份是否为闰年…

List常见方法和遍历操作

List集合的特点 有序&#xff1a; 存和取的元素顺序一致有索引&#xff1a;可以通过索引操作元素可重复&#xff1a;存储的元素可以重复 List集合的特有方法 Collection的方法List都继承了List集合因为有索引&#xff0c;所以有了很多操作索引的方法 ublic static void main…

西北工业大学计算机组成原理实验报告——verilog前两次

说明 为了有较好的可读性&#xff0c;报告仅仅粘贴关键代码。该PDF带有大纲功能&#xff0c;点击大纲中的对应标题&#xff0c;可以快速跳转。 实验目标 掌握单周期CPU执行指令的流程和原理&#xff1b;学习使用verilog HDL语言实现单周期CPU, 并通过功能仿真&#xff1b;提…

手机号码校验工具类(正则表达式)

手机号码有很多种方式&#xff0c;可以使用正则表达式&#xff0c;进行判断。网上有很多&#xff0c;不用去记&#xff0c;查就行。 import org.apache.commons.lang3.StringUtils; ​ import java.util.regex.Matcher; import java.util.regex.Pattern; ​ /*** 手机号码校验…

Unity关于动画混合树(Blend Tree)的使用

在动画与动画的切换过程中&#xff0c;常因为两个动画之间的差距过大&#xff0c;而显得动画的切换很不自然。 这时候就需要动画混合树Blend Tree这个功能。使用混合树可以将多个动画混合在一起&#xff0c;例如在处理角色的移动中&#xff0c;走动画与跑动画切换的时候&#x…