专栏首页前端知否构建Vue.js组件的10个技巧

构建Vue.js组件的10个技巧

1. 组件可以在全局或本地加载

Vue.js提供了两种加载组件的方法:一种在Vue实例全局,另一种在组件级别。两种方法都有其自身的优点。

全局加载组件使其可以从应用程序中的任何模板(包括子组件)访问。它减少了将全局组件导入子组件的次数。

此外,如果全局加载组件,将无法获得Vue注册组件错误--“did you register the component correctly?”。注意,谨慎加载全局组件。它会使您的应用程序膨胀,即使它未被使用,它仍将包含在Webpack构建的初始bundle中。

在本地加载组件使您能够隔离组件并仅在必要时加载它们。与Webpack结合使用时,只有在使用组件时才去延迟加载组件。这使您的初始应用程序文件大小更小,并减少了初始加载时间。

2. 延迟加载/异步组件

使用Webpack的动态导入延迟加载组件。Vue支持在渲染时和代码拆分时延迟加载组件。这些优化允许您的组件代码仅在需要时加载,从而减少您的HTTP请求,文件大小,并自动为您提供性能提升。关于此功能的重要部分是它适用于全局加载和本地加载的组件。

全局加载异步组件:

本地加载异步组件:

3. 必须的属性

有很多方法可以为组件创建props。您可以传递表示prop名称的字符串数组,也可以传入一个带有键作为prop名称和配置对象的对象。

使用基于对象的方法允许您为单个 prop 修改一些配置,比如设置是否 required。required 的值是true 或 false。如果在使用组件时未设置prop,true将抛出错误,false(默认值)表示不是必须的,不抛出错误。

在共享组件给他人或自己使用时,准确使用 required 配置是很好的,表明这个prop很重要。

4. 使用$emit触发自定义事件

子组件和父组件之间的通信可以通过使用组件内置函数 $emit 发出自定义事件来完成。

$ emit函数接收 事件名称的字符串 和 可选的值两个参数。要监听事件,只需将“@eventName”添加到发出事件的组件中(即子组件使用的地方),然后传入事件处理方法。这是保持单一数据流,并使数据从子组件流向父组件的好方法。

5. 从逻辑上分解组件

说起来容易做起来难,如何根据一个逻辑来划分一个组件?

分解组件的第一种方法是基于数据变化。如果数据在组件的一个部分中不断变化,而在其他部分中不变,那么变化的组件那部分应该单独抽取出来作为独立组件。

原因是如果您的数据/HTML在模板的一个部分中不断变化,则需要检查和更新整个组件。但是,如果将变化的HTML放入其自己的组件中,并使用props传入数据,则只有该组件在其props更改时才会更新。

从逻辑上分解组件的另一种方法是可重用性。如果您拥有在整个应用程序中重复使用的HTML,图形或功能,如按钮,复选框,徽标动画,号召性用语或具有简单更改文本的图形 - 这将是一个很好的候选,抽取到一个新的组件,可以被重用。可重用组件具有易于维护的隐藏优势,因为您只需要更改一个组件,而不必在代码库中找到替换和更改多个地方。

6. 验证您的props

不使用字符串数组来定义props,而是使用允许配置每个prop的对象。两种非常有用的配置项目是“类型”和验证器。

使用类型参数,Vue将自动键入检查您的prop值。例如,如果我们期望一个Number prop但收到一个String,你会在控制台中收到类似这样的警告:

[Vue warn]: Invalid prop: type check failed for prop “count”. Expected Number

对于更复杂的验证,我们可以将函数传递给validator属性,该属性接收 prop值 作为参数并返回true或false。这非常强大,因为它允许我们针对传递给该特定属性的值编写自定义验证。

7. 多个props绑定和覆盖

如果你的组件有多个props,比如说5,6,7或更多,那么连续设置每个prop的绑定可能会变得很繁琐。幸运的是,有一种快速方法可以为组件上的所有属性设置绑定,这就是通过使用v-bind绑定对象而不是单个属性。

使用对象绑定的另一个好处是可以覆盖对象的任何绑定。

在我们的例子中,如果我们在 person 对象中将 isActive 设置为false,那么我们可以对实际person 组件执行另一个绑定,并将 isActive 设置为true而不覆盖原始对象。

8. 修改组件中的props

在某些情况下,您可能希望修改从prop传入的值。但是,这样做会给你一个警告“Avoid mutating a prop directly”,不让直接修改属性。而是使用prop值作为本地数据属性的默认值。这样做将使您能够查看原始值,但修改本地数据不会更改prop值。

有一个好处。使用此方法,您的本地数据属性不会对prop值产生影响,因此对父组件的prop值的任何更改都不会更新您的本地值。但是,如果您确实需要这些更新,则可以使用计算属性组合值。

9. 测试工具中 Mount vs Shallow Mount

在Vue测试工具中有两种方法可以创建和启动组件。一个是mount,另一个是shallow mount。两者都有自己的优点和缺点。

当您想要在组件及其子组件之间进行相互依赖的测试时,mout技术非常有效。允许您测试父组件是否按预期正确地与其子组件交互。相反,正如其名称所暗示的那样,shallow mount技术实例化并仅渲染父组件,而完全隔离而忽略其任何子组件。也就是说,mount会渲染所有父子组件,shallow mount仅仅渲染父组件。因为有时候只需要测试父组件的一些特性。

那么哪种方法更好?随你(由你决定。您选择的策略应取决于您可衡量的目标。试图通过完全隔离来自行测试组件,shallow mount方法效果很好。需要处理具有要确保通信的子组件的组件,那就使用mount。一个很好的选择是同时使用它们。不局限于一个混合搭配,以满足您的测试需求。

10. Vue-CLI的力量

Vue CLI 是一个功能强大的命令行界面,允许开发人员快速利用大量可以加快工作流程的功能。

一个我使用很多的功能是,运行 vue serve,后边跟上一个Vue组件的路径。这样做的好处在于,您可以完全开发一个独立的组件,同时也可以对组件进行热重新加载和迭代,无需临时将新组件导入页面进行开发。

在团队工作时,您可能需要提取一个特定组件并与其他组人共享。这就引出了 Vue CLI 的下一个功能:将Vue组件导出为库的能力。调用时,Vue将自动构建单个文件组件,将CSS移动到外部CSS文件(可选,您也可以内联),以及创建 UMD 和 Common .js文件以导入到其他JS项目中。

本文分享自微信公众号 - 前端知否(qianduanzhifou),作者:QETHAN

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-09-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如何使用Vue.js渲染JSON中定义的动态组件

    json数据content里边有个body数组,每个元素中都有一个component的字段,这个字段决定了使用哪个组件去渲染。

    前端知否
  • 使用React Hooks进行状态管理 - 无Redux和Context API

    现在,我们将探索和开发一个自定义Hook来管理全局状态 - 比Redux更容易使用的方法,并且比Context API更高效。

    前端知否
  • 以编程方式创建Vue.js组件实例

    最近参与了一个Vue.js项目,项目中需要能够以编程方式创建组件。通过编程,意思是使用JavaScript创建和插入组件,而无需在模板中编写任何内容。

    前端知否
  • Vue一个案例引发的动态组件与全局事件绑定总结

    最近在自学 Vue 也了解了一些基本用法,也记录了一些笔记有兴趣的朋友可以去查看我的其他文章,技术这东西真的不能光靠看,看是没有的,你必须要动手实践,只有在实战...

    六小登登
  • 系统架构师论文-基于构件的软件开发(在线学习支持服务平台)

    基于构件的软件开发是提高软件生产效率和软件产品质量的有效途径,本文结合我们的实践,以“在线学习支持服务平台"项目为例,讨论了基于构件的软件开发的技术的应用。由于...

    cwl_java
  • 浅入深出Vue:子组件与数据传递

    上一篇了解了组件的概念及在使用中需要注意的地方。在面对单个组件逻辑复杂需要拆分时,难免会遇到父子组件之间数据传递的问题。那么我们来了解一下在父子组件之间进行数据...

    若羽
  • 先行者计划群视频 每周一课 -- 什么是前端组件?(文字简版)

    image.png 在今天同学们发我的作业中,我给一个同学回复说,你这不是组件化,只是一个效果的实现。他问我,那还要什么呢?我不是特别理解。 今天咱们先聊一下,...

    web前端教室
  • 【腾讯轻舟Raft】后台组件的治理思路

    | 导语 腾讯轻舟平台(RAFT,Rapid Application Framework of Tencent)是一个致力于组件治理,为创新型应用提供“端云一...

    腾讯大讲堂
  • 如何搭建一个完美的组件库?

    如何做一个组件库?本篇文章不会讲一个小的组件如何设计,而是会整体讲一个“逼近完美”的组件库是怎么设计的。

    lucifer210
  • 你不可不知道的React生命周期

    咱今天聊的话题是React生命周期,灵感来自于最近在网上发现一篇关于react生命周期的文章,里面记录的知识点竟然与小编所get到的有出入。作为一名集正义、智慧...

    ConardLi

扫码关注云+社区

领取腾讯云代金券