环球要闻:记录--9个封装Vue组件的小技巧
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助
组件是前端框架的基本构建块。把它们设计得更好会使我们的应用程序更容易改变和理解。在这节课中,分享一下在过去几年中工作中学到的 9 个技巧。
【资料图】
1. 你可能不需要创建一个组件
在创建一个组件之前,看看它是为了可重用性和为某些UI添加一个状态,还是仅仅为了组织和划分代码。
如果是后者,那么你就不需要创建它,因为它只会增加更多不必要的工作,比如传递props
和发射事件。
不仅如此,它还要求我们跳转到该文件以查看它所包含的内容,而不是直接在父组件中看到它,这就干净多了。
2. 使用插槽而不是 prop 来显示内容
假设有一个可重复使用的按钮组件,它通过props
获取文本。
如果想在其中显示一个图标,必须添加更多的道具,如
并更新组件以显示该图标。
但有了插槽,我们就可以在每次使用该组件时,以想要的方式显示标签:
Delete Item
或者你只需要把某个单词加粗。对于插槽,可以直接在文本中使用标记,而不是在组件中解析它。
3. 将该组件与触发它的因素分组
有时有两个独立的组件在某种情况下一起使用。最好把它们放在一个新的组件中,这样重复使用和移动它们更容易。
一个常见的例子是 Modal
组件。我们通常在点击一个特定的按钮时显示Modal
。与其在每次我们想重用它(或把它移到其他地方)时添加showModal
状态和导入modal与它的按钮,不如有一个单一的组件来显示按钮,当用户点击时,它显示相关的modal。
Create Item <script setup>const showModal = false</script>
4. 使用 teleport,从任何地方显示固定位置的元素
继续前面的例子,如果我们想正确地显示 modal ,我们需要确保模态使用正确的z-index
,并且它在HTML代码中显示在正确的位置,所以它总是显示在页面上所有东西的上面。
我们可以通过直接将 modal 显示为元素的一个子元素来轻松地避免这个问题,无论我们在组件结构中使用它。
Teleport组件使我们能够做到这一点。
我们所要做的就是用
来包装 modal 组件。
这个组件是Vue 3内置组件的一部分。如果你使用的是Vue 2,请查看PortalVue。
5. 在一个对象中分组相关的 props
组件的 prop 列表是组件界面的一个主要部分。接口越清晰,就越容易使用和推理。
改进 prop
列表的一个方法是将相关的属性分组在一起。以这个组件为例:
我们需要花几秒钟时间来了解这里有哪些/>
props
与帖子(post )相关。但我们可以像这样把与帖子相关的props
分组,使之更加清晰。所以现在我们很快就知道,layout
不是 post
数据的一部分。
不仅如此,我们还通过这种方法使更新 props
变得更加容易。例如,添加或删除与帖子相关的props
,不需要我们更新组件的 props
列表。
6. 赋予每个循环item,赋予自己的状态
创建一个新的组件的一个很好的理由是给一块用户界面提供它自己的状态。我们需要这样做的一个常见的地方是在v-for
循环中:
<script setup>const checkedItems = ref(items.map(item => item.checked))</script>
为了跟踪检查过的 items
,我们不得不创建一个数组,并用 items
的初始值来填充它。但是这段代码还不够强大。为了让它变得更好,我们必须让 items
通过它们的id
而不是index
来访问,因为 index
是不可靠的,可以改变。例如,如果你添加一个支持通过拖放来重新排列items 的功能呢?
为了简化这段代码,我们可以引入一个新的组件,为每个 item
保存一个状态。像这样:
Item
组件内容如下:<script setup>const props = defineProps({ item: Object })const checked = ref(props.item.checked)</script>
这种方法的另一个好处是,我们把所有 item 的相关数据、计算属性和方法都加在一个地方,便于理解和改变。
7. 尽可能地将加载数据移至其用户界面附近
无论你是用GraphQL还是其他API加载,最好把代码放在尽可能接近使用它的用户界面的地方。这有两个原因:
移动带有数据的UI组件变得更加容易。只需移动该组件,而无需寻找其依赖关系。
当所有的碎片被放在一个地方时,总是更容易理解代码--可以看到用户界面和它的数据来自哪里。
有时,有多个组件使用同一个获取的数据。在这种情况下,可以将获取的代码上移一级。因此,会有一个父组件,在那里获取数据,还有一个子组件,然后把数据传递给它。
但一定要确保它是一个单一的层次。如果不是,那就寻找一种方法来改进你的组件设计和它们之间的关系。
8. 纯粹的UI组件不应访问应用程序的状态
有两种类型的前端组件:纯UI组件和特定应用组件。
纯粹的UI组件是像按钮、输入框等。它们不应该知道关于应用程序的任何事情。它们的工作仅仅是为了显示UI--它们通过 props 获取数据。
特定于应用程序的组件是知道应用程序状态的组件,无论是本地状态还是全局状态(通过状态管理库,如Pinia)。
分离这些组件使得在应用程序的其他地方,甚至在其他应用程序中重用UI组件更加容易。
如果你正在构建自己的UI组件,这个技巧也适用。如果你使用的是外部库,如 Vuetify
或Quasar,那么你就不必担心这个问题--这些组件在设计时就考虑到了这一点。
9. 不要在组件中指定 width 或 margin
当创建一个组件时,你应该把它看作是一块UI,可以像其他本地元素一样使用。
让用户指定组件周围的空间是实现这一目标的好方法。
假设你的组件在其根元素上有一个顶部边距,而用户想把它显示在某个元素下面,但没有顶部边距。要做到这一点,用户必须设置一个与组件的margin
相同的负margin
,比如margin-top: -50px;
更不用说在某些情况下,用户必须与选择器的特异性相匹配(或者可能使用!important
)。
而宽度也是如此。如果用户想让该组件具有响应性,他们必须覆盖其宽度和最大宽度。
因此,通过不在组件内部设置宽度和边距,总是给用户这种控制是有意义的。
代码部署后可能存在的BUG没法实时知道,事后为了解决这些BUG,花了大量的时间进行log 调试,这边顺便给大家推荐一个好用的BUG监控工具 Fundebug。
来源:tahazsh.com/blog/vue-co…
本文转载于:
https://juejin.cn/post/7158969880362876964
如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。
标签:
推荐文章
- 环球要闻:记录--9个封装Vue组件的小技巧
- 以“练”筑防,新都区泰兴中学师生临“震”不慌
- 北京西城区2023年中小学名单、学区划片公布
- 今日关注:你一个我一个,罚款攒攒就能齐!黑龙江冰城已备足鼠标垫库存
- 阿里指数在线查询(阿里指数可以查询到哪些内容简介介绍) 全球播资讯
- 天天报道:市场监管总局拟进一步规范公平竞争审查工作
- 防灾减灾 真火轮训
- 当前快讯:深圳科技公司创业补贴和大学生在深圳创业补贴政策
- 涛涛车业:公司国内市场开拓按计划在逐步落实和进行当中
- 浙江一高校利用无人机担任防诈骗“宣传大使” 环球聚看点
- 今日精选:海泰科:公司产品出口主要以欧洲、北美和泰国地区为主
- 2023年5月11日美金兑换新西兰币汇率是多少?
- 怡达股份(300721)5月11日主力资金净买入301.63万元 今日热议
- 中汽协专家:限制“老头乐”很正确 微型电动车可替代
- 焦点热讯:5月11日A股分析:创业板指涨0.63%,传媒股掀涨停潮
- 协定、通知存款自律上限将迎调整 有银行已开会研究 业内:减少存款定价无序竞争 中小行相关存款利率料将普遍降低-全球热文
- Angelababy字体成反面教材,跟盛世美颜形成鲜明对比,遭网友吐槽-环球快资讯
- 中甲第4轮延边龙鼎战平无锡吴钩遭遇三连平
- 环球简讯:图南是什么意思_图南
- Mysteel午报:钢价弱势下跌,黑色期货飘绿
- 非法改装直放站干扰手机信号 北京移动以AI和大数据“智慧净网” 全球视讯
- 西安养老院——未来的路
- 焦点热文:精神出轨和身体出轨的区别是什么? 精神出轨和肉体出轨
- 亚洲举重锦标赛,中国选手改写3项世界纪录! 环球快播报
- 观热点:一字之师打一字是什么字 一字之师打一字
- 挂雷克萨斯标的“大汉兰达”!配2.4T混动 剑指宝马X5?_当前时讯
- 浙商银行“一行一校”结对帮扶走进凌云弄谷小学 最新
- 每日关注!头孢拉定胶囊是第几代头孢菌素_头孢拉定胶囊属于第几代头孢
- 德新科技(603032)5月10日主力资金净买入9.13万元|全球热消息
- 【焦点热闻】情侣牵手图片真实照片车上(情侣牵手图片真实照片)
- 环球快报:标普500指数初步收涨0.4%
- 亿纬锂能1285.88万欧元赴匈牙利购地 加快产能扩张总资产两年激增逾2倍
- 天天视点!G5:科尔敢不敢信维金斯一次,最后一次执教库汤追?首发再变?
- 华声漫评:朋友圈并非“广告圈”,员工考核理应存在“边界感”-当前头条
- 竣工图章尺寸为多少毫米_竣工图章尺寸 天天要闻
- 参茸鹿鞭丸多少钱一盒啊_参茸鹿鞭丸多少钱一盒-全球快消息
- 中山福彩5月10日起公开征召20个销售场所
- 利元亨(688499.SH):将继续推进扩大产能的规划,加快设备交付和验收节奏
- 2023武汉科技大学工程训练中心招聘编外专技岗2人
- 天天百事通!北交所龙虎榜|中纺标今日成交4692.39万元,换手率达35.09%
- 全球热点评!搭好“评议台” 评出“好乡风”
- 韩民调:过半韩国人主张日本先就历史问题道歉,再改善关系 世界快看点
- 上海的留学机构-视讯
- 家常的人参炖鸡,怎么做?简单一点的做法?
- 沪深两市成交额连续第24个交易日突破1万亿元
- 【全球速看料】北京市京北机动车检测场5月11日上午暂停办理业务
- 荷塘区教育局到市十九中督查工作 全球热讯
- 天天热消息:在劳动中思考、在劳动中感恩,在京高校将爱劳动的种子深埋青年学子心中
- 厦门鼓浪屿元宇宙首期产品即将上线_环球观速讯
- 业内预计:今年世界旅游将恢复至2019年的80%至95%
- LPL两位选手走出电竞圈,参加跑男节目录制,和一线明星互动|每日信息
- 环球音乐怀疑有人用机器人刷量,Spotify 删除数万首 AI 歌曲
- 光晕2修改器怎么用不了_光晕2修改器
- 种牙“自由”之后,牙该怎么种?
X 关闭
最新资讯
- 今天最新消息 中国农业银行:董事长谷澍代为履行行长职责_当前视讯
- “养老驿站”助乡村老人乐享晚年 每日热闻
- 乌反攻还没开始,英外相泼冷水:现实世界不是好莱坞电影
- 环球视讯!四川新闻联播丨抢抓农时 各地大春生产有序推进
- 湖北部署打击破坏林业资源专项行动 快播报
- 万亿城市A股竞速:合肥超武汉,东莞西安追青岛,谁掉队了 全球焦点
- 【读财报】TOP50房企年报:业绩承压 系销售下滑、资产减值、汇兑损失三重因素拖累 环球热文
- 统筹规划整体推进 打造富民兴业特色乡村旅游品牌_环球精选
- 硅油成分洗发水_硅油成分
- 双屏应用体验再进化 华硕灵耀X 双屏Pro 2023评测
- 焦点短讯!融化英雄好玩吗 融化英雄玩法简介
- 流动的书籍、共享的空间 长沙这家书店将阅读融入生活
- 全球实时:国乒用人墨守成规?王皓被刘国梁委以重任,压力大于马琳有苦难言
- 哈弗二代大狗四驱版实拍!换发动机+专属Logo-百事通
- 4月中国纺织服装出口同比继续保持增长
- 当前速讯:快穿无限高考
- 景德镇联姻磁州窑 产学研基地传承创新千年窑火
- 秘制葫芦扣肉、福袋豆腐、清酒卤水低温鲍-全球实时
- 环球观天下!肿瘤诊治进入“整合”时代
- 西安理工技师学院怎么样啊铁道是正规校吗
- w10调烟雾头盔最新调法_w10怎么调烟雾头
- 青岛西海岸杨家山里樱桃采摘节有哪些活动看点?|环球热点评
- 【环球新要闻】安徽宁国:畲乡风情醉八方
- 北京叶子医疗美容医院好不好
- 从国家实验室的核心能力构成看美国科研的顶层布局|短讯
- 中国动漫博物馆闭馆时间
- 地暖循环泵价格多安装少钱一台 地暖循环泵价格
- 辽宁大学广告学怎么样就业几本
- 5月9日 13:55分 上海凤凰(600679)股价快速拉升
- 2023佛山潭洲家博会免费门票领取入口+流程
- 昆明强化调度全力抗旱保供水 世界快资讯
- 海关总署:前4个月我国出口机电产品4.44万亿元 同比增长10.5%-环球短讯
- 当前时讯:建制镇是什么意思?_建制镇是什么意思
- 马路边边被曝回收顾客吃剩食材再利用 天天观焦点
- 港股概念追踪 | 新一代试管婴儿技术发布 可使中国每年多生10万婴儿 辅助生殖市场空间广阔(附概念股) 头条
- 阿里云宣布推出“金融级云原生” 提出金融机构“新型IT架构”
- 跨月专票作废怎么处理操作步骤发票红字冲销步骤_跨月红字发票冲销步骤是怎样的
- 门槛降低4万元!新款丰田MPV售31.58万起 这价格杀疯了!_世界焦点
- 世界即时:炖羊肉怎么去除膻气味
- 银河证券:部分采购需求仍有望释放 煤价预计维持稳定-环球播资讯
- 海军山东舰航母编队圆满完成远海战备训练 今日最新
- 建议买SD卡!《塞尔达传说:王国之泪》容量达16.3GB
- 通化东宝: 围绕内分泌治疗领域加速创新转型
- 【环球播资讯】综合续航1120km 亏电油耗4.95L/100km 深蓝S7增程版动力参数公布
- 土豆粉的做法 家常_土豆粉的做法-世界百事通
- 科贝:今夏7人合同到期,皇马将努力续约除马里亚诺外的6人 焦点速看
- 扫货热情高涨!全球央妈一季度黄金购买量创历史同期新高 全球观点
- 每日速看!飞龙股份:公司热管理产品会用到汽车芯片
- 天天热点评!中加基金:内需逐步成为经济增长主要驱动力
- 中消协:一季度全国消协组织投诉解决率达78.41%
X 关闭