当前位置:网站首页>高级 Vue 组件模式 (3)
高级 Vue 组件模式 (3)
2020-11-06 01:23:00 【:::::::】
03 使用 mixin 来增强 Vue 组件
目标
之前一篇文章中,我们虽然将 toggle
组件划分为了 toggle-button
、toggle-on
和 toggle-off
三个子组件,且一切运行良好,但是这里面其实是存在一些问题的:
-
toggle
组件的内部状态和方法只能和这三个子组件共享,我们期望第三方的组件也可以共享这些状态和方法 - inject 的注入逻辑我们重复编写了三次,如果可以的话,我们更希望只声明一次(DRY原则)
- inject 的注入逻辑当前为硬编码,某些情况下,我们可能期望进行动态地配置
如果熟悉 react 的读者这里可能马上就会想到 HOC(高阶组件) 的概念,而且这也是 react 中一个很常见的模式,该模式能够提高 react 组件的复用程度和灵活性。在 vue 中,我们是否也有一些手段或特性来提高组件的复用程度和灵活性呢?答案当然是有的,那就是 mixin。
实现
关于 mixin 本身的知识,这里就不做过多赘述了,不熟悉的读者可以去官方文档了解。我们通过声明一个叫作 toggleMixin 的 mixin 来抽离公共的注入逻辑,如下:
export const withToggleMixin = { inject: { toggleComp: "toggleComp" } };
之后,每当需要注入 toggle
组件提供的依赖项时,就混入当前 mixin,如下:
mixins: [withToggleMixin]
如果关于注入的逻辑,我们增加一些灵活性,比如期望自由地声明注入依赖项的 key 时,我们可以借由 HOC 的概念,声明一个高阶 mixin(可以简称 HOM ?? 皮一下,很开心),如下:
export function withToggle(parentCompName = "toggleComp") { return { inject: { [parentCompName]: "toggleComp" } }; }
这个 HOC mixin 可以按如下的方式使用:
mixins: [withToggle("toggle")]
这样在当前的组件中,调用 toggle 组件相关状态和方法时,就不再是 this.toggleComp
,而是 this.toggle
。
成果
通过实现 toggleMixin,我们成功将注入的逻辑抽离了出来,这样每次需要共享 toggle
组件的状态和方法时,混入该 mixin 即可。这样就解决了第三方组件无法共享其状态和方法的问题,在在线实例代码中,我实现了两个第三方组件,分别是 custom-button
和 custom-status-indicator
,前者是自定义开关,使用 withToggleMixin 来混入注入逻辑,后者是自定义的状态指示器,使用 withToggle 高阶函数来混入注入逻辑。
你可以下面的链接来看看这个组件的实现代码以及演示:
总结
mixin 作为一种分发 Vue 组件中可复用功能的非常灵活的方式,可以在很多场景下大展身手,尤其在一些处理公共逻辑的组件,比如通知、表单错误提示等,使用这种模式尤其有用。
目录
github gist点击预览
本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。
版权声明
本文为[:::::::]所创,转载请带上原文链接,感谢
https://cloud.tencent.com/developer/article/1715160
边栏推荐
- 【快速因數分解】Pollard's Rho 演算法
- 词嵌入教程
- 哇,ElasticSearch多字段权重排序居然可以这么玩
- 100元扫货阿里云是怎样的体验?
- 做外包真的很难,身为外包的我也无奈叹息。
- 文本去重的技术方案讨论(一)
- Why do private enterprises do party building? ——Special subject study of geek state holding Party branch
- Examples of unconventional aggregation
- 有关PDF417条码码制的结构介绍
- How to demote a domain controller in Windows Server 2012 and later
猜你喜欢
Don't go! Here is a note: picture and text to explain AQS, let's have a look at the source code of AQS (long text)
Didi elasticsearch cluster cross version upgrade and platform reconfiguration
ipfs正舵者Filecoin落地正当时 FIL币价格破千来了
简直骚操作,ThreadLocal还能当缓存用
谁说Cat不能做链路跟踪的,给我站出来
How long does it take you to work out an object-oriented programming interview question from Ali school?
JetCache埋点的骚操作,不服不行啊
How do the general bottom buried points do?
加速「全民直播」洪流,如何攻克延时、卡顿、高并发难题?
(1) ASP.NET Introduction to core3.1 Ocelot
随机推荐
JetCache埋点的骚操作,不服不行啊
分布式ID生成服务,真的有必要搞一个
直播预告 | 微服务架构学习系列直播第三期
6.9.2 session flashmapmanager redirection management
Serilog原始碼解析——使用方法
TensorFlow2.0 问世,Pytorch还能否撼动老大哥地位?
用Keras LSTM构建编码器-解码器模型
钻石标准--Diamond Standard
阿里云Q2营收破纪录背后,云的打开方式正在重塑
如何将数据变成资产?吸引数据科学家
Analysis of ThreadLocal principle
Want to do read-write separation, give you some small experience
【效能優化】納尼?記憶體又溢位了?!是時候總結一波了!!
不吹不黑,跨平臺框架AspNetCore開發實踐雜談
中国提出的AI方法影响越来越大,天大等从大量文献中挖掘AI发展规律
Asp.Net Core學習筆記:入門篇
[C#] (原創)一步一步教你自定義控制元件——04,ProgressBar(進度條)
htmlcss
数据产品不就是报表吗?大错特错!这分类里有大学问
《Google軟體測試之道》 第一章google軟體測試介紹