看看官方怎么说:
Mixin
是一种在面向对象编程中用来实现代码重用的技术。它允许将一个或多个已经定义好的类的成员属性或方法,合并到一个新的类中,以便该类可以获得这些成员的功能。Mixin通常用于在不同的类(或组件)之间共享某些功能模块,从而减少类之间的重复代码,并提高代码的可维护性和复用性。
在JavaScript中,Mixin
通常是指一组可复用的函数或对象,它们可以在应用程序中的多个组件之间共享使用。Mixin通常被封装为一个JavaScript对象,对象中包含需要混入到其他组件中的选项(如data、methods、computed、watch等),并通过Vue.js提供的mixins选项来实现混入。而这边的混入可以是全局也可以局部。
在Vue.js中,Mixin
是一种重要的代码复用机制,它允许我们将可复用的部分提取出来并混入到组件中,以便继承和重用这些部分。通过使用Mixin,我们可以避免在不同组件中重复编写相似的代码,并让代码更加简洁易懂、可维护性更高。
⭐⭐总结一下:
mixins
选项中,当组件使用 mixins
对象时所有mixins
对象的选项都将被混入该组件本身的选项中来接下来就全局混入和局部混入详细解说一下
⭐全局混入是指将一个Mixin混入到所有组件中。我们可以使用Vue.mixin方法来实现全局混入
Vue.mixin({
data() {
return {
message: 'Hello World'
}
},
methods: {
greet() {
console.log(this.message)
}
}
})
上面的代码,我们将一个包含data和methods选项的Mixin混入到所有组件中,这样所有组件都可以访问message和greet方法。
⭐⭐注意:全局混入可能会导致命名冲突和组件耦合度过高的问题,因此应该尽量避免使用全局混入。
⭐局部混入是指将一个Mixin混入到指定的组件中。我们可以在组件的mixins选项中指定一个Mixin
const myMixin = {
data() {
return {
message: 'Hello World'
}
},
methods: {
greet() {
console.log(this.message)
}
}
}
Vue.component('my-component', {
mixins: [myMixin],
template: '{{ message }}'
})
上面这段代码,我们将一个包含data和methods选项的Mixin混入到my-component组件中,这样my-component
组件可以访问message属性。
⭐⭐注意:局部混入可以解决命名冲突和组件耦合度过高的问题,但是也可能会导致代码复杂度增加和维护困难的问题,因此应该根据具体情况选择使用。
⭐Mixin作为一种可复用的组件逻辑的方式,总结以下3点场景下使用较好。
- 多个组件共享相同的逻辑:
如果多个组件需要共享相同的逻辑,例如相同的数据、方法、计算属性等等,可以将这些逻辑抽离出来,然后使用Mixin混入到这些组件中,从而避免重复编写代码。- 提高代码复用性:
如果某个组件的逻辑可以被多个组件复用,可以将这个逻辑抽离出来,然后使用Mixin混入到这些组件中,从而提高代码的复用性和可维护性。- 减少重复代码:
如果多个组件之间存在大量重复的代码,可以将这些代码抽离出来,然后使用Mixin混入到这些组件中,从而减少重复代码的量,提高代码的可读性和可维护性。
⭐⭐虽说这个东西可以让代码复用,增加效率,但过度使用,性能,安全方面就需要考虑和权衡一下了。
以下着重说一下这个东西的缺点。
- 命名冲突:
当多个Mixin对象中包含了同名的选项或方法时,可能会导致命名冲突的问题。这会影响代码的可读性和维护性,需要开发者进行组件选项的覆盖或重命名。- 侵入性:
Mixin是通过混入将代码注入到组件中的,因此可能会导致组件的选项被修改或覆盖。这种侵入性可能会带来一定的不确定性和风险,需要开发者掌握好混入对象的内容和使用方式。- 不可预测性:
由于Mixin通常是通过全局公用的方式实现的,因此可能会存在多个相互不同的Mixin对象同时生效的情况。这会导致代码的行为不可预测,需要开发者进行充分的测试和验证。- 复杂性:
当应用程序中同时引入了多个Mixin对象时,可能会导致代码的复杂度增加,增加开发和维护的难度。此时,开发者需要进行代码的重构和整合,提高代码的可读性和可维护性。
⭐一个项目中会重复利用的功能有很多,比如弹窗,提升信息,判断框,提示框。
你比如说,做一个弹窗,利用状态的true或false来控制显示:
const Pop= {
template: '#pop',
data() {
return {
flag: false
}
},
methods: {
toggleShow() {
this.isShowing = !this.isShowing;
}
}
}
你再比如说,有新增编辑按钮,点击后也是会显示,依然也是通过true或false来控制显示隐藏
你还比如说,做一个提示框,依然通过状态判断
const PromptBox= {
template: '#PromptBox',
data() {
return {
isShowing: false
}
},
methods: {
toggleShow() {
this.isShowing = !this.isShowing;
}
}
}
这些东西干的事情不一样,但是实现起来都是一样的,代码逻辑是一样的。那么这个时候,我们可以用mixin
来简单化代码,比如我们写一个mixin
程序:
const toggle = {
data() {
return {
isShowing: false
}
},
methods: {
toggleShow() {
this.isShowing = !this.isShowing;
}
}
}
然后上面的两个组件代码就可以改为:
弹窗:
const Pop= {
template: '#pop',
mixins: [toggle]
}
提示框:
const PromptBox= {
template: '#PromptBox',
mixins: [toggle]
}
如此一来,代码就减少了很多,实现了代码复用,增加了效率,是个好东西。但任何技术都有利有弊,用的好是有力的臂膀,用不好则会给自己造成很多麻烦,很多困扰。