本篇文章给大家谈谈微信蜀山麻将有挂是真的么,以及微信蜀山麻将开挂神器下载对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。 微信小程序里面亲友房打...
2025-07-26 0
一开始写 Vue 的时候,谁不是觉得:“哇,组件好优雅!”三年后再回头一看,组件目录像垃圾堆,维护一处改三处,props 乱飞、事件满天飞,复用全靠 copy paste。于是我终于明白 —— 组件设计,才是 Vue 项目的重灾区 。
很多初学 Vue 的人对“组件化”的理解就是:“页面上出现重复的 UI?好,抽个组件。”
于是你会看到这样的组件:
<template><input :value="value" @input="$emit('update:value', $event.target.value)" /></template> #技术分享
接着你又遇到需要加图标的输入框,于是复制一份:
<template><div class="icon-text-input"><i class="icon" :class="icon" /><input :value="value" @input="$emit('update:value', $event.target.value)" /></div></template>
再后来你需要加验证、loading、tooltip……结果就变成了:
组件爆炸式增长,但每一个都只是“刚好凑合”,共用不了。
比如下面这个场景:
你封装了一个超级复杂的表格组件:
<CustomTable :columns="columns" :data="tableData" :show-expand="true" :enable-pagination="true" :custom-actions="['edit', 'delete']"/>
你美其名曰“通用组件”,但别人拿去一用就发现:
最后大家的做法就是 —— 不用你这套“通用组件”,自己抄一份改改 。
Vue 的单向数据流原则说得很清楚:
父组件通过 props 向下传数据,子组件通过 emit 通知父组件。
但现实是:
举个例子:
<template><PageWrapper><ChildComponent :formData="form" @submit="handleSubmit" /></PageWrapper></template><template><Form :model="formData" /><button @click="$emit('submit', formData)">提交</button></template>
看上去还好?但当 ChildComponent 再包一层 FormWrapper 、再嵌套 InputList ,你就发现:
组件目录看似整齐,但大部分组件都有如下特征:
于是你只能选择 —— 拷贝再新建一个组件,给它加个 V2 后缀,然后老的你也不敢删。
项目后期的结构大概就是:
components/├── Input.vue├── InputV2.vue├── InputWithTooltip.vue├── InputWithValidation.vue├── InputWithValidationV2.vue└── ...
“为了让别人能维护我的代码,我决定不动它。”
我用三年才悟到一个道理:
Vue 组件设计的难点,不是语法、也不是封装,而是你有没有 抽象问题的能力 。
你需要设计一个“搜索区域”组件,包含输入框 + 日期范围 + 搜索按钮。
新手写法:
<SearchHeader :keyword="keyword" :startDate="start" :endDate="end" @search="handleSearch"/>
页面需求一改,换成了下拉框 + 单选框怎么办?又封一个组件?
更好的设计是 —— 提供 slots 插槽 + 作用域插槽 :
<template><div class="search-header"><slot name="form" /><button @click="$emit('search')">搜索</button></div></template><SearchHeader @search="search"><template #form><el-input v-model="keyword" placeholder="请输入关键词" /><el-date-picker v-model="range" type="daterange" /></template></SearchHeader>
把结构交给组件,把行为交给页面。组件不掌控一切,而是协作。
我总结出 3 条简单但有效的建议:
别让一个组件又画 UI 又写逻辑还请求接口。
如果你发现你组件 props 变成这样:
<SuperButton :label="'提交'" :icon="'plus'" :iconPosition="'left'" :styleType="'primary'" :loading="true"/>
那它该用 slot 了:
<SuperButton><template #icon><PlusIcon /></template>提交 </SuperButton>
三年前我以为组件化是 Vue 最简单的部分,三年后我才意识到,它是最深、最难、最容易出坑的部分。
如果你也踩过以下这些坑:
别再让组件成为项目的“技术债”。你们也有遇到吗?
相关文章
本篇文章给大家谈谈微信蜀山麻将有挂是真的么,以及微信蜀山麻将开挂神器下载对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。 微信小程序里面亲友房打...
2025-07-26 0
“凡是敌人反对的,我们就要拥护;凡是敌人拥护的,我们就要反对”,这段经典的毛主席语录至今依然被奉为真理且无处不在。尤其在正式场合中方与美对立之时,中国...
2025-07-26 0
中国商飞是一家专门从事民用飞机及相关产品的设计、制造、销售及服务的大型国有企业。电科数字主要业务涉及行业信息化解决方案、数据中心智能化解决方案、专项服...
2025-07-26 0
金融界2025年7月26日消息,国家知识产权局信息显示,重庆邮电大学、北京海云捷迅科技股份有限公司申请一项名为“基于迁移强化学习的机器人避障方法和装置...
2025-07-26 0
来源:东哥笔记作者:金珊当监管叫停外卖补贴,刘强东选择走一条更重的路。京东要亲自炒菜了。今年6月刘强东曾在媒体分享会上表示,“未来,我们会打造一种与美...
2025-07-26 0
西藏林芝雅鲁藏布江边最近开始修水电站,总投资1.2万亿人民币。这个项目不建大水坝,而是挖隧道引水发电。工程重点不是给西藏自己用,主要是要把发的电卖给南...
2025-07-26 0
最近,济南出现一个自带热搜体质的“白胖子”。 就在前些天,看到这样一条帖子。 中国外交部发言人毛宁在海外平台上发帖,点赞了济南的基坑气膜,在海...
2025-07-26 0
烟台融媒7月26日讯(记者 刘晓阳 通讯员 高欢)7月25日,备受瞩目的盒马鲜生烟台首店在烟台大悦城B1层盛大开业,为烟台商业版图增添了一抹亮丽的色彩...
2025-07-26 0
发表评论