在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 相关文章推荐
鼠标右击事件代码(asp.net后台)
Jan 27 Javascript
浅析JavaScript中的CSS属性及命名规范
Nov 28 Javascript
js中switch case循环实例代码
Dec 30 Javascript
jquery 获取dom固定元素 添加样式的简单实例
Feb 04 Javascript
javascript+HTML5 Canvas绘制转盘抽奖
May 16 Javascript
jQuery Raty 一款不错的星级评分插件
Aug 24 Javascript
JSON中key动态设置及JSON.parse和JSON.stringify()的区别
Dec 29 Javascript
vue.js如何更改默认端口号8080为指定端口的方法
Jul 14 Javascript
Node.js Koa2使用JWT进行鉴权的方法示例
Aug 17 Javascript
JavaScript多种页面刷新方法小结
Apr 04 Javascript
Node.js+ELK日志规范的实现
May 23 Javascript
jquery传参及获取方式(两种方式)
Feb 13 jQuery
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 上传功能实例代码
2010/04/13 PHP
Smarty模板学习笔记之Smarty简介
2014/05/20 PHP
使用CodeIgniter的类库做图片上传
2014/06/12 PHP
php的mkdir()函数创建文件夹比较安全的权限设置方法
2014/07/28 PHP
Yii使用技巧大汇总
2015/12/29 PHP
php文件上传 你真的掌握了吗
2016/11/28 PHP
PHP中大括号'{}'用法实例总结
2017/02/08 PHP
php 一维数组的循环遍历实现代码
2017/04/10 PHP
PHP+RabbitMQ实现消息队列的完整代码
2019/03/20 PHP
再谈Yii Framework框架中的事件event原理与应用
2020/04/07 PHP
javascript处理表单示例(javascript提交表单)
2014/04/28 Javascript
兼容最新firefox、chrome和IE的javascript图片预览实现代码
2014/08/08 Javascript
jQuery表单美化插件jqTransform使用详解
2015/04/12 Javascript
浅析Vue 生命周期
2018/06/21 Javascript
React之PureComponent的使用作用
2018/07/10 Javascript
Vue3.0 响应式系统源码逐行分析讲解
2019/10/14 Javascript
JavaScript switch语句使用方法简介
2019/12/30 Javascript
vue登录页实现使用cookie记住7天密码功能的方法
2021/02/18 Vue.js
vue实现拖拽进度条
2021/03/01 Vue.js
使用python 获取进程pid号的方法
2014/03/10 Python
Python实现将不规范的英文名字首字母大写
2016/11/15 Python
如何基于python测量代码运行时间
2019/12/25 Python
来自美国主售篮球鞋的零售商店:KICKSUSA
2017/11/28 全球购物
性能服装:HYLETE
2018/08/14 全球购物
高三自我鉴定
2013/10/23 职场文书
物流专业大学生的自我鉴定
2013/11/13 职场文书
司机的工作范围及职责
2013/11/13 职场文书
可口可乐广告词
2014/03/20 职场文书
小学生一分钟演讲稿
2014/08/26 职场文书
2014年综合治理工作总结
2014/11/20 职场文书
2014年物业公司工作总结
2014/11/22 职场文书
秋季运动会开幕词
2015/01/28 职场文书
企业计划生育责任书
2015/05/09 职场文书
刑事上诉状(量刑过重)
2015/05/23 职场文书
SQL优化老出错,那是你没弄明白MySQL解释计划用法
2021/11/27 MySQL
本地搭建minio文件服务器(使用bat脚本启动)的方法
2022/07/15 Servers