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

news2024/11/19 18:23:00

前言:不知不觉已经从 React 转 Vue3 开发四个多月了,但其实自从刚接触 vue 开始,就对 emit 这个指令似懂非懂。所以在项目中其实我还是很害怕去使用这个指令的,但是在有些场景又不得不使用,就只能看着同事的代码比葫芦画瓢去模仿他的写法...
但是在上周封装组件的时候,leader 说可以去查阅一下 v-model 的使用,于是我重新回顾了一下 vue 官方文档的相关知识,又经过去查阅别的博文,终于明白 emit 的思想。


一.React 子组件修改 props 的思想理念

  1. 通过 React 的官方文档我们可以了解到 React 的哲学思想是。如果子组件希望修改希望父亲组件传递过来的 props ,那么父组件也需要同时提供修改这个 props 的方法,因为对子组件来说,props 是一个只读属性,不允许进行任何修改。(这是有意而为之的,如果 props 可以被随意修改,那么就会导致整个项目状态的混乱)
  2. 这里我们引用一下 React 官方文档中关于修改水温度的例子来解释。

        3.但是在某些场景中,我们在子组件中确实是需要去修改 props 的,那么这种场景该如何处理呢?

        4.这里就需要父组件在传递 props 的同时提供一个修改 props 的方法,(这个方法也是通过 props 传递的)

        5.这样做虽然有些繁琐,但是对于后期数据维护和修改代码是非常友好的,因为你可非常清楚的知道某一个 props 来自与那个父组件。

        6. 这里列举了一个简单的 demo ,大致用法如下所示:

二. Vue 子组件修改 props 的思想理念

  1. 刚开始学习 vue 的时候,我有点先入为主的感觉了,感觉如果修改 props 的话,父组件就必须同时提供一个修改的方法。以为 vue 也是这样,其实也是可以的,vue 确实也可以通过 props 去同时提供这两样很重要的东西,并且功能是完全可以满足我们的需求的。

        2. 但是这种想法其实和 vue 的理念有一点点违背,虽然我们都是避免了直接修改 props ,但是在 vue 里有它自己的理念。 我们先看一下 Vue 是怎么解释当子组件需要修改父组件提供的状态时的思想,最开始看到这里的时候,我其实没有特别理解画红线的意思。

        3.并且我们顺着官网的教程,去看 emit 指令的话,真的非常难以理解官方到底想表达什么想法。我承认 Vue 的中文官网也许是最适合国人学习的教程网站,但是它也有对萌新不是那么友好的地方。

        4.就像上面官网对 $emit 的解释一样,寥寥几笔,只留下我一人在风中凌乱。去搜索相关 $emit 相关的文章,有很多都是按照官网比葫芦画瓢的解释,真的非常不友好。

三. emit 的真正含义

  1. 我们先看一下这个单词的原意,**“发射,发出”**的意思。这也是误导我很长时间的主要原因,因为我把这个 Vue 想表达的发射,理解成了把收到的 props 重新发射回去的意思,其实这是非常错误的理解。

        2.直到我学习了 v-model 指令的用法,我才彻底搞明白这个 “发射”,到底是想 “发射” 什么,它原来指的是 “发射” 一个修改 props 的通知,告诉父组件自己去修改 props。

        3.举个例子,我们改造一下上面我们通过传递两个 props(一个响应式状态,一个修改状态的方法)变为下面:

        4.你可以发现,原来通过 props 传递的 :addCount 变为了自定义事件 @addCount 的写法。

        5.⏰重点来了: 我相信很多初学者在看到父组件自定义一个事件这一章节的时候,会产生很大的疑问。其实这里 Vue 想表达的意思是,父组件注册了一个函数,但是它不会自己去执行这个函数,它需要收到一个信号才会自己去执行。什么叫注册了一个函数呢?说白了,就是它在自己本身组件内部定义了一个函数,但是这个函数在没有收到 “信号的时候是不会去执行的”

        6.如果你能明白上一段的意思,那么你基本上就知道 “信号” 究竟是谁发出来的了。让我们回到子组件内部,在子组件内,我们需要去拿到父组件注册的那个函数名字。也就是addCount,来准备通知父组件。

        7.子组件内的按钮代表的意思就是,当我点击一次按钮,我就 “发射” 一个信号,告诉父组件去执行一次 addCount 这个函数,也就是在父组件里声明的这个函数。

        8.但是 emit 绝对不仅仅是这么简单的,当有时候我们子组件里需要传递过去一个值,告诉父组件“喂,把你的属性修改成我的属性,现在我是老大。”这个场景该如何呢?
如果还拿上面的修改数字案例举例。这时候子组件觉得一次增加1太少了,需要子组件内部一顿计算,然后得出你需要一次加 3.1415926 ,该怎么办呢?(我们不考虑直接修改addCount)有些场景修改的数据是需要子组件提供的。

        9.ok,那我在发信号的时候,给你传递一个数据不就行了吗?

        10.相对的,父组件在接受到信号的时候,“唉?什么情况,儿子告诉我什么秘密了?”,那么问题就是在于,父组件如何接收到儿子传来的信息呢?非常简单啦~,我在注册的时候就声明这个参数就行。


我们尝试一下

四. 举一反三

千万不要觉得 emit 的时候只能发送一个参数,一定要自己多尝试一下~

然后我们去父组件接受一下看看

总结

学习知识不要总觉得自己会了,或许你从一开始理解的就是错的,一定要保持一颗虚心的态度。

真正的大师永远怀着一颗学徒的心

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/409133.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue的环境配置

vue环境配置安装地址:安装 — Vue.js 一、Node官网地址:下载 | Node.js 中文网 查看node版本∶打开命令工具,执行"node -v"命令查看版本号。 二、git-bash命令行工具 git-bash命令行工具官网地址:Git 查看git版本&#…

【Vue】跳转外部链接并携带参数并触发

需求: 当平台运行多个系统时("系统一","系统二" 都是不同时间段开发的) 可以从"系统一"点击按钮跳转到"系统二",并且完成 "系统二" 登录操作,直接显示&…

【小程序项目开发 --- 京东商城】 启航篇之uni-app项目搭建

🤵‍♂️ 个人主页: 计算机魔术师 👨‍💻 作者简介:CSDN内容合伙人,全栈领域优质创作者。 🌐 推荐一款找工作神器网站: 点击跳转牛客网 |笔试题库|面试经验|实习招聘内推| 还没有账户的小伙伴 速速点击链接…

【VUE3】ElementUI--el-date-picker下拉控件样式修改(高亮显示设置)

ElementUI--el-date-picker下拉控件样式修改一些废话事发背景实现效果实现思路总结和完整代码参考资料一些废话 默默做前端,分享一些自己在项目需求实现中遇到的奇妙问题(主要是网上搜索不到解决办法自己解决后的总结方法和解决办法但不全面,…

关于oss使用sts 后台签发临时token前端直传大文件的错误记录

文章目录前言遇到的问题1. NoSuchBucket : The specified bucket does not exist.2. com.aliyuncs.exceptions.ClientException: InvalidParameter.RoleSessionName : The parameter RoleSessionName is wrongly formed.3. 报错:Access to XMLHttpRequest at 上传ur…

servlet交互过程图详解,servlet的常见问题,创建web项目(一)

目录 一.B/S模式和C/S模式 C/S:客户端服务器端结构模式 B/S:浏览器服务器模结构模式 B/S结构图: 二.创建web项目 三.举例说明Servlet执行流程图: 四.Servlet项目中常见的问题 一.当创建web项目时,没有勾选Java …

一篇文章吃透 CSS3 属性: transition过渡 与 transform动画

最近有人私信我 CSS 中的 transition (过渡) 和 transform (动画) 属性,这两个属性的参数确实比较复杂,它们可以做出 CSS 的一些基础动画效果,平移,旋转,倾角......等等,这些也是我早期学习 CSS 的难记易忘…

Java Web 开发详解

一、Web基础 1、Web 概述 Web 在英文中的含义是网状物、网络。在计算机领域,它通常指的是后者,即网络。 像 WWW 是由 3 个单词组成的,即World Wide Web,中文含义是万维网。 他们的出现都是为了让我们在网络的世界中获取资源&a…

JS总结——数组,对象遍历的方法

对于数组或者对象的遍历,筛选,提取等操作是前端开发中经常有的需求,不要再只会写普通的for循环了,虽然普通的for循环已经能完成一切的功能的,是一个特殊方法,但是针对各种需求,js给我们提供了许…

uniapp —— 实现左右联动商品分类页面

uniapp —— 实现左右联动商品分类页面 零、前因 我们在日常的开发种,这种页面在项目当中经常会用得到,所以本篇文章会比较注重描述其思路,顺带附上其代码,以便以后在任何代码环境下都能使用上,先介绍一下实现思路&a…

Vue 中 iconfont 使用

图标库的发展过程,iconfont图标库的重要性(项目常用) 对于前端而言,图标的发展可谓日新月异。从img标签,到雪碧图,再到字体图标,svg,甚至svg也有了类似于雪碧图的方案svg-sprite-lo…

npm run 是什么?为什么使用npm run 这一命令,就能够将 webpack 跑起来并进行下一步的操作?

npm run 实际上是衔接 node 和 webpack 的连接点。先看看终端运行的npm是什么,如下图: 图中的关键点是最后一行 C:\Users\***\AppData\Roaming\npm\node_modules\npm。从它可以推断出系统环境变量下配置的npm的路径为C:\Users\***\AppData\Roaming\npm,可以去环境变量中确认…

css实现炫酷充电动画

先绘制一个电池&#xff0c;电池头部和电池的身体 这里其实就是两个div&#xff0c;使用z-index改变层级&#xff0c;电池的身体盖住头部&#xff0c;圆角使用border-radius完成 html部分,完整的css部分在最后 <div class"chargerBox"><div class"ch…

Vue ref获取元素和组件实例

获取元素 获取元素还不简单&#xff1f;直接document.querySelector(“#id”)不就获取到了吗&#xff1f;例如下面的代码。在写Vue的过程中&#xff0c;我们从来不会写这种代码&#xff0c;但是下面的代码在vue里面是可以运行的。 methods:{getEl(){let title document.queryS…

CSS实现: 水平居中 的几种方法

实现方法&#xff1a; 1、添加 margin 值 auto 2、定位 position(子绝父相) 偏移值 left margin-left 回退 [ 需要计算&#xff0c;有点 麻烦 ] 3、定位 position(子绝父相) 偏移值 left CSS-2d transform 4、文字居中 text-align:center; 行内块元素 5、弹性盒子布局 [ 推…

vue之@click绑定的函数,如何实现加不加括号都可执行

这篇文章的由来&#xff0c;其实是朋友在群里好奇click绑定方式的种类&#xff0c;大家七嘴八舌讨论出来的&#xff0c;觉得过程还是比较有意义&#xff0c;就记录下来&#xff1a; 1、原生js绑定点击事件 好久不用原生js绑定事件&#xff0c;基本都已经忘了怎么绑定。还把括号…

es6的some和every方法使用;

文章略长&#xff0c;但比较简单。 es6中的数组方法some()和every()都接收一个回调函数作为参数&#xff0c;该回调函数又接收三个参数&#xff0c;分别是数组元素、数组元素的索引、调用some或every方法的数组本身。它们的区别就是&#xff1a; some方法用于判断数组中是否存…

node-sass安装报错及其解决方案

一、下载依赖报错 这里报错了也就没后面的剧情了&#xff0c;就像电视剧刚开局主角就嗝屁了&#xff0c;看看执行 npm i 的时候报错类容&#xff1a; 二、解决方案 1、下载源在国外&#xff0c;更换中国镜像源&#xff0c;删除package.json中的node-sass,分别下载node包和node-…

你的应用太慢了,给我司带来了巨额损失,该怎么办

记得很久之前看过谷歌官方有这么样的声明&#xff1a;如果一个页面的加载时间从 1 秒增加到3 秒&#xff0c;那么用户跳出的概率将增加 32%。 但是早在 2012 年&#xff0c;亚马逊就计算出了&#xff0c;页面加载速度一旦下降一秒钟&#xff0c;每年就会损失 16 亿美元的销售额…

〖大前端 - 基础入门三大核心之CSS篇⑳〗- 2D变形

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费开放&#xff0c;购买任意白宝书体系化专栏可加入TFS-CLUB 私域社区。福利&#xff1a;除了通过订阅"白宝书系列专栏"加入社区获取所有付费专栏的内容之外&#xff0c;还可以通过加入星荐…