当前位置:首页 > 科技  > 软件

原生“跨组件”通信方式

来源: 责编: 时间:2023-11-13 17:18:38 225观看
导读现在已经是“组件化”开发时代了。相信大家平时在vue或者react中都碰到过“跨组件”通信的需求,通常我们需要将数据放在一个公共的父级上,然后用context之类的方式传递下去,或者借用pinia这样的开源库去更好的管理这些数

FF628资讯网——每日最新资讯28at.com

现在已经是“组件化”开发时代了。FF628资讯网——每日最新资讯28at.com

相信大家平时在vue或者react中都碰到过“跨组件”通信的需求,通常我们需要将数据放在一个公共的父级上,然后用context之类的方式传递下去,或者借用pinia这样的开源库去更好的管理这些数据。FF628资讯网——每日最新资讯28at.com

不过,大部分项目可能没有那么复杂,可能只有极少部分需要“跨组件”通信或者全局传递的,专门去引入一个全局状态管理库还是有一定成本的,不仅仅是性能开销,还有学习成本。FF628资讯网——每日最新资讯28at.com

另外,还有一些旧项目,由于前期组件设计未考虑周全,或者由于后期需求迭代,导致需要跨组件通信,此时再引入状态管理库也有很大的改造成本。FF628资讯网——每日最新资讯28at.com

框架用久了,可能有些都忘了,原生 web 并没有组件化的概念,整个页面都是开放的,所以,借助原生的一些行为和方式,也能很轻易的解决“跨组件”通信问题,下面列举了几个方式,一起看看吧~FF628资讯网——每日最新资讯28at.com

一、label for

举个例子,下面是之前做的一个错别字纠错功能,也就是自动检测错别字,然后提供替换和忽略一些功能,如下:FF628资讯网——每日最新资讯28at.com

FF628资讯网——每日最新资讯28at.com

现在不用关注是怎么实现的,如果按照组件化拆分,右边的纠错面板肯定是单独的组件。FF628资讯网——每日最新资讯28at.com

FF628资讯网——每日最新资讯28at.com

很自然的,关于忽略的相关函数也是写在这个组件,类似于这样。FF628资讯网——每日最新资讯28at.com

<!--纠错组件--><script setup>const ignore = () => {  // 相关操作}</script><template>...<button @click="ignore">忽略</button>...</template>

嗯,很好,组件化很不错,逻辑也很清晰。FF628资讯网——每日最新资讯28at.com

过了两天,产品又需要在另外一个地方也要有“忽略”功能,当鼠标悬浮的时候,下拉选项中也有忽略选项,并且这两个忽略的功能是完全一样的,如下:FF628资讯网——每日最新资讯28at.com

FF628资讯网——每日最新资讯28at.com

再单独实现一遍肯定是不行的,把这个函数抽离出来?但是还有新的问题,整个错别字的列表也是需要更新的,是不是也要把这个列表也独立出来?FF628资讯网——每日最新资讯28at.com

no,当然不需要这么麻烦,仅需要一个label标签就可以轻松搞定,如下:FF628资讯网——每日最新资讯28at.com

<!--写作区域的下拉组件--><template>...<ui-dropdown>  <label for="AAA">忽略</label>  ...</ui-dropdown>...</template>

当然,右边的忽略按钮也需要加上一个相同的ID(实际中是动态生成的)。FF628资讯网——每日最新资讯28at.com

<!--纠错组件--><template>...<button id="AAA" @click="ignore">忽略</button>...</template>

这样,通过label+for就将这两个元素关联起来了,点击这个label元素就相当于点击了右边的忽略按钮,无需任何跨组件通信,是不是非常方便呢?FF628资讯网——每日最新资讯28at.com

二、主动触发事件

有时候,需要通信的事件可能并不是通过按钮点击的,比如这样一个写作页面,按照页面布局和功能,各个部分肯定是单独的组件,如下:FF628资讯网——每日最新资讯28at.com

FF628资讯网——每日最新资讯28at.com

其中,右上角有一个“保存”按钮,可以保存内容,假设是这样。FF628资讯网——每日最新资讯28at.com

<!--功能组件--><script setup>const save = () => {  // 相关操作}</script><template>...<button @click="save">保存</button>...</template>

现在,产品又提出一个要求,希望在写作时,按 Ctrl + S也能保存内容。FF628资讯网——每日最新资讯28at.com

那么,你会怎么处理呢?把保存方法封装一下?全局通信?FF628资讯网——每日最新资讯28at.com

其实,我们要做的事情很简单,只需要主动去触发一下保存按钮的点击事件就可以了,当然需要获取到这个按钮,所以要加个ID。FF628资讯网——每日最新资讯28at.com

<!--功能组件--><template>...<button id="saveBtn" @click="save">保存</button>...</template>

然后在写作组件中直接通过触发click事件就好了。FF628资讯网——每日最新资讯28at.com

<!--写作组件--><script setup>// Ctrl+S 保存const save = () => {  document.getElementById('saveBtn').click()}</script>

当然,我更习惯于用dispatch的方式来触发。FF628资讯网——每日最新资讯28at.com

document.getElementById('saveBtn').dispatchEvent(new Event('click'))

这样的好处是不限类型,任意事件都可以触发,而不仅仅是点击事件。FF628资讯网——每日最新资讯28at.com

dom.dispatchEvent(new Event('mouseover'))

关于dispatchEvent,下面还有更灵活的运用。FF628资讯网——每日最新资讯28at.com

三、dispatchEvent 和 addEventListener

dispatchEvent不仅可以触发常见的点击事件,也能够触发任意自定义事件。FF628资讯网——每日最新资讯28at.com

举个例子,有两个相互独立的功能区,有两个按钮,分别点击后,会做一些操作,比如请求接口,最后会弹出同一个奖励弹窗FF628资讯网——每日最新资讯28at.com

FF628资讯网——每日最新资讯28at.com

如果按照组件话的思维来考虑,可能需要将奖励弹窗的状态放在一个公共的父级,然后依次回调,或者用全局状态管理库区管理这些状态。FF628资讯网——每日最新资讯28at.com

但是,如果从原生 web 来考虑,其实不必那么麻烦,下面是一些伪代码。FF628资讯网——每日最新资讯28at.com

<!--功能组件A--><script setup>const getPrize = () => {  // 领奖励一系列逻辑}</script><template>...<button @click="getPrize">领奖励A</button>...</template>

然后还有功能区 B。FF628资讯网——每日最新资讯28at.com

<!--功能组件B--><script setup>const getPrize = () => {  // 领奖励B一系列逻辑}</script><template>...<button @click="getPrize">领奖励B</button>...</template>

然后还有奖励弹窗。FF628资讯网——每日最新资讯28at.com

<!--奖励弹窗--><script>const open = () => {  // 打开弹窗}</script><template>...<dialog>奖励弹窗</dialog>...</template>

那么,怎么让其他功能区的组件打开奖励弹窗呢?FF628资讯网——每日最新资讯28at.com

这就需要用自定义事件了,很简单,直接触发一个自定义事件,假设就叫做prize。FF628资讯网——每日最新资讯28at.com

document.dispatchEvent(new CustomEvent('prize'))

放在业务组件中就是。FF628资讯网——每日最新资讯28at.com

<!--功能组件A--><script setup>const getPrize = () => {  // 领奖励一系列逻辑  document.dispatchEvent(new CustomEvent('prize'))}</script><template>...<button @click="getPrize">领奖励A</button>...</template>

然后,我们可以在页面任意地方都监听到这个事件,直接通过addEventListener就可以了。FF628资讯网——每日最新资讯28at.com

document.addEventListener('prize', () => {  // 监听到了prize})

所以,我们可以把这个监听直接放在奖励弹窗组件中。FF628资讯网——每日最新资讯28at.com

<!--奖励弹窗--><script>const open = () => {  // 打开弹窗}onMounted(() => {  document.addEventListener('prize', () => {  	// 监听到了prize,打开弹窗    open()	})})</script><template>...<dialog>奖励弹窗</dialog>...</template>

这样,无论组件是什么样的嵌套关系,都可以随心所欲地通信了。FF628资讯网——每日最新资讯28at.com

四、最后总结一下

本文更多的还是提供一种思路,实际开发中可以自己权衡,什么方式比较合适,下面总结一下这三种方式FF628资讯网——每日最新资讯28at.com

  • label for比较适合于按钮点击事件的复用,可以将label元素与button元素绑定起来。
  • 相比label for而言,主动触发事件更灵活,可以触发任意事件,无需button元素,也不限制点击事件。
  • dispatchEvent 和 addEventListener是最灵活的方式了,几乎可以做到全局通信,通过dispatchEvent触发,然后通过addEventListener监听。

当然,这些方式也不能滥用,毕竟用多了就显得逻辑混乱,如果全局通信的情况比较多,还是建议使用传统的组件化方式就行管理。FF628资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-23634-0.html原生“跨组件”通信方式

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: CSS @scope 如何取代 BEM

下一篇: 用了这么多年Docker,殊不知你还有这么多弯弯绕!

标签:
  • 热门焦点
  • Find N3入网:最高支持16+1TB

    Find N3入网:最高支持16+1TB

    OPPO将于近期登场的Find N3折叠屏目前已经正式入网,型号为PHN110。本次Find N3在外观方面相比前两代有很大的变化,不再是小号的横向折叠屏,而是跟别的厂商一样采用了较为常见的
  • K60 Pro官方停产 第三方瞬间涨价

    K60 Pro官方停产 第三方瞬间涨价

    虽然没有官方宣布,但Redmi的一些高管也已经透露了,Redmi K60 Pro已经停产且不会补货,这一切都是为了即将到来的K60 Ultra铺路,属于厂家的正常操作。但有意思的是该机在停产之后
  • 一加Ace2 Pro官宣:普及16G内存 引领24G

    一加Ace2 Pro官宣:普及16G内存 引领24G

    一加官方今天继续为本月发布的新机一加Ace2 Pro带来预热,公布了内存方面的信息。“淘汰 8GB ,12GB 起步,16GB 普及,24GB 引领,还有呢?#一加Ace2Pro#,2023 年 8 月,敬请期待。”同时
  • Redmi Pad评测:红米充满野心的一次尝试

    Redmi Pad评测:红米充满野心的一次尝试

    从Note系列到K系列,从蓝牙耳机到笔记本电脑,红米不知不觉之间也已经形成了自己颇有竞争力的产品体系,在中端和次旗舰市场上甚至要比小米新机的表现来得更好,正所谓“大丈夫生居
  • 小米降噪蓝牙耳机Necklace分享:听一首歌 读懂一个故事

    小米降噪蓝牙耳机Necklace分享:听一首歌 读懂一个故事

    在今天下午的小米Civi 2新品发布会上,小米还带来了一款新的降噪蓝牙耳机Necklace,我们也在发布结束的第一时间给大家带来这款耳机的简单分享。现在大家能见到最多的蓝牙耳机
  • 6月iOS设备性能榜:M2稳居榜首 A系列只能等一手3nm来救

    6月iOS设备性能榜:M2稳居榜首 A系列只能等一手3nm来救

    没有新品发布,自然iOS设备性能榜的上榜设备就没有什么更替,仅仅只有跑分变化而产生的排名变动,毕竟苹果新品的发布节奏就是这样的,一年下来也就几个移动端新品,不会像安卓厂商,一
  • K8S | Service服务发现

    K8S | Service服务发现

    一、背景在微服务架构中,这里以开发环境「Dev」为基础来描述,在K8S集群中通常会开放:路由网关、注册中心、配置中心等相关服务,可以被集群外部访问;图片对于测试「Tes」环境或者
  • 小红书1周涨粉49W+,我总结了小白可以用的N条涨粉笔记

    小红书1周涨粉49W+,我总结了小白可以用的N条涨粉笔记

    作者:黄河懂运营一条性教育视频,被54万人&ldquo;珍藏&rdquo;是什么体验?最近,情感博主@公主是用鲜花做的,火了!仅仅凭借一条视频,光小红书就有超过128万人,为她疯狂点赞!更疯狂的是,这
  • 年轻人的“职场羞耻感”,无处不在

    年轻人的“职场羞耻感”,无处不在

    作者:冯晓亭 陶 淘 李 欣 张 琳 马舒叶来源:燃次元&ldquo;人在职场,应该选择什么样的着装?&rdquo;近日,在网络上,一个与着装相关的帖子引发关注,在该帖子里,一位在高级写字楼亚洲金
Top