首页 > 其他分享 >Vue学习笔记51--解绑组件自定义事件

Vue学习笔记51--解绑组件自定义事件

时间:2024-03-13 17:55:33浏览次数:22  
标签:Vue name 自定义 -- defineMyEvent 事件 组件 解绑

解绑组件自定义事件

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

      //解绑多个自定义事件
      // this.$off(['defineMyEvent', 'demoEvent'])  //等价于this.$off()

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

注意:  

  1. 如果 vm 被销毁,则其所有子组件、事件均失效
  2. 注意:销毁后的组件的自定义事件也将失效

示例一:

App.vue

<template>
  <div class="app">
    <!-- <img src="./assets/logo.png"> -->
    <h2>{{msg}}</h2>
    <hr>
    <!-- 第一种写法:
      使用v-on: 或@
      通过父组件给子组件绑定一个自定义事件实现:子给父传递数据 
    -->
    <!-- <Student v-on:defineMyEvent="getStudentName"></Student> -->
    <!-- <Student @defineMyEvent.once="getStudentName"></Student> -->
    <Student @defineMyEvent="getStudentName"
             @demoEvent="demoMethod"></Student>
    <hr>

    <!-- 第二种写法
      通过父组件给子组件绑定一个自定义事件实现--子给父传递数据,使用ref
     -->
    <Student ref="student" />

    <hr>
    <!-- 通过父组件给子组件传递函数类型的props实现:子给父传递数据 -->
    <School :getShcoolName="getShcoolName"></School>

  </div>
</template>

<script>
// 引入组件
import Student from './components/Student.vue';
import School from './components/School.vue';
export default {
  name: 'App',
  components: {
    Student,
    School
  },
  data () {
    return {
      msg: 'Vue你好'
    }
  },
  methods: {
    getShcoolName (name) {
      console.log('app收到了学校名称:', name)
    },
    getStudentName (name) {
      console.log('App接收到了学生姓名:', name)
    },
    demoMethod () {
      console.log('demoEvent被触发了')
    }
  },
  // 挂载完毕
  mounted () {
    // this.$refs.student.$on('defineMyEvent', this.getStudentName) //绑定自定义事件

    this.$refs.student.$once('defineMyEvent', this.getStudentName) //绑定自定义事件 --一次性哦

    // 延迟执行
    // // setTimeout(() => {
    // //   this.$refs.student.$on('defineMyEvent', this.getStudentName)
    // // }, 3000)
  }
}
</script>

<style scoped>
.app {
  background-color: rgb(178, 168, 168);
}
</style>

Student.vue

<!-- 组件的结构 -->
<template>
  <div class="student">
    <h3>学生姓名:{{name}}</h3>
    <h3>学生性别:{{ age }}</h3>
    <h3>当前求和为:{{mynum}}</h3>
    <button @click="mynum++">++ mynum++</button>
    <button @click="numberAdd">method mynum++</button>
    <button @click="sendStudentName">把学生姓名给app</button>
    <button @click="unbind">解绑自定义事件</button>
    <button @click="destoryVc">销毁当前Student组件的实例vc</button>
  </div>
</template>

<!-- 组件交互相关的代码(数据、方法等) -->
<script>
export default ({
  // eslint-disable-next-line vue/multi-word-component-names
  name: 'Student',
  data () {
    return {
      msg: '我正在学习 Vue',
      name: '心仪',
      age: 6,
      mynum: 10
    }
  },
  methods: {
    numberAdd () {
      this.mynum++;
      console.log('numberAdd被执行了')
    },
    sendStudentName () {
      // 触发Student组件实例身上的自定义事件
      this.$emit('defineMyEvent', this.name)
      this.$emit('demoEvent')
    },
    unbind () {
      // this.$off('defineMyEvent')//解绑一个自定义事件

      //解绑多个自定义事件
      // this.$off(['defineMyEvent', 'demoEvent'])  //等价于this.$off()

      //解绑所有自定义的事件
      this.$off()
    },
    destoryVc () {
      // 销毁了当前Student组件的实例对象
      // 注意:销毁后的组件的自定义事件也将失效
      this.$destroy()
    },
  }

})
</script>

<!-- 组件的默认样式 css写法 -->
<!-- <style scoped>
.demo {
  background-color: cadetblue;
}
</style> -->

<style lang="less" scoped>
.student {
  background-color: cadetblue;
  .myfontsize {
    font-size: 40px;
  }
}
</style>

main.js

// 引入Vue
import Vue from 'vue'
// 引入App
import App from './App.vue'
// 配置提示
Vue.config.productionTip = false

new Vue({
  render: h => h(App),
  /* 
  钩子
  如果 vm 被销毁,则其所有子组件、事件均失效
  mounted () {
    setTimeout(() => {
      this.$destroy
    }, 5000)
  }, */
}).$mount('#app')

  

标签:Vue,name,自定义,--,defineMyEvent,事件,组件,解绑
From: https://www.cnblogs.com/YYkun/p/18071096

相关文章

  • 几种常见排序算法
    冒泡排序从小到大排 两个两个排序,这样最大的就在后面,下楼排序就排除最后一个,每次循环减一即可,还可以加一个状态,只要有一个状态不变,顺序是正确的import{ref}from'vue'letarr1=ref([])consta1=(arr:any)=>{for(leti=0;i<arr.length-1;i++){......
  • 个人项目
    这个作业属于哪个课程https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering2024/这个作业要求在哪里https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering2024/homework/13136这个作业的目标了解项目开发的过程,学习github的使用方法GitHub链接:https:/......
  • VRay渲染动画怎么快一点?提升VRay动画渲染方法
    ​随着动画和视觉效果行业对高品质渲染的需求日益增长,V-Ray作为一款领先的渲染工具,面临着提升渲染效率的挑战。项目规模和复杂度的扩大导致渲染时间延长,对交付期限造成影响。探索加速V-Ray渲染流程的方法变得尤为关键。一、动画渲染的常见瓶颈动画渲染过程中的每一帧都需要执......
  • pytest-参数request的使用
    如果想把登录操作放到前置操作里,也就是用到@pytest.fixture装饰器,传参就用默认的request参数user=request.param这一步是接收传入的参数,下面演示一个参数的情况  那当request传递两个参数的时候,如果用到@pytest.fixture,里面用2个参数情况,可以把多个参数用一个字典去存储,这......
  • Python 函数的参数传递 *args和 **kwargs
    知识点:在函数调用时,*会以单个元素的形式解包一个元祖,使其成为独立的参数。在函数调用时,**会以键/值对的形式解包一个字典,使其成为独立的关键字参数。 deff(a,*args):print(args)f(1,2,3,4)​```输出为:(2,3,4)​```虽然传入1,2,3,4,但是解包为(1),(2,3,4),其中a是1......
  • 如何免费将PDF转成PPT?
    在日常的办公中,我们从互联网上下载的许多资料大多都是以PDF格式保存的,而ppt则是一种演示文稿,我们在开会作报告之前,一般会将要分享的内容做成ppt文件,这样开会作报告的时候就变得得心应手。很多小伙伴还不知道如何将pdf转换成ppt,而且如果使用的转换方法不好的话,那转换后的ppt文件格......
  • 【分享】记一次项目迁移(docker java | docker python)
    项目:前端Vue3,后端Python+Java,数据库Redis+MySQL原先部署在centos7里面的,使用的宝塔面板部署的,还算方便。但是服务器要到期了,要将项目迁移到另外一台服务器。另外一台服务器是opencloudos+1plane本来想构建一个jdk1.8+python3.12+Nodejs环境的镜像奈何本人没学过docker,操作起......
  • docker 制作与使用 arcgisserver 镜像
    PS:有状态服务本身不适合部署到容器中,数据恢复比较困难,生产环境请直接安装到Linux服务器中1.准备内容在同级目录下,准备以下内容空的dockerfile文件:arcgisserver.dockerfilelinux版的ArcGISServer安装包:ArcGIS_Server_Linux_xxxxxx.tar.gzArcGISServer的许可文件:ArcGI......
  • js-正负数保留小数点特定位数
    functionround(num,iCount){//iCount保留几位小数letchangeNum=numletzs=true//判断是否是负数if(changeNum<0){changeNum=Math.abs(changeNum)z......
  • ReentrantLock 使用
    ReentrantLock介绍ReentrantLock是Java中的一个可重入锁,它提供了与synchronized关键字类似的功能,但相比synchronized,ReentrantLock提供了更多的灵活性和功能。定义:ReentrantLock是一个可重入且独占式的锁,它具有与使用synchronized监视器锁相同的基本行为和语义,但与......