Vue.js 组件复用和扩展之道

软件编程有一个重要的原则是 D.R.Y(Don’t Repeat Yourself),讲的是尽量复用代码和逻辑,减少重复。组件扩展可以避免重复代码,更易于快速开发和维护。那么,扩展 Vue 组件的最佳方法是什么?

Vue 提供了不少 API 和模式来支持组件复用和扩展,你可以根据自己的目的和偏好来选择。

本文介绍几种比较常见的方法和模式,希望对你有所帮助。

扩展组件是否必要
要知道,所有的组件扩展方法都会增加复杂性和额外代码,有时候还会增加性能消耗。

因此,在决定扩展组件之前,最好先看看有没有其他更简单的设计模式能完成目标。

下面几种组件设计模式通常足够替代扩展组件了:

props 配合模板逻辑
slot 插槽
JavaScript 工具函数
props 配合模板逻辑
最简单的方法是通过props结合模板条件渲染,来实现组件的多功能。

比如通过 type 属性:
MyVersatileComponent.vue

...
...

使用组件的时候传不同的type值就能实现不同的结果。

// ParentComponent.vue



如果出现下面两种情况,就说明这种模式不适用了,或者用法不对:

组件组合模式把状态和逻辑分解成原子部分,从而让应用具备可扩展性。如果组件内存在大量条件判断,可读性和可维护性就会变差。
props 和模板逻辑的本意是让组件动态化,但是也存在运行时资源消耗。如果你利用这种机制在运行时解决代码组合问题,那是一种反模式。
slot(插槽)
另一种可避免组件扩展的方式是利用 slots(插槽),就是让父组件在子组件内设置自定义内容。

// MyVersatileComponent.vue

Common markup

// ParentComponent.vue


Inserting into the slot


渲染结果:

Common markup

Inserting into the slot

这种模式有一个潜在约束, slot 内的元素从属于父组件的上下文,在拆分逻辑和状态时可能不太自然。scoped slot会更灵活,后面会在无渲染组件一节里提到。

JavaScript 工具函数
如果只需要在各组件之间复用独立的函数,那么只需要抽取这些 JavaScript 模块就行了,根本不需要用到组件扩展模式。

JavaScript 的模块系统是一种非常灵活和健壮的代码共享方式,所以你应该尽可能地依靠它。
MyUtilityFunction.js

export default function () {

}

MyComponent.vue

import MyUtilityFunction from “./MyUtilityFunction”;
export default {
methods: {
MyUtilityFunction
}
}

扩展组件的几种模式
如果你已经考虑过以上几种简单的模式,但这些模式还不够灵活,无法满足需求。那么就可以考虑扩展组件了。

扩展 Vue 组件最流行的方法有以下四种:

Composition 函数
mixin
高阶组件(HOC)
无渲染组件
每一种方法都有其优缺点,根据使用场景,或多或少都有适用的部分。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值