在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 相关文章推荐
JQuery 学习笔记 选择器之二
Jul 23 Javascript
Javascript 命名空间模式
Nov 01 Javascript
表单提交前触发函数返回true表单才会提交
Mar 11 Javascript
node.js解决获取图片真实文件类型的问题
Dec 20 Javascript
原生javascript实现图片无缝滚动效果
Feb 12 Javascript
纯js的右下角弹窗实例
Mar 12 Javascript
JS实现的简单表单验证功能示例
Oct 13 Javascript
解决vue 打包发布去#和页面空白的问题
Sep 04 Javascript
使用Easyui实现查询条件的后端传递并自动刷新表格的两种方法
Sep 09 Javascript
微信头像地址失效踩坑记附带解决方案
Sep 23 Javascript
Node.JS获取GET,POST数据之queryString模块使用方法详解
Feb 06 Javascript
js+html+css实现手动轮播和自动轮播
Dec 30 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+ajax 无刷新删除数据
2010/02/20 PHP
php数据库连接时容易出错的特殊符号问题
2010/09/01 PHP
PHP $_FILES函数详解
2011/03/09 PHP
php打开远程文件的方法和风险及解决方法
2013/11/12 PHP
基于laravel-admin 后台 列表标签背景的使用方法
2019/10/03 PHP
基于jquery的让页面控件不可用的实现代码
2010/04/27 Javascript
利用javascript判断文件是否存在
2013/12/31 Javascript
页面刷新时记住滚动条的位置jquery代码
2014/06/17 Javascript
Node.js中require的工作原理浅析
2014/06/24 Javascript
js改变style样式和css样式的简单实例
2016/06/28 Javascript
完美解决jQuery的hover事件在IE中不停闪动的问题
2017/02/10 Javascript
浅谈JS如何实现真正的对象常量
2017/06/25 Javascript
JavaScript算法教程之sku(库存量单位)详解
2017/06/29 Javascript
将 vue 生成的 js 上传到七牛的实例
2017/07/28 Javascript
vue-resource拦截器设置头信息的实例
2017/10/27 Javascript
浅谈angularJs函数的使用方法(大小写转换,拷贝,扩充对象)
2018/10/08 Javascript
利用原生的JavaScript实现简单拼图游戏
2018/11/18 Javascript
vue结合element-ui使用示例
2019/01/24 Javascript
浅析vue插槽和作用域插槽的理解
2019/04/22 Javascript
turn.js异步加载实现翻书效果
2019/07/25 Javascript
微信小程序HTTP请求从0到1封装
2019/09/09 Javascript
JavaScript setInterval()与setTimeout()计时器
2019/12/27 Javascript
js验证密码强度解析
2020/03/18 Javascript
浅谈vue中使用编辑器vue-quill-editor踩过的坑
2020/08/03 Javascript
Python中的super()方法使用简介
2015/08/14 Python
Python读取系统文件夹内所有文件并统计数量的方法
2018/10/23 Python
Python面向对象之类和对象实例详解
2018/12/10 Python
python 根据字典的键值进行排序的方法
2019/07/24 Python
Python笔记之工厂模式
2019/11/20 Python
Python3中对json格式数据的分析处理
2021/01/28 Python
连卡佛中国官网:Lane Crawford中文站
2018/01/27 全球购物
运动会入场词60字
2014/02/15 职场文书
奥巴马就职演讲稿
2014/05/15 职场文书
如何写股份合作协议书
2014/09/11 职场文书
教师政风行风评议心得体会
2014/10/21 职场文书
Python调用腾讯API实现人脸身份证比对功能
2022/04/04 Python