12 种使用Vue 的最佳做法


Posted in Javascript onMarch 30, 2020

作者:Matt Maribojoc 译者:前端小智 来源:medium

随着 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'>

2.在事件中使用短横线命名

在发出定制事件时,最好使用短横线命名,这是因为在父组件中,我们使用相同的语法来侦听该事件。

因此,为了确保我们各组件之间的一致性,并使您的代码更具可读性,请在两个地方都坚持使用短横线命名。

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代码更易于维护、可读性更好、更专业。希望这些技巧对您有用(因为它们绝对是我一直想记住的东西)。

到此这篇关于12 种使用Vue 的最佳做法的文章就介绍到这了,更多相关Vue 最佳做法内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
js实现的map方法示例代码
Jan 13 Javascript
jquery制作居中遮罩层效果分享
Feb 21 Javascript
浅谈javascript中字符串String与数组Array
Dec 31 Javascript
Vue.js中数组变动的检测详解
Oct 12 Javascript
Bootstrap框架安装使用详解
Jan 21 Javascript
微信小程序 图片加载(本地,网路)实例详解
Mar 10 Javascript
JS实现批量上传文件并显示进度功能
Jun 27 Javascript
jQuery中的$是什么意思及 $. 和 $().的区别
Apr 20 jQuery
layui实现文件或图片上传记录
Aug 28 Javascript
Vue3.0结合bootstrap创建多页面应用
May 28 Javascript
深入理解javascript prototype的相关知识
Sep 19 Javascript
vue-router的钩子函数用法实例分析
Oct 26 Javascript
javascript实现简易数码时钟
Mar 30 #Javascript
vue计算属性+vue中class与style绑定(推荐)
Mar 30 #Javascript
Bootstrap简单实用的表单验证插件BootstrapValidator用法实例详解
Mar 29 #Javascript
JS实现滑动拼图验证功能完整示例
Mar 29 #Javascript
json_decode 索引为数字时自动排序问题解决方法
Mar 28 #Javascript
JS中FormData类实现文件上传
Mar 27 #Javascript
JS中FileReader类实现文件上传及时预览功能
Mar 27 #Javascript
You might like
PHP编码规范之注释和文件结构说明
2010/07/09 PHP
php类中private属性继承问题分析
2012/11/01 PHP
ThinkPHP3.1新特性之字段合法性检测详解
2014/06/19 PHP
使用PHPMailer实现邮件发送代码分享
2014/10/23 PHP
orm获取关联表里的属性值
2016/04/17 PHP
php求数组全排列,元素所有组合的方法
2016/05/05 PHP
两个DIV等高的JS的实现代码
2007/12/23 Javascript
js动态调用css属性的小规律及实例说明
2013/12/28 Javascript
jQuery调用RESTful WCF示例代码(GET方法/POST方法)
2014/01/26 Javascript
jquery实现叠层3D文字特效代码分享
2015/08/21 Javascript
NodeJS的Promise的用法解析
2016/05/05 NodeJs
Vue.js实战之Vuex的入门教程
2017/04/01 Javascript
[js高手之路]HTML标签解释成DOM节点的实现方法
2017/08/31 Javascript
promise和co搭配生成器函数方式解决js代码异步流程的比较
2018/05/25 Javascript
详解Vue结合后台的列表增删改案例
2018/08/21 Javascript
react 兄弟组件如何调用对方的方法示例
2018/10/23 Javascript
[02:43]DOTA2英雄基础教程 半人马战行者
2014/01/13 DOTA
[01:09:50]VP vs Pain 2018国际邀请赛小组赛BO2 第二场
2018/08/20 DOTA
Python中使用PDB库调试程序
2015/04/05 Python
python中requests库session对象的妙用详解
2017/10/30 Python
Windows下Anaconda2安装NLTK教程
2018/09/19 Python
pandas实现to_sql将DataFrame保存到数据库中
2019/07/03 Python
通过PHP与Python代码对比的语法差异详解
2019/07/10 Python
Python实现Wordcloud生成词云图的示例
2020/03/30 Python
python 爬虫如何正确的使用cookie
2020/10/27 Python
Python3+PyCharm+Django+Django REST framework配置与简单开发教程
2021/02/16 Python
Boutique 1美国:阿联酋奢侈时尚零售商
2017/10/16 全球购物
在对linux系统分区进行格式化时需要对磁盘簇(或i节点密度)的大小进行选择,请说明选择的原则
2012/11/24 面试题
你经历的项目中的SCM配置项主要有哪些?什么是配置项?
2013/11/04 面试题
捐款倡议书范文
2014/02/02 职场文书
竞选卫生委员演讲稿
2014/04/28 职场文书
应届大学生求职信
2014/07/20 职场文书
植物生产学专业求职信
2014/08/08 职场文书
科级干部群众路线教育实践活动个人对照检查材料
2014/09/19 职场文书
mysql升级到5.7时,wordpress导数据报错1067的问题
2021/05/27 MySQL
Python自动化实战之接口请求的实现
2022/05/30 Python