我们都知道 Vue 采用的是一种组件化开发模式,组件在 Vue 中一个非常重要的核心概念。每个组件都是一个完整的实例,组件的创建,组件间的通讯,组件如何更好的复用,以及整个的生命周期的钩子。所以你会发现它都是围绕组件展开的。

我们就来说说如何创建一个灵活的高复用的组件。之前分享过一篇「slot」内容分发的文章,它可以让我们组件的内容更加的灵活。有兴趣的可以看下。

《Vue一个案例引发「内容分发slot」的最全总结.md》

今天主要分享的是组件中另一种分发,功能的分发「mixins」,也叫混入。在开始之前呢,我们先看个案例,先从案例中看出个大概,然后带着问题去学习知识点会更加的高效,这也是我个人比较常用的学习方式。

在 Element(一款优秀的组件库)中有这么两个组件MessageBox 与 Dialog。


官方说法:

从场景上说,MessageBox 的作用是美化系统自带的 alert、confirm 和 prompt,因此适合展示较为简单的内容。如果需要弹出较为复杂的内容,请使用 Dialog。

所以你会发现,这两个组件非常的相似,他们共享一些相同的基本功能,如:打开/关闭之间的状态切换。但用法上又各有不同。请看下面的例子

// Message Box
<template><el-button type="text" @click="open">打开 Message Box</el-button>
</template>
<script>export default {methods: {open() {this.$confirm('此操作将永久删除该文件, 是否继续?', '提示', {confirmButtonText: '确定',cancelButtonText: '取消'})}}}
</script>// Dialog
<el-button type="text" @click="dialogVisible = true">打开 Dialog</el-button>
<el-dialog:visible.sync="dialogVisible"><span>这是一段信息</span>
</el-dialog>
<script>export default {data() {return {dialogVisible: false};}};
</script>

相似的组件,相同基本功能,这时你不得不做出选择,是将它们分成两个不同的组件?还是只保留一个?

显然这两种做法都不完美,如果分成两个组件,后期有功能的变动话,就会去修改多次,带来维护成本。如果保留一个,但是用法上又各有不同,这可怎么办呢?

有同学也会有疑问,不就两个组件吗?能带来多少维护成本?其实不仅如此,类似于这种状态切换的功能还有提示框,弹出框等等。

所以 Vue 给我们提供了一种方案叫功能的分发「mixins」。

什么是 Mixins

官方说法:混入 (mixins) 是一种分发 Vue 组件中可复用功能的非常灵活的方式。

简单来说就是可以让不同的组件「共用」某个功能。

Mixins 对象可以包含 Vue 实例中的所有选项,当组件使用 Mixins 对象时,Mixins 对象中的所有选项将和组件中的选项进行合并。

既然如此那我们就来尝试用 Mixins 对象 去修改上面两个组件。让它们可以共用一个方法。以下组件都是自己书写的简单实现,只实现状态切换的基本功能。

//mixins.js
export const showMixin = {data: function () {return {isShowing: true};},methods: {toggle() {this.isShowing = !this.isShowing;}}
}//MessageBox
<template><div class="panel-box">//省略</div>
</template>
<script>
import { showMixin } from "./mixins.js";
export default {name: "MessageBox",mixins: [showMixin]
};//DialogBox
<template><div class="panel-box">//省略</div>
</template>
<script>
import { showMixin } from "./mixins.js";
export default {name: "DialogBox",mixins: [showMixin]
};
</script>

可以看到,我们把两个组件的相同功能给剥离出来,采用 mixins 对象的方式然后在组件中引入即可,这样以来组件就会有更好的灵活性。

有聪明的小伙伴应该就会有疑问了,如果 mixins 对象中的选项和组件实例中的选项相同时会怎么办?这也是我们下面要说到的问题,Vue 中给出了我们几个决策机制,一起来看看。

选项的合并

  1. data 对象的合并

当组件与混入对象的 data 对象发生冲突时,以组件中的优先,如何没有冲突将会进行递归合并。

const mixin = {data: function() {return {hero: "蛮三刀",text: "来自mixins中的「上单一霸」"};}
};
export default {name: "DialogBox",mixins: [mixin],data() {return {text: "来自组件中的「上单一霸」"};},mounted() {console.log(this.$data); // {hero: "蛮三刀",text: "来自组件中的「上单一霸」"}}
};
  1. 钩子函数的合并

钩子函数将会被全部调用,因为同名钩子函数将会被合并成一个数组,但 mixins 中的钩子会优先于组件中的钩子执行。

const mixin = {created() {console.log("mixins中的上单一霸");},mounted() {console.log("mixins中的中单一霸");}
};
export default {name: "DialogBox",mixins: [mixin],created() {console.log("组件中的上单一霸");},mounted() {console.log("组件中的中单一霸");}
};
//mixins中的上单一霸
//组件中的上单一霸
//mixins中的中单一霸
//组件中的中单一霸

3.值为对象类型的合并

像methods、watch等值为对象类型的会合并成一个对象,如有冲突将采用组件中的。

const mixin = {methods: {say() {console.log("mixins组件上单一霸");},do() {console.log("mixins偷塔");}}
};
export default {name: "DialogBox",mixins: [mixin],methods: {say() {console.log("组件上单一霸");}},mounted() {this.say(); //组件上单一霸this.do(); //mixins偷塔}
};

通过上面一些案例的解释,你应该熟悉了如何利用 混入对象去创建一个高复用组件了,不妨去尝试一下。

最后,希望大家能够有所收获。如果你觉得本文不错欢迎点赞转发。

关注微信公众号:六小登登,学习更多干货文章,领取全套学习资源。

Element组件引发的Vue中mixins使用,写出高复用组件相关推荐

  1. 如何在Spring Boot中使用TDD写出高质量的接口

    本文发布于专栏Effective Java,如果您觉得看完之后对你有所帮助,欢迎订阅本专栏,也欢迎您将本专栏分享给您身边的工程师同学. 之前在<如何说服你的同事使用TDD>中介绍了为什么要 ...

  2. vue中mixins的使用方法和注意地方

    一.什么是Mixins? mixins(混入),官方的描述是一种分发 Vue 组件中可复用功能的非常灵活的方式,mixins是一个js对象,它可以包含我们组件中script项中的任意功能选项,如dat ...

  3. vue 中 mixins 的使用

    本文同步发布在:vue 中 mixins 的使用 mixins(混入)就是定义了一部分公共的方法.计算属性或者钩子函数等 vue 组件中的可复用功能,然后混合进各个组件中使用.下面我们具体来看看怎么使 ...

  4. 【Vue】Vue中mixins的使用方法及实际项目应用详解

    文章目录 (1)mixin基础 (2)mixin特点 1.选项合并 2.方法和参数在各组件中不共享 (3)mixin与vuex的区别 (4)mixin与公共组件的区别 (5)项目实践 (6)总结 (1 ...

  5. vue中Mixins 与 Hoc

    什么是mixins 在官方文档中 混入 (mixins) 是一种分发 Vue 组件中可复用功能的非常灵活的方式.混入对象可以包含任意组件选项.当组件使用混入对象时,所有混入对象的选项将被混入该组件本身 ...

  6. vue中mixins的使用方法

    参考官网以及网上的一些资料,最基本的用法 混入 (mixin) 提供了一种非常灵活的方式,来分发 Vue 组件中的可复用功能.一个混入对象可以包含任意组件选项.当组件使用混入对象时,所有混入对象的选项 ...

  7. [vue] 写出多种定义组件模板的方法

    [vue] 写出多种定义组件模板的方法 1.字符串 2.模板字面量 3.<script type="x-template"></script> 4.文件组件 ...

  8. 从一副去掉大小王的 52 张扑克牌中,请写出代码,用随机抽样的方法,分别估计出现 炸弹、顺子 (5张)、同花顺 (3 张)的概率。请使用自己的学号作为种子,得出最后的估计结果。

    从一副去掉大小王的 52 张扑克牌中,请写出代码,用随机抽样的方法,分别估计出现 炸弹.顺子 (5张).同花顺 (3 张)的概率.请使用自己的学号作为种子,得出最后的估计结果. (Tips:3张和5张 ...

  9. Vue中Pdf预览及打印(自定义组件)

    思路: 1. vue中使用ifream访问后台 2.封装共用vue组件 3.后台通过freemaker模板生成相应pdf 效果: 编写自定义组件PdfView.vue <template> ...

最新文章

  1. windows 7 64bit安装apche php
  2. centos 程序 mysql数据库文件位置,CentOS 更改MySQL数据库目录位置
  3. 风格迁移模型测试效果
  4. JMS学习六(ActiveMQ消息传送模型)
  5. linux的wc命令源代码,linux下的wc命令的源代码
  6. a6gpp php,内行人才知道的古董级玛莎拉蒂A6G 2000
  7. 《深度学习笔记》——防止梯度消失的学习笔记
  8. 什么是通配符SSL证书?
  9. 关于键盘右边的 数字小写键盘不能使用的解决办法
  10. app模式会被第三方平台模式取代吗_第三方APP逐渐被替代?网友:手机自带的足够用了...
  11. 工业革命4.0是光和算的革命,时代呼唤硬科技!
  12. 启动tomcat卡在“信息: Destroying ProtocolHandler”
  13. HDMI、AV音视频端子介绍
  14. 怎样优雅劝退他人做自媒体?
  15. nodejs.ReferenceError:window is not defined
  16. Vue CLI 3搭建
  17. c语言中字符加上48是,【2017年整理】C语言字符型数据(4、5).doc
  18. curl采集 根据关键词 获取雅虎竞价排名
  19. RISC-V学习基础(三)
  20. 手机数控模拟器安卓版_数控机床模拟器手机版下载-数控机床模拟器高级版下载v1.1.4 安卓版-单机手游网...

热门文章

  1. 群控系统linux脚本,群控脚本if then
  2. MySQL性能调优与设计——MySQL中的索引
  3. 长期更新收藏的函数——那些年我们跪在键盘上欣赏过的函数
  4. BOS开发工具的使用心得
  5. html回弹效果,CSS 实现移动设备滚动回弹效果_html/css_WEB-ITnose
  6. 一带一路中国出口马来西亚主要商品及货源地
  7. 大数据告诉你哪部电影最有影响力
  8. 企业迁移到云之前要考虑的关键因素
  9. Linux之I2C驱动
  10. Windows使用bat脚本上传文件到Linux(免密上传)