前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >vue中组件继承与实现——vue mixins的碎碎念

vue中组件继承与实现——vue mixins的碎碎念

原创
作者头像
Yerik
发布2022-03-31 20:07:44
8670
发布2022-03-31 20:07:44
举报
文章被收录于专栏:烹饪一朵云烹饪一朵云

最近在写前端的时候,接触mixins比较多,发现尤大大对于这个性质的设置颇为有趣。毕竟对于 Vue 组件来说,混入(mixins)是一种灵活分发可复用性功能的方式。一个混入对象可以包含任意组件选项(options)。当组件使用混入对象时,所有混入对象的选项将被“混进”该组件本身的选项中。

混入 (mixin) 提供了一种非常灵活的方式,来分发 Vue 组件中的可复用功能。一个混入对象可以包含任意组件选项。当组件使用混入对象时,所有混入对象的选项将被“混合”进入该组件本身的选项。

例子

通常,Vue组件是由一个JavaScript对象定义的,它具有表示我们所需功能的各种属性——诸如 data,methods,computed 等。

代码语言:javascript
复制
// MyComponent.js
export default {
  data: () => ({
    myDataProperty: null
  }),
  methods: {
    myMethod () { ... }
  }
  // ...
}

当我们想在组件之间共享相同的属性时,可以将公共属性提取到一个单独的模块中:

代码语言:javascript
复制
// MyMixin.js
export default {
  data: () => ({
    mySharedDataProperty: null
  }),
  methods: {
    mySharedMethod () { ... }
  }
}

现在,我们可以通过将其分配给 mixin config属性将其添加到任何使用的组件中。在运行时,Vue会将组件的属性与任何添加的mixin合并。

代码语言:javascript
复制
// ConsumingComponent.js
import MyMixin from "./MyMixin.js";

export default {
  mixins: [MyMixin],
  data: () => ({
    myLocalDataProperty: null
  }),
  methods: {
    myLocalMethod () { ... }
  }
}

对于这个特定的例子,在运行时使用的组件定义应该是这样的:

代码语言:javascript
复制
export default {
  data: () => ({
    mySharedDataProperty: null
    myLocalDataProperty: null
  }),
  methods: {
    mySharedMethod () { ... },
    myLocalMethod () { ... }
  }
}

作用域

由于这样的一种混入,我们得以做很多有趣的个性化的效果,但比较值得注意的是,使用了混入的时候要注意作用域影响范围的不同

  • 从管理角度来看
    • vuex:用来做状态管理的,里面定义的变量在每个组件中均可以使用和修改,在任一组件中修改此变量的值之后,其他组件中此变量的值也会随之修改。
    • Mixins:可以定义共用的变量,在每个组件中使用,引入组件中之后,各个变量是相互独立的,值的修改在组件中不会相互影响。
  • 从组件应用角度来看:
    • 组件:在父组件中引入组件,相当于在父组件中给出一片独立的空间供子组件使用,然后根据props来传值,但本质上两者是相对独立的。这个时候父组件 + 子组件仍然还是两个组件
    • Mixins:则是在引入组件之后与组件中的对象和方法进行合并,相当于扩展了父组件的对象与方法,可以理解为形成了一个新的组件。此时父组件 + 子组件 已然成为 新的组件

总的来说,组件在引用之后相当于在父组件内开辟了一块单独的空间,来根据父组件props过来的值进行相应的操作,单本质上两者还是泾渭分明,相对独立。而mixins则是在引入组件之后,则是将组件内部的内容如data等方法、method等属性与父组件相应内容进行合并。相当于在引入后,父组件的各种属性方法都被扩充了。

方法的覆盖

如果在引用mixins的同时,在组件中重复定义相同的方法,则mixins中的方法会被覆盖。

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

从这个角度来说,真有那么一些继承的意味在里面,我愿称之为新の组件继承与实现。

参考资料

  1. https://www.cnblogs.com/helloyoyo/p/15049528.html
  2. https://cn.vuejs.org/v2/guide/mixins.html
  3. https://zhuanlan.zhihu.com/p/135444167

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 例子
  • 作用域
  • 方法的覆盖
  • 参考资料
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档