当前位置: 首页 > 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/a/147893.html

相关文章:

  • UE5 UE4 播放视频没有声音解决
  • 浪潮信息“源”Embedding模型登顶MTEB榜单第一名
  • 项目技术栈-解决方案-web3去中心化
  • 缓存与数据库不一致的解决方案:深入理解与实践
  • 将Excel文件的两个表格经过验证后分别读取到Excel表和数据库
  • 为什么hbase在大数据领域渐渐消失
  • 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
  • 文件上传绕过
  • 设计模式篇---外观模式
  • 搜索的剪枝