当前位置: 首页 > article >正文

Vue组件的自定义事件$emit

组件上的自定义事件是和组件的自定义属性一样,都是模仿HTML正常的标签,由组件给出事件句柄,由使用组件的父组件提供事件处理函数。组件自定义事件真正触发的地方是在组件模板的标签上,组件自己不提供事件处理函数,将这个处理函数给出一个定义,将这个定义抛给使用组件的父组件,由父组件给出。子组件其他处理函数可以通过组件自定义事件的定义调用这个函数。依照面向对象编程设计的原则,属性自定义事件具有依赖倒置的原则,即依赖抽象,不依赖具体。

组件自定义事件示例:

<script setup lang="ts">
const props=defineProps<{
  msg: string,
  count:number,
  show:boolean,
  list:string[],
  pfun:Function
}>()
const emits=defineEmits<{
  (e:"wait",time:number):void
  (e:"change"):void
  (e:"append",str:string):void
}>()

let test=()=>{
   props.pfun();
   emits('wait',2000);
   return "props.pfun is called, emits wait is called";
}
console.log(test())
</script>

<template>
  <div @click="$emit('change')">
    <div>{{ count }}</div>
    <div @click="$emit('wait',1000)">{{ msg }}</div>
    <div @click="$emit('wait')">{{ show }}</div>
    <div @click="$emit('append','appstr')">{{ list }}</div>
  </div>
</template>

组件使用示例:

<script setup lang="ts">
import {ref} from "vue"
import HelloWorld from './components/HelloWorld.vue'

const hlist=ref(["hello","wrold","vue"]);
const count=ref(10);

function hpfun(){
  console.log("The value is from father component function");
  return "The value is from father component function";
}

function waitOnHelloWorld(time:number){
   console.log("wait for "+time+" seconds");
   count.value+=time;
   console.log("count is "+count.value);  
}

function appendToList(appstr:string){
  hlist.value.push(appstr);
  console.log("append is working");
}

function changeHW(){
  console.log("change happens")
}
</script>

<template>
  <HelloWorld :pfun="hpfun" @change="changeHW" @append="appendToList('world')" @wait="waitOnHelloWorld(10)"  :count="count" msg="Yes, You did it!" :show="true" :list="hlist"></HelloWorld>
</template>

从以上案例中可以得出结论:

1、组件的自定义事件可以设置调用时函数的形参类型、形参个数

2、组件定义时可以在模板上绑定自定义事件,事件参数可以添加也可以不添加,这些参数都不起作用

3、组件使用时,只有父组件为组件的自定义事件绑定了事件处理函数,组件上事件才会有效果

4、父组件提供事件处理函数可以提供组件自定义事件规定的参数,也可以提供、不提供、提供超过形参个数的参数

5、组件自定义事件以父组件实际使用时为组件提供的事件处理函数为准


http://www.kler.cn/news/147893.html

相关文章:

  • ArcGIS10.x系列 Python工具箱教程
  • TypeScript和JavaScript有什么不同
  • 实战Flask+BootstrapTable最实用服务端分页查询动态表头及数据(ajax方式)
  • 群晖NAS配置之自有服务器ngrok实现内网穿透
  • bluez inquiry 流程梳理--从代码层面理解bluez架构
  • opencv-医学图像预处理
  • LeetCode算法题解(动态规划)|LeetCode198. 打家劫舍、LeetCode213. 打家劫舍 II、LeetCode337. 打家劫舍 III
  • 小程序中的大道理--综述
  • Android12:内置第三方应用,权限控制器已停止运行,应用app已停止运行
  • PC行内编辑
  • 一篇文章搞懂 JavaScript 箭头函数
  • 力扣2.两数相加
  • IDEA:Command line is too long
  • 嵌入式常见协议---IIC协议
  • 《使用Python将Excel数据批量写入MongoDB数据库》
  • C++(20):通过remove_cvref_t退化类型
  • 自动化部署 扩容openGauss —— Ansible for openGauss
  • 文件上传绕过
  • 设计模式篇---外观模式
  • 搜索的剪枝
  • 论文阅读:“Appearance Capture and Modeling of Human Teeth”
  • 【复杂网络建模】——ER网络度分布、无标度网络度分布
  • centos 7.7 安装Python-3.7.4
  • 华为云编译构建CodeArts Build常见问答汇总
  • VMware系列:此平台不支持虚拟化 Intel-VT-x/EPT 或 AMD-V/RVI
  • 编译器设计02-前端概述
  • .c怎么转.exe?10000字长文带你深剖编译过程!
  • Vatee万腾科技新高峰:Vatee前瞻性创新的数字化之力
  • 西南科技大学电路分析基础实验A1(元件伏安特性测试 )
  • 播放器开发(三):FFmpeg与SDL环境配置