首页 > 其他分享 >记录--9个封装Vue组件的小技巧

记录--9个封装Vue组件的小技巧

时间:2023-05-12 17:55:38浏览次数:36  
标签:Vue 封装 item -- 应用程序 一个 UI props 组件

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助

组件是前端框架的基本构建块。把它们设计得更好会使我们的应用程序更容易改变和理解。在这节课中,分享一下在过去几年中工作中学到的 9 个技巧。

1. 你可能不需要创建一个组件

在创建一个组件之前,看看它是为了可重用性和为某些UI添加一个状态,还是仅仅为了组织和划分代码。

如果是后者,那么你就不需要创建它,因为它只会增加更多不必要的工作,比如传递props和发射事件。

不仅如此,它还要求我们跳转到该文件以查看它所包含的内容,而不是直接在父组件中看到它,这就干净多了。

2. 使用插槽而不是 prop 来显示内容

假设有一个可重复使用的按钮组件,它通过props获取文本。

<BaseButton label="Delete Item"/>

如果想在其中显示一个图标,必须添加更多的道具,如<BaseButton label="Delete Item" icon="delete" />并更新组件以显示该图标。

但有了插槽,我们就可以在每次使用该组件时,以想要的方式显示标签:

<BaseButton>
  Delete Item <Icon name="delete" />
</BaseButton>

或者你只需要把某个单词加粗。对于插槽,可以直接在文本中使用<strong>标记,而不是在组件中解析它。

3. 将该组件与触发它的因素分组

有时有两个独立的组件在某种情况下一起使用。最好把它们放在一个新的组件中,这样重复使用和移动它们更容易。

一个常见的例子是 Modal 组件。我们通常在点击一个特定的按钮时显示Modal。与其在每次我们想重用它(或把它移到其他地方)时添加showModal状态和导入modal与它的按钮,不如有一个单一的组件来显示按钮,当用户点击时,它显示相关的modal。

<!-- CreateItemButton.vue -->
<template>
  <Modal v-if="showModal" @close="showModal = false" />
  <BaseButton @click="showModal = true">
    Create Item
  </BaseButton>
</template>

<script setup>
const showModal = false
</script>

4. 使用 teleport,从任何地方显示固定位置的元素

继续前面的例子,如果我们想正确地显示 modal ,我们需要确保模态使用正确的z-index,并且它在HTML代码中显示在正确的位置,所以它总是显示在页面上所有东西的上面。

我们可以通过直接将 modal 显示为<body>元素的一个子元素来轻松地避免这个问题,无论我们在组件结构中使用它。

Teleport组件使我们能够做到这一点。

我们所要做的就是用 <Teleport to="body"> 来包装 modal 组件。

<!-- BaseModal.vue -->
<template>
  <Teleport to="body">
    <div class="modal"></div>
  </Teleport>
</template>

这个组件是Vue 3内置组件的一部分。如果你使用的是Vue 2,请查看PortalVue

5. 在一个对象中分组相关的 props

组件的 prop 列表是组件界面的一个主要部分。接口越清晰,就越容易使用和推理。

改进 prop 列表的一个方法是将相关的属性分组在一起。以这个组件为例:

<PostCard
  :title="post.title"
  :date="post.date"
  :layout="currentLayout"
  :image="post.imageUrl"
  <!-- more props -->
/>
我们需要花几秒钟时间来了解这里有哪些 props 与帖子(post )相关。但我们可以像这样把与帖子相关的 props 分组,使之更加清晰。
<PostCard :post="post" :layout="currentLayout" />

所以现在我们很快就知道,layout 不是 post 数据的一部分。

不仅如此,我们还通过这种方法使更新 props 变得更加容易。例如,添加或删除与帖子相关的props ,不需要我们更新组件的 props 列表。

6. 赋予每个循环item,赋予自己的状态

创建一个新的组件的一个很好的理由是给一块用户界面提供它自己的状态。我们需要这样做的一个常见的地方是在v-for循环中:

<template>
  <div>
    <div v-for="(item, index) in items" :key="item.id">
      <input type="checkbox" v-model="checkedItems[index]">
    </div>
  </div>
</template>
<script setup>
const checkedItems = ref(items.map(item => item.checked))
</script>

为了跟踪检查过的 items,我们不得不创建一个数组,并用 items 的初始值来填充它。但是这段代码还不够强大。为了让它变得更好,我们必须让 items 通过它们的id而不是index 来访问,因为 index 是不可靠的,可以改变。例如,如果你添加一个支持通过拖放来重新排列items 的功能呢?

为了简化这段代码,我们可以引入一个新的组件,为每个 item 保存一个状态。像这样:

<template>
  <div>
    <Item v-for="item in items" :key="item.id" :item="item" />
  </div>
</template>
Item 组件内容如下:
<template>
  <div>
    <input type="checkbox" v-model="checked">
  </div>
</template>

<script setup>
const props = defineProps({ item: Object })
const checked = ref(props.item.checked)
</script>

这种方法的另一个好处是,我们把所有 item 的相关数据、计算属性和方法都加在一个地方,便于理解和改变。

7. 尽可能地将加载数据移至其用户界面附近

无论你是用GraphQL还是其他API加载,最好把代码放在尽可能接近使用它的用户界面的地方。这有两个原因:

  1. 移动带有数据的UI组件变得更加容易。只需移动该组件,而无需寻找其依赖关系。

  2. 当所有的碎片被放在一个地方时,总是更容易理解代码--可以看到用户界面和它的数据来自哪里。

有时,有多个组件使用同一个获取的数据。在这种情况下,可以将获取的代码上移一级。因此,会有一个父组件,在那里获取数据,还有一个子组件,然后把数据传递给它。

但一定要确保它是一个单一的层次。如果不是,那就寻找一种方法来改进你的组件设计和它们之间的关系。

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

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

 

标签:Vue,封装,item,--,应用程序,一个,UI,props,组件
From: https://www.cnblogs.com/smileZAZ/p/17395927.html

相关文章

  • collection.abc模块下的抽象基类UML类图说明
    说明Iterable、Container和Sized每个容器都应该继承这三个抽象基类,或者实现兼容的协议。Iterable通过__iter__方法支持迭代,Container通过__contains__方法支持in运算符,Sized通过__len__方法支持len()函数。Collection这个抽象基类是3.6新增的,自身没有方法,目的是方便子类化I......
  • 不是正经人2023
    记录生活点滴“你写日记吗?”“不写。”“是啊,正经人谁写日记啊,下贱”。确实,小时候的教育是写日记可以提高写作水平,但是,照着镜子看着自己摩擦系数较大的脸,怎么着也不是个秀才样,写的哪门子的日记,装的哪门子的穷酸书生。再说了,高中毕业后,在没有语文作文写作的要求下,自己已经很多年没......
  • seafile配置
    编辑配置文件:vim/opt/seafile/conf/seahub_settings.py以下配置都在这个py文件编辑添加。 配置在线officeEnableOnlyOfficeENABLE_ONLYOFFICE=TrueVERIFY_ONLYOFFICE_CERTIFICATE=FalseONLYOFFICE_APIJS_URL='http://192.168.0.253:8088/web-apps/apps/api/documen......
  • XMind 2022更新,最新修复版XMind 2022下载
    XMindforMac是一款专业的思维导图软件,可以帮助用户更好地组织思维、管理信息、规划项目和解决问题。它提供了丰富的模板和工具,使用户能够创建美观、清晰、易于理解的思维导图。XMindforMac支持多种导图类型,包括思维导图、鱼骨图、组织结构图、流程图、时序图、脑图等,可以满足......
  • gerrit调优
    一、确定配置大小根据gerrit使用的服务器集群的硬件配置来确定大小二、调整gerrit.configreceive.timeout处理传入更改和更新refs和Gerrit更改的超时。sshd.threads处理ssh请求的线程,限制可能的并行克隆/推送的数量httpd.maxThreads处理http克隆/推送请求和审......
  • Python-单引号、双引号和三引号的作用和区别
    (一)、作用 1.单引号:单引号内部为一串字符(str)。 2.双引号:双引号内部为一串字符,双引号内的字符串可以出现单引号(相当于双引号优先级更高),但不能嵌套双引号。 3.三引号:用于换行输出,且缩进会被打印出来。(三引号还可以用来进行块注释)。(二)、共同点python中变......
  • 第一阶段冲刺总结
    本组为37组说的道理队,成员3人,团队开发项目为【基于深度学习的人脸识别会议签到系统】,在第一阶段的冲刺之后,我在小组团队绩效考核中为第三名。在第一阶段的团队开发中,我做出的工作为:通过Androidstudio成功连接了百度智能云平台的接口,使得导出的apk程序可以实现在手机端的人脸识......
  • java可视化开发工具好用不好用?
    java可视化开发工具到底好用不好用?这是不少粉丝朋友经常询问到的一个问题。在数字化发展趋势越发明显的当下,java可视化开发工具可以帮助各中大型企业实现转型升级,它的灵活、简洁、易操作、可视化等功能优势,让很多客户朋友欣慰不已,仿佛寻觅到了市场的发展动向。今天,我们就一起来了......
  • Nessus磁盘空间不足
    目录解决方式错误展示启动或停止Nessus日志目录清理Nessus需要至少有30GB专门分配给这个安装。如果文件系统磁盘空间不足,建议执行以下操作之一解决方式1.增加驱动器大小。2.将Nessus迁移到另一台磁盘空间大于当前系统分配空间的主机。3.删除安装在这台主机上的其他软......
  • [HAOI2018] 字串覆盖
    [HAOI2018]字串覆盖题目描述小C对字符串颇有研究,他觉得传统的字符串匹配太无聊了,于是他想到了这样一个问题.对于两个长度为n的串A,B,小C每次会给出给出4个参数s,t,l,r.令A从s到t的子串(从1开始标号)为T,令B从l到r的子串为P.然后他会进行下面的操作:如果T的某个子串与P相......