Vue.js开发的4个基本ES2015特性

Vue.js专家解释了如何在使用Vue框架进行编码时使用JavaScript的最新功能。请继续阅读!

ES2015(又名ES6)是JavaScript语言的当前规范。如果您是JavaScript新手或最近没有更新JavaScript知识,ES2015中有许多新功能可使开发更好,更令人愉快。

如果您是Vue开发人员,您将从学习所有这些新功能中受益。但作为一种分类手段,您可以从适用于Vue的那些功能开始。

在本文中,我将向您展示您将每天与Vue一起使用的四个ES2015功能。我将提供每个解释和简要示例。

箭头功能

模板文字

模块

解构和扩展语法

1.箭头功能

// Regular JavaScript function

function(parameters) {

statements

}

// Arrow function

(parameters) => {

statements

}

没有界限 this

箭头函数的一个重要特性是它们不绑定值this。相反,他们使用this封闭的上下文。

考虑需要回调函数的JavaScript数组方法。Array.filter例如,允许您返回一个新的数组,只包含那些与回调函数定义的过滤器相匹配的项目。

Vue.js的一个重要功能是,您可以轻松访问this.vuePropertyVue配置对象上下文中的数据属性,计算属性和方法。

但是,如果您使用常规函数进行回调,它将为其自己的值绑定this。您不能this.vueProperty从回调中引用Vue对象的属性,您必须在回调的范围内手动创建它们。

new Vue({

data: {

size: 'large',

items: [ { size: 'small' }, { size: 'large' } ]

},

computed: {

filterBySize() {

let size = this.size;

return this.items.filter(function(item) {

return item.size === size;

// Note: this.size is undefined

});

}

}

});

箭头函数使用this封闭上下文中的对象。在这种情况下,它来自filterBySizeVue对象绑定到的计算属性,该属性this简化了filter回调:

filterBySize() {

return this.items.filter((item) => {

return item.size === this.size;

});

}

疑难杂症

虽然箭头函数可以在很多情况下有效地使用,但这并不意味着我们应该在开发Vue时始终使用它们。事实上,你不应该在Vue配置对象上使用箭头函数作为函数属性,因为它们需要this从Vue构造函数访问上下文。

// Regular function

var regular = new Vue({

data: {

val: 'Hello world'

},

computed: {

upperCase() {

return this.val.toUpperCase();

}

}

});

console.log(regular.upperCase); // HELLO WORLD

// Arrow function

var arrow = new Vue({

data: {

val: 'Hello world'

},

computed: {

upperCase: () => {

return this.val.toUpperCase();

}

}

});

console.log(arrow.upperCase);

// Uncaught TypeError: Cannot read property 'toUpperCase' of undefined

单参数和隐式返回

在某些情况下,您可以使箭头函数的语法更加简洁。如果您的功能只有一个参数,则可以删除括号()。如果你的函数只有一个表达式,你甚至可以放下大括号{}!

下面是从上面实现的那些shorthands的数组过滤器回调:

filterBySize() {

return this.items.filter(item => item.size === this.size);

}

2.模板文字

模板文字使用反引号(``)而不是双引号或单引号来定义字符串。

模板文字允许我们在Vue.js中做两件超级有用的事情:

多行字符串(非常适合组件模板)。

嵌入表达式(很适合计算属性)。

多行字符串

用JavaScript代码编写模板并不理想,但有时我们需要/需要。但是如果模板有很多内容呢?在ES2015之前,我们有两个选择:

首先,把它放在一条线上:

Vue.component({

template: '

{{ title }}

{{ message }}

'

});

线路变长时,这真的很难读懂。

Vue.component({

template: '

' +

'

{{ title }}

' +

'

{{ message }}

' +

''

});

模板文字解决了这个问题,因为它们允许多行字符串而不需要分割字符串:

Vue.component({

template: `

{{ title }}

{{ message }}

`

});

嵌入式表达式

有时我们想要一个字符串是动态的,即包含一个变量。这在计算属性中非常常见,您可能希望在从反应的Vue.js数据属性派生的模板中插入一个字符串。

new Vue({

data: {

name: 'George'

},

computed: {

greeting() {

return 'Hello, ' + this.name + ', how are you?'

}

}

});

通过${}在模板文字中使用占位符,我们可以在不破坏字符串的情况下插入变量和其他表达式:

new Vue({

data: {

name: 'George'

},

computed: {

greeting() {

return `Hello, ${this.name}, how are you?`

}

}

});

3.模块

如何将JavaScript对象从一个文件加载到另一个文件中?在ES2015之前没有原生的方式。使用JavaScript 模块,我们可以使用导出和导入语法来完成它:

file1.js

export default {

myVal: 'Hello'

}

file2.js

import obj from './file1.js';

console.log(obj.myVal); // Hello

模块提供了两个关键好处:

我们可以将我们的JavaScript应用分成多个文件。

我们可以让某些代码在各个项目中可重用。

组件模块

模块文件的一个很好的用例是组件。在ES2015之前,我们需要将所有组件定义放在主文件中,包括我们的Vue实例,例如

app.js

Vue.component('component1', { ... });

Vue.component('component2', { ... });

Vue.component('component3', { ... });

new Vue({ ... });

如果我们继续这样做,我们的app.js文件将变得非常庞大和复杂。使用模块,我们可以将组件定义放在单独的文件中并实现更好的组织,例如:

component1.js

export default {

// component definition

};

我们现在可以在我们的主文件中导入组件定义对象:

app.js

import component1 from './component1.js';

Vue.component('component1', component1);

...

模块化组件的更好选择是使用单个文件组件。这些使用JavaScript模块,但也需要像Webpack这样的构建工具。有关更多信息,请参阅此文章。

要阅读关于JavaScript模块的更多信息,请从这里开始导入功能。

4.解构和扩展语法

对象是Vue.js开发的重要组成部分。通过一些新的语法功能,ES2015可以更轻松地处理对象属性。

解构赋值

解构允许我们解开对象属性并将它们分配给不同的变量。采取以下的对象 myObj。为了将它的属性分配给新变量,我们使用.符号:

let myObj = {

prop1: 'Hello',

prop2: 'World'

};

const prop1 = myObj.prop1;

const prop2 = myObj.prop2;

使用解构赋值,我们可以更简洁地做到这一点:

let myObj = {

prop1: 'Hello',

prop2: 'World'

};

const { prop1, prop2 } = myObj;

console.log(prop1);

// Output: Hello

解构在Vuex操作中很有用。操作接收context包含state对象和commitAPI方法属性的对象:

actions: {

increment (context) {

// context.state

// context.commit(...)

}

}

不过,通常情况下,您不需要操作中的state属性,只需要使用该commitAPI。通过在函数配置文件中使用解构赋值,可以创建一个commit用于正文的参数,从而减少此函数的详细程度:

actions: {

increment ({ commit }) {

commit(...);

}

}

不过,通常情况下,您不需要操作中的state属性,只需要使用该commitAPI。通过在函数配置文件中使用解构赋值,可以创建一个commit用于正文的参数,从而减少此函数的详细程度:

actions: {

increment ({ commit }) {

commit(...);

}

}

扩展语法

在传播语法允许我们展开的对象为在多个键/值对预期的地方。要将信息从一个对象复制到另一个对象之前,我们必须这样做:

let myObj = {

prop1: 'Hello',

prop2: 'World'

};

let newObj = {

name: 'George',

prop1: myObj.prop1,

prop2: myObj.prop2

};

console.log(newObj.prop1); // Hello

使用扩展运算符...,我们可以更简洁地做到这一点:

let newObj = {

name: 'George',

...myObj

};

console.log(newObj.prop1); // Hello

再次以Vuex为例,我们经常希望将我们的Vuex状态属性用作计算属性。在ES2015之前,我们必须手动复制每一个。例如:

store.js

new Vuex.Store({

state: {

prop1: ...,

prop2: ...,

prop3: ...

}

});

app.js

new Vue({

computed: {

prop1() {

return store.state.prop1;

},

prop2() {

return store.state.prop2;

}

...

}

});

Vuex提供了一个mapState函数,该函数返回一个对象,其中包含通过提供其键来指定的所有Vuex状态属性:

import { mapState } from 'vuex';

var state = mapState(['prop1', 'prop2', 'prop3']);

console.log(state.prop1) // { ... }

使用mapState与传播结合运营商,我们可以与那些在一个非常简洁的方式从Vuex结合本地计算性能:

app.js

import { mapState } from 'vuex';

new Vue({

computed: {

someLocalComputedProp() { ... },

...mapState(['prop1', 'prop2', 'prop3'])

}

});

这很酷!还有什么?

以上是您将立即在Vue项目中使用的ES2015功能。当然,还有很多其他的ES2015功能在Vue.js编程中很有用。如果你想继续从这里学习,我会建议这两个作为你的下一个主题:

承诺。这些有助于异步编程,可以与Async Components以及Vuex Actions一起使用。

Object.assign。这不是你经常需要的东西,但它会帮助你理解Vue的反应性系统是如何工作的。Vue.js 3.x可能会使用新的Proxies功能,所以请检查一下!