12 种使用 Vue 的最佳作法

做者:Matt Maribojoc
译者:前端小智
来源:medium
点赞再看,养成习惯

本文 GitHub https://github.com/qq44924588... 上已经收录,更多往期高赞文章的分类,也整理了不少个人文档,和教程资料。欢迎Star和完善,你们面试能够参照考点复习,但愿咱们一块儿有点东西。前端

随着 VueJS 的使用愈来愈普遍,出现了几种最佳实践并逐渐成为标准。在本文中,主要分享在平时开发中一些有用资源和技巧,废话少说,咱们开始吧。vue

1.始终在 v-for 中使用 :key

在须要操纵数据时,将key属性与v-for指令一块儿使用可让程序保持恒定且可预测。webpack

这是颇有必要的,这样Vue就能够跟踪组件状态,并对不一样的元素有一个常量引用。在使用动画或Vue转换时,key 很是有用。git

若是没有key ,Vue只会尝试使DOM尽量高效。 这可能意味着v-for中的元素可能会出现乱序,或者它们的行为难以预测。 若是咱们对每一个元素都有惟一的键引用,那么咱们能够更好地预测Vue应用程序将如何精确地处理DOM操做。github

<!-- 很差的作法-->
<div v-for='product in products'>  </div>

<!-- 好的作法 -->
<div v-for='product in products' :key='product.id'>

在事件中使用短横线命名

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

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

this.$emit('close-window')
// 在父组件中
<popup-window @close-window='handleEvent()' />

3.使用驼峰式声明 props,并在模板中使用短横线命名来访问 props

最佳作法只是遵循每种语言的约定。 在 JS 中,驼峰式声明是标准,在HTML中,是短横线命名。 所以,咱们相应地使用它们。express

幸运的是,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-ifv-for指令

为了过滤数组中的元素,咱们很容易将v-ifv-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组件

为这些组件命名的最佳实践是为它们提供前缀BaseVApp。一样,只要咱们在整个项目中保持一致,可使用其中任何一种。

BaseButton.vue
BaseIcon.vue
BaseHeading.vue

该命名约定的目的是使基本组件按字母顺序分组在文件系统中。 另外,经过使用webpack导入功能,咱们能够搜索与命名约定模式匹配的组件,并将全部组件自动导入为Vue项目中的全局变量。

单实例组件命名应该带有前缀 The

与基本组件相似,单实例组件(每一个页面使用一次,不接受任何prop)应该有本身的命名约定。这些组件特定于咱们的应用,一般是 footerheadersider

该组件只能有一个激活实例。

TheHeader.vue
TheFooter.vue
TheSidebar.vue
ThePopup.vue

10.保持指令简写的一致性

在Vue开发人员中,一种常见的技术是使用指令的简写。例如:

  • @v-on的简写
  • :v-bind 的简写
  • #v-slot 的简写

在你的Vue项目中使用这些缩写是很好的。可是要在整个项目中建立某种约定,老是使用它们或从不使用它们,会使咱们的项目更具内聚性和可读性。

11.不要在“created”和“watch”中调用方法

Vue开发人员常常犯的一个错误是他们没必要要地在createdwatch中调用方法。 其背后的想法是,咱们但愿在组件初始化后当即运行watch

// 很差的作法

created: () {
  this.handleChange()
},
methods: {
  handleChange() {
    // stuff happens
  }
},
watch () {
  property() {
    this.handleChange()
  }
}

可是,Vue为此提供了内置的解决方案,这是咱们常常忘记的Vue watch属性。

咱们要作的就是稍微重组watch并声明两个属性:

1.handler (newVal, oldVal)-这是咱们的watch方法自己。

  1. 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

https://medium.com/better-pro...


交流

文章每周持续更新,能够微信搜索「 大迁世界 」第一时间阅读和催更(比博客早一到两篇哟),本文 GitHub https://github.com/qq449245884/xiaozhi 已经收录,整理了不少个人文档,欢迎Star和完善,你们面试能够参照考点复习,另外关注公众号,后台回复福利,便可看到福利,你懂的。

相关文章
相关标签/搜索