当前位置: 首页 > Web前端 > HTML

使用Vue3开发四个月,回顾一下emit的用法

时间:2023-03-28 19:15:45 HTML

前言:不知不觉中从React开发到Vue3已经四个多月了,但其实从第一次接触Vue开始,我就已经对发出命令的模糊理解。所以在项目中,我其实还是很害怕用这个命令,但是有些场景不得不用,所以只能看同事的代码,模仿他的写法。。。但是上周打包组件的时候一次,领导说可以查看v-model的使用,于是我查阅了vue官方文档的相关知识,又查看了其他博文,终于明白了emit的思路。1.React子组件修改props的思想通过React官方文档,我们可以了解React的哲学。如果子组件要修改父组件传过来的props,父组件也需要同时提供修改props的方法,因为对于子组件来说,props是只读属性,不能修改允许。(这是故意的,如果props可以随意修改,会导致整个项目的状态混乱。)这里参考React官方文档中修改水温的例子来说明。但是在某些场景下,我们确实需要修改子组件中的props,那么这种场景该如何处理呢?这里需要父组件在传递props的同时提供修改props的方法。(这个方法也是通过props来传递的。)虽然这样有点麻烦,但是对于后期的数据维护和代码修改是非常友好的,因为你可以很清楚的知道某个props来自于哪个父组件。这里列出一个简单的demo,大致用法如下:2.Vue子组件修改props的思路刚开始学习Vue的时候,有一种先入为主的感觉,如果修改props,父组件必须提供同时修改了一个方法。我以为vue也是一样的,其实是可以的。vue确实可以通过props同时提供这两个重要的东西,功能上完全可以满足我们的需求。但是这个想法其实有点违背vue的理念。虽然我们都避免直接修改props,但是在vue中我们有自己的概念。我们先来看看Vue在子组件需要修改父组件提供的状态时是如何解释思路的。刚开始看到这个的时候,并没有真正理解画红线的意思。而如果我们按照官网的教程来看emit命令,真的很难理解官方想表达的意思。我承认Vue的中文官网可能是最适合国人学习的教程网站,但它也有对新人不太友好的地方。就像上面官网对$emit的解释,寥寥数笔,留我一个人在风中。搜索相关$emit相关的文章,很多都是按照官网解释的,实在是不友好。3、emit的真正含义我们先来看看这个词的本义,“emit,emit”的意思。这也是长期以来误导我的主要原因,因为我把Vue想表达的emission理解为将接收到的props重新emit的意思。其实,这是一个非常错误的认识。直到学会了v-model指令的用法,我才彻底明白这个“启动”是什么意思。原本的意思是“发起”一个修改props的通知,告诉父组件自己去修改props。比如我们把上面的两个props(一个响应式状态和一个修改状态的方法)传递给下面的进行改造:可以发现原来通过props:addCount变成了一个自定义事件@addCount。?重点来了:相信很多初学者看到父组件自定义事件的章节,都会有很大的疑惑。其实Vue这里想表达的是,父组件注册了一个函数,但是它不会自己去执行这个函数,需要自己接收一个信号来执行。注册一个函数是什么意思?说白了就是在自己的组件内部定义了一个函数,但是这个函数在没有收到“信号”的时候是不会执行的。如果你能看懂上一段的意思,那你就基本知道是谁发出的“信号”了。让我们回到子组件。在子组件中,我们需要获取父组件注册的函数名。即addCount,准备通知父组件。子组件中按钮的意思是,当我点击一次按钮时,我“发出”一个信号,告诉父组件执行一次addCount函数,也就是父组件中声明的函数。但是emit绝对不止这么简单。有时我们需要在子组件中传递一个值,告诉父组件“嘿,把你的属性换成我的属性,现在我做主了”。这个场景怎么样??如果还是以上面修改过的数码案例为例。这时候子组件觉得一次加1太少了,需要在子组件内部计算一下,然后得出结论需要一次加3.1415926,怎么办?(不考虑直接修改addCount)部分场景修改的数据需要子组件提供。好吧,那我发信号的时候,就传一个数据给你行不行?相比之下,当父组件收到信号时,“哦?什么情况,儿子告诉我什么秘密?”那么问题来了,父组件如何接收子组件的信息呢?很简单~我注册的时候声明这个参数就可以了。试一试4.从一个例子推断,不要以为emit的时候只能传一个参数,一定要自己试一试~那我们去父组件accept看看,总结一下学习知识。不要总以为自己会,也许一开始你理解的就是错误的,一定要保持虚心的态度。真正的师父总是有一颗徒弟的心