Vue.js 2.x mixins

混入

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

Demo源码

例子:

  1. <div id="app">
  2. <ul>
  3. <li>a: {{ a }}</li>
  4. <li>b: {{ b }}</li>
  5. </ul>
  6. </div>
  7. <script type="text/javascript">
  8. const myMixin = {
  9. data() {
  10. return {
  11. a: 1
  12. }
  13. },
  14. methods: {
  15. sayHello() {
  16. console.log('Hello world!');
  17. }
  18. },
  19. mounted() {
  20. this.sayHello();
  21. }
  22. };
  23. new Vue({
  24. el: '#app',
  25. mixins: [myMixin],
  26. data() {
  27. return {
  28. b: 2
  29. }
  30. }
  31. });
  32. </script>

选项合并

当组件和混入对象有同名选项时,不同的选项将以不同的恰当方式混合。

选项 优先级(最终保留) 方式
数据对象(data) 组件 递归合并
钩子函数 - 都保留,混入对象钩子在组件钩子之前调用
对象(methods/components/directives) 组件 混为一个对象
数据对象(data)

值类型直接按照组件优先进行覆盖。

对象如果键名有重复,按照组件键值优先进行覆盖。

数组直接按照组件的值进行覆盖。

比如:

  1. <div id="app">
  2. <ul>
  3. <li>a: {{ a }}</li>
  4. <li>b: {{ b }}</li>
  5. <li>c: {{ c }}</li>
  6. <li>obj.a: {{ obj.a }}</li>
  7. <li>obj.b: {{ obj.b }}</li>
  8. <li>obj.c: {{ obj.c }}</li>
  9. </ul>
  10. <ul>
  11. <li v-for="item in arr">{{ item.id }}: {{ item.name }}</li>
  12. </ul>
  13. <ul>
  14. <li v-for="item in arr2">{{ item }}</li>
  15. </ul>
  16. </div>
  17. <script src="../vendor/vue.js"></script>
  18. <script type="text/javascript">
  19. const myMixin = {
  20. data() {
  21. return {
  22. a: 1,
  23. c: 3,
  24. obj: {
  25. a: 1,
  26. b: 2
  27. },
  28. arr: [
  29. { id: 1, name: 'a' },
  30. { id: 2, name: 'b' }
  31. ],
  32. arr2: [1, 2, 3]
  33. }
  34. },
  35. methods: {
  36. sayHello() {
  37. console.log('Hello world!');
  38. }
  39. },
  40. mounted() {
  41. this.sayHello();
  42. }
  43. };
  44. new Vue({
  45. el: '#app',
  46. mixins: [myMixin],
  47. data() {
  48. return {
  49. b: 2,
  50. c: 4,
  51. obj: {
  52. b: 3,
  53. c: 3
  54. },
  55. arr: [
  56. { id: 2, name: 'b2' },
  57. { id: 3, name: 'c' }
  58. ],
  59. arr2: [3, 4, 5]
  60. }
  61. }
  62. });
  63. </script>

钩子函数

同名钩子函数将混合为一个数组,因此都将被调用。

混入对象中的钩子函数将在组件自身钩子函数之前被执行。

  1. const myMixin2 = {
  2. created() {
  3. console.log('%s created hook!', 'mixin');
  4. }
  5. };
  6. new Vue({
  7. mixins: [myMixin2],
  8. created() {
  9. console.log('%s created hook!', 'component');
  10. }
  11. });
  12. // mixin created hook!
  13. // component created hook!
对象选项(methodscomponentsdirectives

将被混合为一个对象,两个对象键名冲突时,取组件对象 的键值对。

watch将被全部保留,且混入对象中的watch先于组件执行。

computed将只保留组件。

  1. <div id="app2">
  2. <p>{{ r }}</p>
  3. </div>
  4. <script src="../vendor/vue.js"></script>
  5. <script type="text/javascript">
  6. const myMixin3 = {
  7. data() {
  8. return {
  9. a: 1
  10. }
  11. },
  12. methods: {
  13. foo() {
  14. console.log('This is foo');
  15. },
  16. bar() {
  17. console.log('This is bar');
  18. }
  19. },
  20. watch: {
  21. a(v) {
  22. console.log('watch value from mixin: %s', v);
  23. }
  24. },
  25. computed: {
  26. r() {
  27. return `computed value from mixin: ${ this.a }`;
  28. }
  29. }
  30. };
  31. const vm = new Vue({
  32. mixins: [myMixin3],
  33. el: '#app2',
  34. data() {
  35. return {
  36. b: 2
  37. }
  38. },
  39. watch: {
  40. a(v) {
  41. console.log('watch value from component: %s', v + this.b);
  42. }
  43. },
  44. computed: {
  45. r() {
  46. return `computed value from component: ${ this.a * this.b }`;
  47. }
  48. },
  49. methods: {
  50. bar() {
  51. console.log('This is balabala');
  52. },
  53. count() {
  54. this.a++;
  55. }
  56. },
  57. created() {
  58. setInterval(() => {
  59. this.count();
  60. }, 2000);
  61. }
  62. });
  63. vm.foo(); // This is foo
  64. vm.bar(); // This is balabala
  65. </script>

全局混入

可以在Vue上进行全局混入,将会影响到所有之后创建的Vue实例,之前的不会影响。

使用时应当像下面的例子一样,只应用于自定义选项,避免影响过多。

  1. Vue.mixin({
  2. created() {
  3. const isTrigger = this.$options.trigger;
  4. if (!isTrigger) return;
  5. console.log('Global mixin created hook log.');
  6. }
  7. });
  8. new Vue({
  9. trigger: true,
  10. created() {
  11. console.log('A component after global mixin.');
  12. }
  13. });
  14. // Global mixin created hook log.
  15. // A component after global mixin.

自定义选项合并策略

自定义选项使用默认策略,即简单地覆盖已有值。

如果想让自定义选项以自定义逻辑合并,可以通过Vue.config.optionMergeStrategies添加一个函数。

关于Vue.config.optionMergeStrategies

原文

Last updated by Jehorn 3PM, July 24, 2019

Vue.js 2.x 混入的更多相关文章

  1. vue.js过度&动画、混入&插件

    1.vue  过度动画 1.过度 Vue 在插入.更新或者移除 DOM 时,提供多种不同方式的应用过渡效果.Vue 提供了内置的过渡封装组件,该组件用于包裹要实现过渡效果的组件. 语法格式: < ...

  2. Vue.js Mixins 混入使用

    Mixins一般有两种用途: 1.在你已经写好了构造器后,需要增加方法或者临时的活动时使用的方法,这时用混入会减少源代码的污染. 2.很多地方都会用到的公用方法,用混入的方法可以减少代码量,实现代码重 ...

  3. vue.js移动端app实战3:从一个购物车入门vuex

    什么是vuex? 官方的解释是:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 简单来说就 ...

  4. 2018-11-23 手工翻译Vue.js源码:尝试重命名标识符与文本

    续前文: 手工翻译Vue.js源码第一步:14个文件重命名 对core/instance/索引中的变量, 方法进行重命名如下(题图): import { 混入初始化 } from './初始化' im ...

  5. vue.js面试题整理

    Vue.js面试题整理 一.什么是MVVM? MVVM是Model-View-ViewModel的缩写.MVVM是一种设计思想.Model 层代表数据模型,也可以在Model中定义数据修改和操作的业务 ...

  6. Vue.js之组件系统

    vue.js既然是框架,那就不能只是简单的完成数据模板引擎的任务,它还提供了页面布局的功能.本文详细介绍使用vue.js进行页面布局的强大工具,vue.js组件系统. Vue.js组件系统 每一个新技 ...

  7. Vue.js大总结

    最近回顾了一下Vue.js的基础知识,把认为重要的几个点简单的罗列了出来 vue渐进式的理解 vue可以开发很多插件,可以把很多插件组合到一起,渐进的增加vue的功能 update beforeUpd ...

  8. Vue.js 面试题整理

    Vue项目结构介绍 build 文件夹:用于存放 webpack 相关配置和脚本. config 文件夹:主要存放配置文件,比如配置开发环境的端口号.开启热加载或开启gzip压缩等. dist 文件夹 ...

  9. web前端开发面试题(Vue.js)

    1.active-class是哪个组件的属性?嵌套路由怎么定义? 答:vue-router模块的router-link组件. 2.怎么定义vue-router的动态路由?怎么获取传过来的动态参数?  ...

随机推荐

  1. 【转】JDK5.0中JVM堆模型、GC垃圾收集详细解析

    基本概念 堆/Heap JVM管理的内存叫堆:在32Bit操作系统上有4G的限制,一般来说Windows下为2G,而Linux下为3G:64Bit的就没有这个限制.JVM初始分配的内存由-Xms指定, ...

  2. [设计原则与模式] 面向对象程序设计之五大原则(SOLID)

    cp from:  https://blog.csdn.net/zhangbuzhangbu/article/details/51719952 S.O.L.I.D是面向对象设计和编程(OOD& ...

  3. 手写MyBatis ORM框架实践

    一.实现手写Mybatis三个难点 1.接口既然不能被实例化?那么我们是怎么实现能够调用的? 2.参数如何和sql绑定 3.返回结果 下面是Mybatis接口 二.Demo实现 1.创建Maven工程 ...

  4. TP5.1框架最后登录时间不会更新

      最后登录时间:2019-5-1 14:44 发现系统管理员时间总是停留在这个时间,后来才发现原来是时间没有自动更新. 手册地址:https://www.kancloud.cn/manual/thi ...

  5. Alternatives to Activiti for all platforms with any license

    Activiti Activiti is a light-weight workflow and Business Process Management (BPM) Platform targeted ...

  6. Facebook 对 PHP 的改进

    PHP 是传统意义上的解释型语言,而不是编译型语言. 因此,在命令行或 Web 服务器调用解释器解释 PHP 代码之前,PHP 代码就是 PHP 代码.PHP 解释器会解释 PHP 脚本,把代码转换为 ...

  7. expandablelistView 可展开的列表

    这个东西用法基本固定,不知道能不能做三级的展开. 界面代码 <?xml version="1.0" encoding="utf-8"?> <L ...

  8. pytorch求范数函数——torch.norm

    torch.norm(input, p='fro', dim=None, keepdim=False, out=None, dtype=None) 返回所给tensor的矩阵范数或向量范数 参数: i ...

  9. OpenBLAS编译 Debug x64 Win10 vs2015

    OpenBLAS编译  Debug x64  Win10  vs2015 >------ 已启动生成: 项目: ZERO_CHECK, 配置: Debug x64 ------ > Che ...

  10. EasyNVR是怎么做到Web浏览器播放RTSP摄像机直播视频延时控制在一秒内的

    背景说明 由于互联网的飞速发展,传统安防摄像头的视频监控直播与互联网直播相结合也是大势所趋.传统安防的直播大多在一个局域网内,在播放的客户端上也是有所限制,一般都是都需要OCX Web插件进行直播.对 ...