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中关于String对象的replace使用详解
May 24 Javascript
详解强大的jQuery选择器之基本选择器、层次选择器
Feb 07 Javascript
JavaScript 32位整型无符号操作示例
Dec 08 Javascript
JavaScript中神奇的call()方法
Mar 12 Javascript
浅析Node.js:DNS模块的使用
Nov 23 Javascript
JavaScript 最佳实践:帮你提升代码质量
Dec 03 Javascript
简单实现js选项卡切换效果
Feb 09 Javascript
JavaScript中的return布尔值的用法和原理解析
Aug 14 Javascript
three.js实现3D视野缩放效果
Nov 16 Javascript
详解Vue源码学习之双向绑定
Apr 10 Javascript
Javascript如何实现双指控制图片功能
Feb 25 Javascript
JS监听组合按键思路及实现过程
Apr 17 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 异步执行方法,模拟多线程的应用分析
2013/06/03 PHP
PHP中iconv函数转码时截断字符问题的解决方法
2015/01/21 PHP
PHP延迟静态绑定的深入讲解
2018/04/02 PHP
用js模拟JQuery的show与hide动画函数代码
2010/09/20 Javascript
Jquery操作radio的简单实例
2014/01/06 Javascript
textarea焦点的用法实现获取焦点清空失去焦点提示效果
2014/05/19 Javascript
node.js中的fs.statSync方法使用说明
2014/12/16 Javascript
JavaScript子窗口调用父窗口变量和函数的方法
2015/10/09 Javascript
JavaScript使用DeviceOne开发实战(二) 生成调试安装包
2015/12/01 Javascript
Javascript技术栈中的四种依赖注入详解
2016/02/23 Javascript
vue2滚动条加载更多数据实现代码
2017/01/10 Javascript
深入理解Angular.JS中的Scope继承
2017/06/04 Javascript
vue中各选项及钩子函数执行顺序详解
2018/08/25 Javascript
layer.open的自适应及居中及子页面标题的修改方法
2019/09/05 Javascript
python抓取某汽车网数据解析html存入excel示例
2013/12/04 Python
用Python编写生成树状结构的文件目录的脚本的教程
2015/05/04 Python
Python随机数random模块使用指南
2016/09/09 Python
Python利用递归和walk()遍历目录文件的方法示例
2017/07/14 Python
python迭代dict的key和value的方法
2018/07/06 Python
tensorflow学习教程之文本分类详析
2018/08/07 Python
在python中将list分段并保存为array类型的方法
2019/07/15 Python
Python中用pyinstaller打包时的图标问题及解决方法
2020/02/17 Python
Python importlib动态导入模块实现代码
2020/04/16 Python
新版Pycharm中Matplotlib不会弹出独立的显示窗口的问题
2020/06/02 Python
python tkinter实现连连看游戏
2020/11/16 Python
HTML5的结构和语义(1):前言
2008/10/17 HTML / CSS
致铅球运动员广播稿精选
2014/01/12 职场文书
工业自动化专业自荐信范文
2014/04/10 职场文书
诉前财产保全担保书
2014/05/20 职场文书
教师见习总结范文
2015/06/23 职场文书
golang 接口嵌套实现复用的操作
2021/04/29 Golang
详解CSS开发过程中的20个快速提升技巧
2021/05/21 HTML / CSS
如何搭建 MySQL 高可用高性能集群
2021/06/21 MySQL
Canvas如何做个雪花屏版404的实现
2021/09/25 HTML / CSS
船舶调度指挥系统——助力智慧海事
2022/02/18 无线电
Python使用永中文档转换服务
2022/05/06 Python