在Vue.js中使用Mixins的方法


Posted in Javascript onSeptember 12, 2017

一个很常见的场景: 有两个非常相似的组件, 它们拥有非常相似的基本功能, 但是它们之间又有足够的不同的地方, 该如何选择呢? 我们是应该将它们分成两个完全不同的组件呢? 还是创建一个基础组件, 然后定义足够多的props以方便区分使用场景?

这两种方式都不是完美的: 如果你将它们分成两个完全不同的组件, 在需求变化(功能变化)时, 可能会增加需要同时修改两个组件的风险, 这违反了”DRY”的前提. 另一方面, 太多的props很快会让人变得凌乱, 并且, 迫使维护人员, 甚至是你自己, 要首先理解这些props的上下文才能使用它, 这会让人非常失望.

Vue的Mixins是非常实用的编程方式, 因为最终实用的编程是通过不断减少运动部件(moving parts)使代码变得容易理解. (关于这一点, Michael Feathers有一个很好的引用). 一个mixin允许你封装一个功能, 以便你能在整个应用程序中的不同组件中使用它. 如果mixin被正确的创建, 它们是纯粹的?它们不会修改或更改函数的作用范围(scope)之外的内容, 因此, 您可以在多个地方执行它们, 并且只要输入值相同, 总是能非常可靠得得到相同的结果. 这真的非常强大.

认识Mixins

混合 (mixins) 是一种分发 Vue 组件中可复用功能的非常灵活的方式。混合对象可以包含任意组件选项。以组件使用混合对象时,所有混合对象的选项将被混入该组件本身的选项。

栗子

假设我们有一些不同的组件, 它们的工作是切换状态boolean, 一个模态(modal)和一个提示(tooltip). 这些tooltips和modals没有很多共同之处, 除了这个功能: 它们看起来不一样, 它们使用起来也不尽相同, 但是它们的逻辑是相似的 .

//modal
const Modal = {
 template: '#modal',
 data() {
  return {
   isShowing: false
  }
 },
 methods: {
  toggleShow() {
   this.isShowing = !this.isShowing;
  }
 }
}
 
//tooltip
const Tooltip = {
 template: '#tooltip',
 data() {
  return {
   isShowing: false
  }
 },
 methods: {
  toggleShow() {
   this.isShowing = !this.isShowing;
  }
 }
}

我们可以从中提取逻辑, 并创建可以复用的部分:

const toggle = {
 data() {
  return {
   isShowing: false
  }
 },
 methods: {
  toggleShow() {
   this.isShowing = !this.isShowing;
  }
 }
}
 
const Modal = {
 template: '#modal',
 mixins: [toggle]
};
 
const Tooltip = {
 template: '#tooltip',
 mixins: [toggle]
};

duang — 一个小而简单的:chestnut:让我们知道了Mixins对于封装一些可复用的功能如此有趣、方便、实用。

demo地址:https://github.com/hzzly/xyy-vue

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript实现跨浏览器的添加及删除事件绑定函数实例
Aug 04 Javascript
JavaScript采用递归算法计算阶乘实例
Aug 04 Javascript
第一次接触神奇的Bootstrap表单
Jul 27 Javascript
AngularJS 模型详细介绍及实例代码
Jul 27 Javascript
JavaScript基于对象去除数组重复项的方法
Oct 09 Javascript
使用FileReader API创建Vue文件阅读器组件
Apr 03 Javascript
如何在Angular应用中创建包含组件方法示例
Mar 23 Javascript
微信小程序常用的3种提示弹窗实现详解
Sep 19 Javascript
使用vue制作滑动标签
Sep 21 Javascript
JavaScript变量基本使用方法实例分析
Nov 15 Javascript
JS ES6异步解决方案
Apr 29 Javascript
Vue Element plus使用方法梳理
Dec 24 Vue.js
JavaScript面向对象精要(上部)
Sep 12 #Javascript
JS库之ParticlesJS使用简介
Sep 12 #Javascript
关于预加载InstantClick的问题解决方法
Sep 12 #Javascript
提升页面加载速度的插件InstantClick
Sep 12 #Javascript
详解如何让InstantClick兼容MathJax、百度统计等
Sep 12 #Javascript
使用InstantClick.js让页面提前加载200ms
Sep 12 #Javascript
VueJs组件prop验证简单介绍
Sep 12 #Javascript
You might like
php 求质素(素数) 的实现代码
2011/04/12 PHP
PHP对象相互引用的内存溢出实例分析
2014/08/28 PHP
php实现生成验证码实例分享
2016/04/10 PHP
身份证号码前六位所代表的省,市,区, 以及地区编码下载
2007/04/12 Javascript
SyntaxHighlighter代码加色使用方法
2008/09/07 Javascript
不同Jquery版本引发的问题解决
2013/10/14 Javascript
讨论html与javascript在浏览器中的加载顺序问题
2013/11/27 Javascript
不提示直接关闭网页窗口的JS示例代码
2013/12/17 Javascript
JS获取屏幕,浏览器窗口大小,网页高度宽度(实现代码)
2013/12/17 Javascript
JavaScript的9种继承实现方式归纳
2015/05/18 Javascript
javascript实现的字符串与十六进制表示字符串相互转换方法
2015/07/17 Javascript
jquery简单实现幻灯片的方法
2015/08/03 Javascript
JQuery解析XML数据的几个简单实例
2016/05/18 Javascript
基于HTML+CSS+JS实现增加删除修改tab导航特效代码
2016/08/05 Javascript
AngularJs Understanding the Model Component
2016/09/02 Javascript
javascript html5轻松实现拖动功能
2017/03/01 Javascript
ActiveX控件的使用-js实现打印超市小票功能代码详解
2017/11/22 Javascript
JS实现显示当前日期的实例代码
2018/07/03 Javascript
微信小程序 image组件遇到的问题
2019/05/28 Javascript
JS实现滑动导航效果
2020/01/14 Javascript
基于ajax及jQuery实现局部刷新过程解析
2020/09/12 jQuery
如何在vue中使用video.js播放m3u8格式的视频
2021/02/01 Vue.js
[12:36]《DOTA2》国服注册与激活指南全攻略
2013/04/28 DOTA
[04:56]经典回顾:前Ehome 与 前LGD
2015/02/26 DOTA
Python实现简单字典树的方法
2016/04/29 Python
python正则表达式及使用正则表达式的例子
2018/01/22 Python
Pycharm激活码激活两种快速方式(附最新激活码和插件)
2020/03/12 Python
在TensorFlow中实现矩阵维度扩展
2020/05/22 Python
Python 程序员必须掌握的日志记录
2020/08/17 Python
Oral-B荷兰:牙医最推荐的品牌
2020/02/25 全球购物
优秀毕业生求职推荐信范文
2013/11/21 职场文书
《诚实与信任》教学反思
2014/04/10 职场文书
营业用房租赁协议书
2014/11/26 职场文书
2019年国庆祝福语(70句)
2019/09/19 职场文书
postgresql无序uuid性能测试及对数据库的影响
2021/06/11 PostgreSQL
防止web项目中的SQL注入
2021/12/06 MySQL