Vue混入(mixins)理解及应用

简介: Vue混入(mixins)理解及应用

1. mixins 简介

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

混合对象可以包含任意组件选项。

当组件使用混合对象时,所有混合对象的选项将被混入该组件本身的选项。

1.1 mixins 理解

组件在引用之后相当于在父组件内开辟了一块单独的空间,来根据父组件props过来的值进行相应的操作,单本质上两者还是泾渭分明,相对独立。

而 mixins 则是在引入组件之后,则是将组件内部的内容如data等方法、method等属性与父组件相应内容进行合并。相当于在引入后,父组件的各种属性方法都被扩充了。

  • 单纯组件引用:
    父组件 + 子组件 —> 父组件 + 子组件
  • mixins
    父组件 + 子组件 —> new父组件

有点像注册了一个 vue 的公共方法,可以绑定在多个组件或者多个Vue对象实例中使用。

另一点,类似于在原型对象中注册方法,实例对象即组件或者Vue实例对象中,仍然可以定义相同函数名的方法进行覆盖,有点像子类和父类的感觉。

2. mixins 使用

  1. 定义一个混入对象
const testMixin = {
  data(){
    return{
      count:1,
    }
  },
  methods: {
    test(){
      console.log('mixin')
    }
  },
  beforeMount() {
    this.test()
  },
}
export{
  testMixin
}
  1. 把混入对象混入到当前的组件中
<template>
  <div class="template1">
    组件一
  </div>
</template>
<script>
import { testMixin } from '@/mixins/mixin.js'
export default {
  data() {
    return {};
  },
  mixins:[testMixin],
  methods: {},
  mounted() {},
};
</script>

3.效果

2020062310470442.png

3. mixins 的特点

3.1 方法和参数在各组件中不共享

混合对象中的参数count

const testMixin = {
  data(){
    return{
      count:1,
    }
  },
  methods: {
    test(){
      console.log('mixin')
    }
  },
  beforeMount() {
    this.test()
  },
}
export{
  testMixin
}

组件1中的参数 count 进行+1的操作

<template>
  <div class="template1">
    template1中的count:{{count}}
  </div>
</template>
<script>
import { testMixin } from '@/mixins/mixin.js'
export default {
  data() {
    return {};
  },
  mixins:[testMixin],
  methods: {},
  mounted() {
    this.count ++;
  },
};
</script>
<style lang="stylus" scoped>
.template1{
  color : red;
}
</style>

组件2中的参数 count 未进行操作

<template>
  <div class="template2">
    template2中的count:{{count}}
  </div>
</template>
<script>
import { testMixin } from '@/mixins/mixin.js'
export default {
  data() {
    return {};
  },
  mixins:[testMixin],
  methods: {},
  mounted() {},
};
</script>
<style lang="stylus" scoped>
.template2{
  color : blue;
}
</style>

看两组件中分别输出的 count 值

2020062310470442.png

可以看到,在组件1里改变了 count 里面的值,组件2中的 count 值还是混入对象里的初始值

3.2 值为对象的选项(如methods,components等),选项会被合并(键冲突的, 组件会覆盖混入对象的)

混入对象中的方法

const testMixin = {
  data(){
    return{
      count:1,
    }
  },
  methods: {
    test1(){
      console.log('test1 from mixin')
    },
    test2(){
      console.log('test2 from mixin')
    }
  },
  beforeMount() {
  },
}
export{
  testMixin
}

组件中的方法

<template>
  <div class="template1">
    template1中的count:{{count}}
  </div>
</template>
<script>
import { testMixin } from '@/mixins/mixin.js'
export default {
  data() {
    return {
      count:10
    };
  },
  mixins:[testMixin],
  methods: {
    testSelf(){
      console.log('testSelf from template1')
    },
    test2(){
      console.log('test2 from template1')
    }
  },
  mounted() {
    this.testSelf();
    this.test1();
    this.test2();
  },
};
</script>

2020062310470442.png

打印台输出

20200623104134875.png

3.3 值为函数的选项(如created,mounted等),会被合并调用。混合对象里的钩子函数会在组件里的钩子函数之前调用

混入对象函数中的 console

const testMixin = {
  data(){
    return{
      count:1,
    }
  },
  methods: {},
  mounted() {
    console.log('mixin')
  },
}
export{
  testMixin
}

组件函数中的 console

<template>
  <div class="template1">
    template1中的count:{{count}}
  </div>
</template>
<script>
import { testMixin } from '@/mixins/mixin.js'
export default {
  data() {
    return {
    };
  },
  mixins:[testMixin],
  methods: {},
  mounted() {
    console.log('template1')
  },
};
</script>

打印台输出

2020062310470442.png

3.3 mixin中含有异步请求

当混合里面包含异步请求函数,而我们又需要在组件中使用异步请求函数的返回值时,我们会取不到此返回值,如下:

// mixin.js
const testMixin = {
  data(){
    return{}
  },
  methods: {
    remote(){
      new Promise((resolve,reject) => {
        let a = 1;
        setTimeout(()=>{
          resolve(a)
        },1000)
      }).then(res =>{
        console.log(res,'mixin');
        return res
      })
    }
  },
  mounted() {},
}
export{
  testMixin
}
// test.vue
<template>
  <div class="template1">
    template1
  </div>
</template>
<script>
import { testMixin } from '@/mixins/mixin.js'
export default {
  data() {
    return {};
  },
  mixins:[testMixin],
  methods: {},
  mounted() {
    console.log(this.remote(),'template1')
  },
};
</script>

2020062310470442.png

解决方案:不要返回结果而是直接返回异步函数

// mixin.js
const testMixin = {
  data(){
    return{}
  },
  methods: {
    async remote(){
      let result = await new Promise((resolve,reject) => {
        let a = 1;
        setTimeout(()=>{
          resolve(a)
        },1000)
      })
      return result;
    }
  },
  mounted() {},
}
export{
  testMixin
}
// test.vue
<template>
  <div class="template1">
    template1
  </div>
</template>
<script>
import { testMixin } from '@/mixins/mixin.js'
export default {
  data() {
    return {};
  },
  mixins:[testMixin],
  methods: {},
  mounted() {
    this.remote().then(res =>{
      console.log(res,'template1')
    })
  },
};
</script>

2020062310470442.png

4. 总结

与vuex的区别:

  • vuex:用来状态管理的,里面定义的变量在每个组件中均可以使用和修改,在任一组件中修改此变量的值之后,其他组件中此变量的值也会随之修改;
  • Mixins:可以定义共用的变量,在每个组件中使用,引入组件中之后,各个变量是相互独立的,值的修改在组件中不会相互影响;

与公共组件的区别

  • 公共组件:在父组件中引入组件,相当于在父组件中给出一片独立的空间供子组件使用,然后根据props来传值,但本质上两者是相对独立的;
  • Mixins:在引入组件之后与组件中的对象和方法进行合并,相当于扩展了父组件的对象与方法,可以理解为形成了一个新的组件;


相关文章
|
4月前
|
JavaScript
Vue中如何实现兄弟组件之间的通信
在Vue中,兄弟组件可通过父组件中转、事件总线、Vuex/Pinia或provide/inject实现通信。小型项目推荐父组件中转或事件总线,大型项目建议使用Pinia等状态管理工具,确保数据流清晰可控,避免内存泄漏。
370 2
|
3月前
|
缓存 JavaScript
vue中的keep-alive问题(2)
vue中的keep-alive问题(2)
339 137
|
7月前
|
人工智能 JavaScript 算法
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
854 0
|
7月前
|
JavaScript UED
用组件懒加载优化Vue应用性能
用组件懒加载优化Vue应用性能
|
5月前
|
缓存 前端开发 大数据
虚拟列表在Vue3中的具体应用场景有哪些?
虚拟列表在 Vue3 中通过仅渲染可视区域内容,显著提升大数据列表性能,适用于 ERP 表格、聊天界面、社交媒体、阅读器、日历及树形结构等场景,结合 `vue-virtual-scroller` 等工具可实现高效滚动与交互体验。
517 1
|
6月前
|
人工智能 JSON JavaScript
VTJ.PRO 首发 MasterGo 设计智能识别引擎,秒级生成 Vue 代码
VTJ.PRO发布「AI MasterGo设计稿识别引擎」,成为全球首个支持解析MasterGo原生JSON文件并自动生成Vue组件的AI工具。通过双引擎架构,实现设计到代码全流程自动化,效率提升300%,助力企业降本增效,引领“设计即生产”新时代。
497 1
|
6月前
|
JavaScript 安全
在 Vue 中,如何在回调函数中正确使用 this?
在 Vue 中,如何在回调函数中正确使用 this?
313 0
|
9月前
|
JavaScript
vue实现任务周期cron表达式选择组件
vue实现任务周期cron表达式选择组件
1100 4
|
8月前
|
JavaScript 数据可视化 前端开发
基于 Vue 与 D3 的可拖拽拓扑图技术方案及应用案例解析
本文介绍了基于Vue和D3实现可拖拽拓扑图的技术方案与应用实例。通过Vue构建用户界面和交互逻辑,结合D3强大的数据可视化能力,实现了力导向布局、节点拖拽、交互事件等功能。文章详细讲解了数据模型设计、拖拽功能实现、组件封装及高级扩展(如节点类型定制、连接样式优化等),并提供了性能优化方案以应对大数据量场景。最终,展示了基础网络拓扑、实时更新拓扑等应用实例,为开发者提供了一套完整的实现思路和实践经验。
997 77
|
9月前
|
缓存 JavaScript 前端开发
Vue 基础语法介绍
Vue 基础语法介绍