vue3个人心得---(操作进阶)emit调用父函数---与透传\props的区别

BitLuminaryX
• 阅读 490

emit监听事件

一、调用父函数的三种方式

有三种调用父函数的方式,分别是透传、props、emit。

1、透传

可以把函数放在属性里或放在事件、自定义事件里传递给子组件调用,如下:
父组件

<template>
  <BlogPost e='测试调用父函数' :suxin="hansu" @click="hansu" @cli="hansu"/>
</template>
<script setup>
import BlogPost from './Hello.vue'
function hansu(a,b){console.log(a,b)}
</script>

子组件

<template>
  {{$attrs.e}}<br>
<button @click="$attrs.suxin('我是透传','属性调用')">我是属性调用</button>
<button  @click="$attrs.onClick('我是透传','事件调用')">我是事件调用</button>
<button  @click="onCli('我是透传','自定义事件调用')">我是自定义事件调用</button>
</template>
<script setup></script>

2、props调用函数

可以把函数放在属性里或放在事件、自定义事件里传递给子组件调用,注意要用defineProps函数声明。如下:
子组件

<template>
  {{$attrs.e}}<br>
<button @click="suxin('我是Props','属性调用')">我是属性调用</button>
<button  @click="onClick('我是Props','事件调用')">我是事件调用</button>
<button  @click="onCli('我是Props','自定义事件调用')">我是自定义事件调用</button>
</template>
<script setup>
defineProps({suxin:null,onClick:null,onCli:null})
</script>

3、emit调用函数

可以调用放在事件、自定义事件里的函数,不能调用放在属性里的函数。
<template>调用可以不用defineEmits函数声明。如下:

<template>
  {{$attrs.e}}<br>
<button  @click="$emit('click','我是emit','事件调用')">我是事件调用</button>
<button  @click="$emit('cli','我是emit','自定义事件调用')">我是自定义事件调用</button>
</template>
<script setup></script>

注意:父函的写法,透传和Props在子组件中事件名前要加on首字母要大写,而emit在子组件中事件名前不用加on及大写。

二、emit书写规范

1、在模版部调用

父函数是以$emit函数参数的形式被调用,子组件可向函数传递实参,实参以$emit函数参数的形式书写在父函数的后面,在<template>调用可以不用defineEmits函数声明。书写规范如下:
@click="$emit('父函','参1','参2')"

2、defineEmits声明

普通声明: defineEmits(['父函名','父函名'])
所要传进来的父函名放在[]中括号里;
父函名要加引。
较验声明: defineEmits({父函名:(参数)=>{较验函数},父(参){较验}})
所要传进来的父函放在{}大括号里
父函值为较验项,较验项需放在{}大括号里。

3、在逻辑部调用

<script setup>上调用一定要先用defineEmits函数声明。
defineEmits函数声明后需赋值给变量,父函数是以这个变量函数参数的形式被调用,向父函数传递的实参书写在父函数的后面。如下:

const bodu=defineEmits(['父函'])
bodu('父函',参数)

三、defineEmits较验

  • defineEmits较验是以较验函数返回值来判定的。函数返回值为true时,不发出报警,​无返回值或返回值为false时会发出报警。
  • defineEmits较验只有报警功能,不会阻止事件的运行。
  • 两种书写方式:
    属性式:{父函名:(参数)=>{较验项返回值}}
    函数式:{父函名(参数){较验项返回值}}
    当属性式的属性值为null时,即会跳过较验

1、参数

较验函数的形参为传递给父函数的参数。
较验函数不能引用在 setup 范围中声明的局部变量。但是,它可以引用导入的绑定,因为它们也在模块范围内。

2、较验

可通过在较验函数体内用return true关闭系统默认的报警样式,使用console.log打印自定义的报警样式。
a、较验参数类型
if(!(a instanceof String)){console.log(……)}
if(typeof(a)!=String){console.log(……)}
b、较验参数非空
if(!a){console.log(……)}
c、参数赋值无效
较验的参数为形参,给形参赋值不能改变实参,如下设置缺省值是无效的:if(!a){a='我是默认'}

点赞
收藏
评论区
推荐文章
Alex799 Alex799
4年前
vue最新面试题
最近在面试,总结几个重点的面试题:一、vue父子组件之间的传值:简单来说,子组件通过props方法接受父组件传来的值,子组件通过$emit方法来向父组件发送数据。(具体案例可以看我之前写的博客)。二、vue生命周期函数:beforeCreatecreatedbeforeMountmountedbeforeUpdateupdatedbeforeDestr
Chase620 Chase620
4年前
vue的8种通信方式
1.props/emit1.父组件向子组件传值下面通过一个例子说明父组件如何向子组件传递数据:在子组件article.vue中如何获取父组件section.vue中的数据articles:\'红楼梦','西游记','三国演义'\//section父组件<template<divclass"section"
Souleigh ✨ Souleigh ✨
4年前
React 组件间通信的10种方法
组件间通信方式总结父组件子组件:1.Props2.InstanceMethods子组件父组件:1.CallbackFunctions2.EventBubbling兄弟组件之间:1.ParentComponent不太相关的组件之间:1.Context2.Portals3.Global
爱丽丝13 爱丽丝13
4年前
React 组件通信之发布订阅模式
React通信react的数据流是单向的,react通信有以下几种方式:父向子通信:传入props子向父通信:父组件向子组件传一个函数,然后通过这个函数的回调,拿到子组件传过来的值父向孙通信:利用context传值。React.createContext()兄弟间通信:​1、找一个相同的父组件,既可以用pr
Dax Dax
4年前
Vue父子组件
几种常见的通信方式:1、prop属性父组件通过绑定属性的方式,给子组件传值,同时子组件通过设置props来接收letChildVue.extend(template:'content',props:content:type:String,default:()r
马丁路德 马丁路德
4年前
vue3 - 组件通信
vue3组件通信和vue2的通信方式基本一致,只是存在写法上的差异props/emitsetup函数接收两个参数,props和context(上下文,其中有一个emit)用法展示//父组件<template<ibutton:type'type'@onClick
Chase620 Chase620
4年前
关于:父组件中的子组件中的子组件(孙级)添加数据后怎么样去调用父组件中的方法呢?
1、需求引入image.png这是父组件下的子组件的子组件,一个绑定子设备的弹出窗modal,那么我们怎么样在这个组件中选中子设备后点击确定时去触发父组件的父组件的table列表数据刷新呢?image.pngimage.pngimage.png组件的层级关系.png上述的图示便是部分代码的展示,一般的组件传值有父组件传子组件(
Stella981 Stella981
3年前
Flutter子组件调用父组件方法修改父组件参数
子组件调用父级组件方法的主要实现是父组件给子组件传入一个方法,然后在子组件中调用父级方法来修改父级的参数。看一下效果图!(https://img2018.cnblogs.com/blog/1038765/201907/103876520190702152130487420290106.gif)父级组件实现在父级组件中写一个
Wesley13 Wesley13
3年前
DLL如何导出类?
其实最好是写一个父类,把要实现的函数全部以虚函数的形式写在父类中,然后写一个子类,继承父类,重写父类的虚函数。这样的话就安全得多了。其次就在DLL中导出一个函数,返回父类的一个对象指针,再在EXE中动态链接DLL,调用导出函数。例子如下://以下是DLL的代码//class\_a.hclass A{public:
Stella981 Stella981
3年前
React(5)
绑定函数事件在以类继承的方式定义的组件中,为了能方便地调用当前组件的其他成员方法或属性(如:this.state),通常需要将事件处理函数运行时的this指向当前组件实例。run(){  alert('我是一个run方法')}<buttononClick{this.run}执行方法</button //方法
Stella981 Stella981
3年前
Python中函数和方法的区别
1、函数要手动传self,方法不用传self2、如果是一个函数,用类名去调用,如果是一个方法,用对象去调用 举例说明:classFoo(object):def__init__(self):self.name"haiyan"deffunc(self):