Vue.js中如何使用mixin实现代码复用?

什么是mixin?

看看官方怎么说:

Mixin是一种在面向对象编程中用来实现代码重用的技术。它允许将一个或多个已经定义好的类的成员属性或方法,合并到一个新的类中,以便该类可以获得这些成员的功能。Mixin通常用于在不同的类(或组件)之间共享某些功能模块,从而减少类之间的重复代码,并提高代码的可维护性和复用性。

JavaScript中,Mixin通常是指一组可复用的函数或对象,它们可以在应用程序中的多个组件之间共享使用。Mixin通常被封装为一个JavaScript对象,对象中包含需要混入到其他组件中的选项(如data、methods、computed、watch等),并通过Vue.js提供的mixins选项来实现混入。而这边的混入可以是全局也可以局部。

Vue.js中,Mixin是一种重要的代码复用机制,它允许我们将可复用的部分提取出来并混入到组件中,以便继承和重用这些部分。通过使用Mixin,我们可以避免在不同组件中重复编写相似的代码,并让代码更加简洁易懂、可维护性更高。

⭐⭐总结一下:

  1. Mixin本质上是一个js对象,它可以包含我们组件中任意功能选项
  2. 我们只要将共用的功能以对象的方式传入 mixins选项中,当组件使用 mixins对象时所有mixins对象的选项都将被混入该组件本身的选项中来
  3. 在Vue中,Mixin是一种可复用的组件逻辑的方式,可以将一些常用的组件选项(例如data、methods、computed等)抽离出来,然后混入到多个组件中共享使用。
  4. 在Vue中,Mixin有两种使用方式:全局混入和局部混入。Vue中我们可以局部混入跟全局混入

接下来就全局混入和局部混入详细解说一下


全局混入

⭐全局混入是指将一个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: '<div>{
    
    { message }}</div>'
})

上面这段代码,我们将一个包含data和methods选项的Mixin混入到my-component组件中,这样my-component组件可以访问message属性。

⭐⭐注意:局部混入可以解决命名冲突和组件耦合度过高的问题,但是也可能会导致代码复杂度增加和维护困难的问题,因此应该根据具体情况选择使用。


什么时候用mixin

⭐Mixin作为一种可复用的组件逻辑的方式,总结以下3点场景下使用较好。

  1. 多个组件共享相同的逻辑:
    如果多个组件需要共享相同的逻辑,例如相同的数据、方法、计算属性等等,可以将这些逻辑抽离出来,然后使用Mixin混入到这些组件中,从而避免重复编写代码。
  2. 提高代码复用性:
    如果某个组件的逻辑可以被多个组件复用,可以将这个逻辑抽离出来,然后使用Mixin混入到这些组件中,从而提高代码的复用性和可维护性。
  3. 减少重复代码:
    如果多个组件之间存在大量重复的代码,可以将这些代码抽离出来,然后使用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]
}

如此一来,代码就减少了很多,实现了代码复用,增加了效率,是个好东西。但任何技术都有利有弊,用的好是有力的臂膀,用不好则会给自己造成很多麻烦,很多困扰。


猜你喜欢

转载自blog.csdn.net/dyk11111/article/details/131070011