在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 相关文章推荐
dropdownlist之间的互相联动实现(显示与隐藏)
Nov 24 Javascript
Extjs中ComboBox加载并赋初值的实现方法
Mar 22 Javascript
JQuery实现用户名无刷新验证的小例子
Mar 22 Javascript
jquery 添加节点的几种方法介绍
Sep 04 Javascript
JS实现灵巧的下拉导航效果代码
Aug 25 Javascript
浅谈js中的in-for循环
Jun 28 Javascript
基于JS组件实现拖动滑块验证功能(代码分享)
Nov 18 Javascript
js中常用的Math方法总结
Jan 12 Javascript
利用CSS、JavaScript及Ajax实现图片预加载的三大方法
Jan 22 Javascript
vue 详情跳转至列表页实现列表页缓存
Mar 27 Javascript
Vue移动端项目实现使用手机预览调试操作
Jul 18 Javascript
Vue中使用wangeditor富文本编辑的问题
Feb 07 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
模板引擎正则表达式调试小技巧
2011/07/20 PHP
浅析PHP安装扩展mcrypt以及相关依赖项(PHP安装PECL扩展的方法)
2013/07/05 PHP
如何使用FireFox插件FirePHP调试PHP
2013/07/23 PHP
PHP开发中csrf攻击的简单演示和防范
2017/05/07 PHP
PHP的PDO事务与自动提交
2019/01/24 PHP
PHP 7.4 新语法之箭头函数实例详解
2019/05/09 PHP
JavaScript 捕获窗口关闭事件
2009/07/26 Javascript
关于Ext中form移除textfield方法:hide(),setVisible(false),remove()
2010/12/02 Javascript
javascript 原型继承介绍
2011/08/30 Javascript
JS判定是否原生方法
2013/07/22 Javascript
jquery选择器原理介绍($()使用方法)
2014/03/25 Javascript
JS实现带缓冲效果打开、关闭、移动一个层的方法
2015/05/09 Javascript
使用AngularJS对表单提交内容进行验证的操作方法
2017/07/12 Javascript
Vue-cli中为单独页面设置背景色的实现方法
2018/02/11 Javascript
Vue三种常用传值示例(父传子、子传父、非父子)
2018/07/24 Javascript
vue中eslintrc.js配置最详细介绍
2018/12/21 Javascript
Vue项目前后端联调(使用proxyTable实现跨域方式)
2020/07/18 Javascript
vue.js页面加载执行created,mounted的先后顺序说明
2020/11/07 Javascript
[46:00]Ti4 冒泡赛第二轮LGD vs C9 2
2014/07/14 DOTA
在Python中的Django框架中进行字符串翻译
2015/07/27 Python
使用pyecharts无法import Bar的解决方案
2020/04/23 Python
python3.5基于TCP实现文件传输
2020/03/20 Python
对pyqt5多线程正确的开启姿势详解
2019/06/14 Python
python3中的logging记录日志实现过程及封装成类的操作
2020/05/12 Python
荷兰鞋子在线:Nelson Schoenen
2017/12/25 全球购物
英国最大的在线床超市:Bed Star
2019/01/24 全球购物
UNIX文件系统常用命令
2012/05/25 面试题
国际商务专业职业生涯规划书范文
2014/01/17 职场文书
国窖1573广告词
2014/03/21 职场文书
个人承诺书怎么写
2014/05/24 职场文书
怎样写好工作计划
2019/04/10 职场文书
导游词之镜泊湖
2019/12/09 职场文书
教你解决往mysql数据库中存入汉字报错的方法
2021/05/06 MySQL
解决ObjectMapper.convertValue() 遇到的一些问题
2021/06/30 Java/Android
SpringBoot整合Mybatis Generator自动生成代码
2021/08/23 Java/Android
POST提交数据常见的四种方式
2022/01/18 HTML / CSS