订单业务重构 谈谈大组件的拆分

发布于 2023-10-27 19:37:12 字数 1979 浏览 26 评论 0

最近半年对两个业务系统进行了重构升级,重构前的代码都是几千行的业务逻辑。在做业务迭代的过程中考虑到开发的难度和后续的维护,于是对就有组件进行了重构。经过重构将大文件组件进行拆分,方便了后续的扩展和维护。

业务背景

部门负责的业务中包含一个订单系统,该系统内部包含多种角色,10 余种订单状态,约 30 种订单操作。业务的前端页面由订单列表和订单详情两个主要组件构成,且订单详情页面展示时覆盖在订单列表上,并未使用独立页面。

由于历史原因和不断的迭代,造成页面组件的代码行数几千行,且订单详情组件拥有多种自定义状态。

由于版本迭代,页面 UI 需要进行调整,订单流程需要精简。结合当前的代码状况,于是决定进行重构。

重构过程

1. 针对订单操作进行拆分

将每个操作抽离成单独的就是

function checkValid(){}
function actionHandle(){}

export default {
	label: '订单操作', 
	style: '',
	valid: checkValid,
	handle: actionHandle,
}

将每个操作定义成如上数据结构,存入操作的数组中。然后在列表中直接传入 当前行的数据,执行每个操作的 valid 的方法,过滤出适合当前行数据的操作。
定义好相关的订单操作后,在列表组件中 ,

const actionList = [...]

export default {
	created() {
		actionList.map(action => {
			action.valid = action.valid.bind(this)
			action.handle = action.handle.bind(this)
		})
		this.actionList 
	},
	methods: {
		getValidActionList(order) {
			return this.actionList.filter(action => action.valid(order))
		}
	}
	
}

这一块的逻辑也可以单独放在 mixin 里面,之前有一个业务 列表有两种展示方式,卡片和普通列表。像这种情况我们把操作抽离出来,最后混入到对应的列表和卡片组件中即可。

上述的操作还存在一个问题,就是操作的实际点击事件,很多都会包含视图的变化,弹一些弹窗之类的。

如果按照普通的逻辑,将弹窗定义在 列表组件中,然后再维护弹窗显示的状态,整个列表组件还是臃肿,而且视图和逻辑分离,不利于代码的阅读。

这里我使用了 Vue.extend , 将所有的弹窗组件都封装成函数,将 props 时通过函数参数进行传入,将弹窗完成的操作通过 props 定义的回调函数进行传出。

通过这种代码结构,我们把操作完全抽离,实现了十分合理的解耦

订单详情改造

之前版本的订单详情展示时是覆盖在订单列表上面的,这导致在详情时刷新页面时会展示为订单列表页面,这种实现和业务交互是不太合适的。

订单详情页面之前包含 订单发单, 订单审核,订单详情 逻辑。组件的自定义状态过多,视图展示在不同状态的也有差异。因此整体详情的逻辑还是比较混乱的。

因此在重构时,我将发单,详情,审核的逻辑抽离为单独的组件,通过不同的路由进行分发。对于试图相同的部分抽离为组件。

将这个大组件拆分成各种逻辑的独立组件后,代码可读性高了很多。在平时的业务开发中,我们也应该注意业务组件公用。在视图的重合比例较高且业务逻辑较为简单时,将组件进行公用是 OK 的,更多的时候拆分为独立组件对于后续的维护和迭代好处更大

写在最后

最后终结下大组件的拆分吧。

  1. 可以通过 mixin 和 Vue.extend 对业务逻辑进行抽离
  2. 将多状态组件抽离为多个单状态组件

重构的还是有一定风险的,重构过程中不能一蹴而就。一部分一部分的进行重构,写完之后及时测试,保证业务逻辑的正确。全部开发完成后也需要进行回归测试。业务开发时, 屎山上拉屎 是一种妥协。如果时间允许且对于业务和自己有益处的话,还是推荐重构的。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

雪若未夕

暂无简介

文章
评论
26 人气
更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文