在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 相关文章推荐
toggle()隐藏问题的解决方法
Feb 17 Javascript
jquery基础教程之数组使用详解
Mar 10 Javascript
js确认删除对话框适用于a标签及submit
Jul 10 Javascript
纯javascript实现简单下拉刷新功能
Mar 13 Javascript
三分钟带你玩转jQuery.noConflict()
Feb 15 Javascript
基于BootStrap Metronic开发框架经验小结【四】Bootstrap图标的提取和利用
May 12 Javascript
jQuery ztree实现动态树形多选菜单
Aug 12 Javascript
总结Javascript中的隐式类型转换
Aug 24 Javascript
jQuery编写网页版2048小游戏
Jan 06 Javascript
vue checkbox 全选 数据的绑定及获取和计算方法
Feb 09 Javascript
vue视图不更新情况详解
May 16 Javascript
Layui数据表格判断编辑输入的值,是否为我需要的类型详解
Oct 26 Javascript
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
虹吸式咖啡壶操作
2021/03/03 冲泡冲煮
Apache启动报错No space left on device: AH00023该怎么解决
2015/10/16 PHP
PHP explode()函数的几个应用和implode()函数有什么区别
2015/11/05 PHP
php打包网站并在线压缩为zip
2016/02/13 PHP
JavaScript 在线压缩和格式化收藏
2009/01/16 Javascript
JS函数验证总结(方便js客户端输入验证)
2010/10/29 Javascript
JS运行耗时操作的延时显示方法
2010/11/19 Javascript
IE不支持getElementsByClassName最终完美解决方案
2012/12/17 Javascript
jQuery把表单元素变为json对象
2013/11/06 Javascript
微信小程序 定义全局数据、函数复用、模版等详细介绍
2016/10/27 Javascript
vue 2.0路由之路由嵌套示例详解
2017/05/08 Javascript
vue.js获得当前元素的文字信息方法
2018/03/09 Javascript
Bootstrap模态对话框中显示动态内容的方法
2018/08/10 Javascript
[29:16]完美世界DOTA2联赛决赛日 Inki vs LBZS 第三场 11.08
2020/11/10 DOTA
一则python3的简单爬虫代码
2014/05/26 Python
python导入时小括号大作用
2017/01/10 Python
HTML中使用python屏蔽一些基本功能的方法
2017/07/07 Python
Python 3.7新功能之dataclass装饰器详解
2018/04/21 Python
使用python根据端口号关闭进程的方法
2018/11/06 Python
Python定时任务随机时间执行的实现方法
2019/08/14 Python
python实现的config文件读写功能示例
2019/09/24 Python
Pandas+Matplotlib 箱式图异常值分析示例
2019/12/09 Python
简述 Python 的类和对象
2020/08/21 Python
css3让div随鼠标移动而抖动起来
2014/02/10 HTML / CSS
PHP使用Redis队列执行定时任务实例讲解
2021/03/24 PHP
网络工程专业毕业生推荐信
2013/10/28 职场文书
不假外出检讨书
2014/01/27 职场文书
JAVA程序员自荐书
2014/01/30 职场文书
中学教师师德承诺书
2014/05/23 职场文书
森林防火标语
2014/06/23 职场文书
应届大专生求职信
2014/06/26 职场文书
2014年手术室工作总结
2014/11/26 职场文书
2014年技术部工作总结
2014/12/12 职场文书
音乐教师个人工作总结
2015/02/06 职场文书
预备党员自我评价范文
2015/03/04 职场文书
2015年党风建设工作总结
2015/04/29 职场文书