在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 循环读取JSON数据的代码
Jul 17 Javascript
javascript getElementsByClassName实现代码
Oct 11 Javascript
JavaScript 实现简单的倒计时弹窗DEMO附图
Mar 05 Javascript
JavaScript不刷新实现浏览器的前进后退功能
Nov 05 Javascript
jQuery及JS实现循环中暂停的方法
Feb 02 Javascript
JS+DIV+CSS实现仿表单下拉列表效果
Aug 18 Javascript
jQuery中ajax错误调试分析
Dec 01 Javascript
javaScript和jQuery自动加载简单代码实现方法
Nov 24 jQuery
JavaScript 高性能数组去重的方法
Sep 20 Javascript
JavaScript数组去重的方法总结【12种方法,号称史上最全】
Feb 28 Javascript
JavaScript闭包相关知识解析
Oct 19 Javascript
原生JavaScript实现弹幕组件的示例代码
Oct 12 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
php一句话cmdshell新型 (非一句话木马)
2009/04/18 PHP
php 常用类整理
2009/12/23 PHP
Pain 全世界最小最简单的PHP模板引擎 (普通版)
2011/10/23 PHP
phpexcel导入excel数据使用方法实例
2013/12/24 PHP
在 Laravel 6 中缓存数据库查询结果的方法
2019/12/11 PHP
js正确获取元素样式详解
2009/08/07 Javascript
js借助ActiveXObject实现创建文件
2013/09/29 Javascript
AngularJS基础 ng-focus 指令简单示例
2016/08/01 Javascript
angularjs 表单密码验证自定义指令实现代码
2016/10/27 Javascript
vue 中自定义指令改变data中的值
2017/06/02 Javascript
详解Vue学习笔记进阶篇之列表过渡及其他
2017/07/17 Javascript
vue.js或js实现中文A-Z排序的方法
2018/03/08 Javascript
vuejs使用axios异步访问时用get和post的实例讲解
2018/08/09 Javascript
微信小程序页面上下滚动效果
2020/11/18 Javascript
Vue.js下拉菜单组件使用方法详解
2019/10/19 Javascript
webgl实现物体描边效果的方法介绍
2019/11/27 Javascript
vue组件实现移动端九宫格转盘抽奖
2020/10/16 Javascript
[44:15]国士无双DOTA2 6.82版本详解(上)
2014/09/28 DOTA
[55:44]OG vs NAVI 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
python实现系统状态监测和故障转移实例方法
2013/11/18 Python
scrapy爬虫实例分享
2017/12/28 Python
Python实现读取SQLServer数据并插入到MongoDB数据库的方法示例
2018/06/09 Python
django 自定义filter 判断if var in list的例子
2019/08/20 Python
使用Python将Exception异常错误堆栈信息写入日志文件
2020/04/08 Python
python实现取余操作的简单实例
2020/08/16 Python
pandas apply使用多列计算生成新的列实现示例
2021/02/24 Python
雷朋巴西官方商店:Ray-Ban Brasil
2020/07/21 全球购物
师范应届生语文教师求职信
2013/10/29 职场文书
广场舞大赛策划方案
2014/05/31 职场文书
2015年员工工作表现评语
2015/03/25 职场文书
公司员工辞职信范文
2015/05/12 职场文书
红色影片观后感
2015/06/18 职场文书
运动会入场词
2015/07/18 职场文书
《分数的意义》教学反思
2016/02/20 职场文书
logback如何自定义日志存储
2021/08/30 Java/Android
MySQL一劳永逸永久支持输入中文的方法实例
2022/08/05 MySQL