12 种使用 Vue 的最佳做法
2020/3/16 11:01:18
本文主要是介绍12 种使用 Vue 的最佳做法,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
作者:Matt Maribojoc 译者:前端小智 来源:medium
点赞再看,养成习惯
本文
GitHub
github.com/qq449245884… 上已经收录,更多往期高赞文章的分类,也整理了很多我的文档,和教程资料。欢迎Star和完善,大家面试可以参照考点复习,希望我们一起有点东西。
随着 VueJS 的使用越来越广泛,出现了几种最佳实践并逐渐成为标准。在本文中,主要分享在平时开发中一些有用资源和技巧,废话少说,我们开始吧。
1.始终在 v-for
中使用 :key
在需要操纵数据时,将key
属性与v-for
指令一起使用可以让程序保持恒定且可预测。
这是很有必要的,这样Vue就可以跟踪组件状态,并对不同的元素有一个常量引用。在使用动画或Vue转换时,key 非常有用。
如果没有key
,Vue只会尝试使DOM尽可能高效。 这可能意味着v-for
中的元素可能会出现乱序,或者它们的行为难以预测。 如果我们对每个元素都有唯一的键引用,那么我们可以更好地预测Vue
应用程序将如何精确地处理DOM
操作。
<!-- 不好的做法--> <div v-for='product in products'> </div> <!-- 好的做法 --> <div v-for='product in products' :key='product.id'> 复制代码
在事件中使用短横线命名
在发出定制事件时,最好使用短横线命名,这是因为在父组件中,我们使用相同的语法来侦听该事件。
因此,为了确保我们各组件之间的一致性,并使您的代码更具可读性,请在两个地方都坚持使用短横线命名。
this.$emit('close-window') // 在父组件中 <popup-window @close-window='handleEvent()' /> 复制代码
3.使用驼峰式声明 props,并在模板中使用短横线命名来访问 props
最佳做法只是遵循每种语言的约定。 在 JS 中,驼峰式声明是标准,在HTML中,是短横线命名。 因此,我们相应地使用它们。
幸运的是,Vue 已经提供了驼峰式声明和短横线命名之间转换,因此除了实际声明它们之外,我们不必担心任何事情。
// 不好的做法 <PopupWindow titleText='hello world' /> props: { 'title-text': String } // 好的做法 <PopupWindow title-text='hello world' /> props: { titleText: String } 复制代码
4.data 应始终返回一个函数
声明组件data
时,data
选项应始终返回一个函数。 如果返回的是一个对象,那么该data
将在组件的所有实例之间共享。
// 不好的做法 data: { name: 'My Window', articles: [] } 复制代码
但是,大多数情况下,我们的目标是构建可重用的组件,因此我们希望每个组件返回一个惟一的对象。我们通过在函数中返回数据对象来实现这一点。
// 好的做法 data () { return { name: 'My Window', articles: [] } } 复制代码
5. 不要在同个元素上同时使用v-if
和v-for
指令
为了过滤数组中的元素,我们很容易将v-if
与v-for
在同个元素同时使用。
// 不好的做法 <div v-for='product in products' v-if='product.price < 500'> 复制代码
问题是在 Vue 优先使用v-for
指令,而不是v-if
指令。它循环遍历每个元素,然后检查v-if
条件。
this.products.map(function (product) { if (product.price < 500) { return product } }) 复制代码
这意味着,即使我们只想渲染列表中的几个元素,也必须遍历整个数组。
这对我们来当然没有任何好处。
一个更聪明的解决方案是遍历一个计算属性,可以把上面的例子重构成下面这样的:
<div v-for='product in cheapProducts'> computed: { cheapProducts: () => { return this.products.filter(function (product) { return product.price < 100 }) } } 复制代码
这么做有几个好处:
-
渲染效率更高,因为我们不会遍历所有元素
-
仅当依赖项更改时,才会重使用过滤后的列表
-
这写法有助于将组件逻辑从模板中分离出来,使组件更具可读性
6.用正确的定义验证我们的 props
可以这条是很重要,为什么?
在设计大型项目时,很容易忘记用于props的确切格式、类型和其他约定。如果你在一个更大的开发团队中,你的同事不会读心术,所以你要清楚地告诉他们如何使用你的组件。
因此,我们只需编写props验证即可,不必费力地跟踪组件来确定props的格式
从Vue文档中查看此示例。
props: { status: { type: String, required: true, validator: function (value) { return [ 'syncing', 'synced', 'version-conflict', 'error' ].indexOf(value) !== -1 } } } 复制代码
7.组件全名使用驼峰或或者短横线
组件的通用命名约定是使用驼峰或短横线。无论我们使用哪咱,最重要的是始终保持一致。我认为驼峰方式 效果最好,因为大多数IDE自动完成功能都支持它。
# 不好的做法 mycomponent.vue myComponent.vue Mycomponent.vue # 好做法 MyComponent.vue 复制代码
8. 基本组件应该相应地加上前缀
根据Vue样式指南,基本组件是仅包含以下内容的组件:
- HTML 元素
- 额外的基础组件
- 第三方的UI组件
为这些组件命名的最佳实践是为它们提供前缀Base
、V
或App
。同样,只要我们在整个项目中保持一致,可以使用其中任何一种。
BaseButton.vue BaseIcon.vue BaseHeading.vue 复制代码
该命名约定的目的是使基本组件按字母顺序分组在文件系统中。 另外,通过使用webpack导入功能,我们可以搜索与命名约定模式匹配的组件,并将所有组件自动导入为Vue项目中的全局变量。
单实例组件命名应该带有前缀 The
与基本组件类似,单实例组件(每个页面使用一次,不接受任何prop)应该有自己的命名约定。这些组件特定于我们的应用,通常是 footer
,header
或sider
。
该组件只能有一个激活实例。
TheHeader.vue TheFooter.vue TheSidebar.vue ThePopup.vue 复制代码
10.保持指令简写的一致性
在Vue开发人员中,一种常见的技术是使用指令的简写。例如:
@
是v-on
的简写:
是v-bind
的简写#
是v-slot
的简写
在你的Vue项目中使用这些缩写是很好的。但是要在整个项目中创建某种约定,总是使用它们或从不使用它们,会使我们的项目更具内聚性和可读性。
11.不要在“created”和“watch”中调用方法
Vue开发人员经常犯的一个错误是他们不必要地在created
和watch
中调用方法。 其背后的想法是,我们希望在组件初始化后立即运行watch
。
// 不好的做法 created: () { this.handleChange() }, methods: { handleChange() { // stuff happens } }, watch () { property() { this.handleChange() } }
但是,Vue为此提供了内置的解决方案,这是我们经常忘记的Vue watch
属性。
我们要做的就是稍微重组watch
并声明两个属性:
1.handler (newVal, oldVal)-
这是我们的watch方法本身。
2. immediate: true
- 代表如果在 wacth 里声明了之后,就会立即先去执行里面的handler
方法,如果为 false
就跟我们以前的效果一样,不会在绑定的时候就执行
// 好的做法 methods: { handleChange() { // stuff happens } }, watch () { property { immediate: true handler() { this.handleChange() } } } 复制代码
12. 模板表达式应该只有基本的 JS 表达式
在模板中添加尽可能多的内联功能是很自然的。但是这使得我们的模板不那么具有声明性,而且更加复杂,也让模板会变得非常混乱。
为此,让我们看看Vue样式指南中另一个规范化字符串的示例,看看它有多混乱。
//不好的做法 {{ fullName.split(' ').map(function (word) { return word[0].toUpperCase() + word.slice(1) }).join(' ') }} 复制代码
基本上,我们希望模板中的所有内容都直观明了。 为了保持这一点,我们应该将复杂的表达式重构为适当命名的组件选项。
分离复杂表达式的另一个好处是可以重用这些值。
// 好的做法 {{ normalizedFullName }} // The complex expression has been moved to a computed property computed: { normalizedFullName: function () { return this.fullName.split(' ').map(function (word) { return word[0].toUpperCase() + word.slice(1) }).join(' ') } } 复制代码
总结
这是12个最常见的最佳实践,它们将使我们的Vue代码更易于维护、可读性更好、更专业。希望这些技巧对您有用(因为它们绝对是我一直想记住的东西)。
代码部署后可能存在的BUG没法实时知道,事后为了解决这些BUG,花了大量的时间进行log 调试,这边顺便给大家推荐一个好用的BUG监控工具 Fundebug。
交流
文章每周持续更新,可以微信搜索「 大迁世界 」第一时间阅读和催更(比博客早一到两篇哟),本文 GitHub github.com/qq449245884… 已经收录,整理了很多我的文档,欢迎Star和完善,大家面试可以参照考点复习,另外关注公众号,后台回复福利,即可看到福利,你懂的。
这篇关于12 种使用 Vue 的最佳做法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-10-04package.json 文件位置在哪?-icode9专业技术文章分享
- 2024-10-01Craco.js学习:从入门到实践指南
- 2024-10-01Create-React-App学习:入门与实践指南
- 2024-10-01CSS-in-JS学习:从入门到实践指南
- 2024-09-30JSX语法学习:从入门到初步掌握
- 2024-09-30Mock.js学习:入门教程与实战演练
- 2024-09-30React Hooks学习:从入门到实践
- 2024-09-30受控组件学习:React中的基础入门教程
- 2024-09-29JS定时器教程:初学者必看指南
- 2024-09-29JS对象教程:初学者的全面指南