了解ES6的新语法
掌握Vue实例创建,了解Vue的常见属性掌握Vue的生命周期相关钩子函数掌握使用Vue常见指令掌握Vue计算属性和侦听器使用
1、ES6语法入门
ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,已经在 2015 年 6 月正式发布了。它的目标,是使得 JavaScript 语言可以用来编写复杂的大型应用程序,成为企业级开发语言。
1.1 什么是ECMAScript ?
一个常见的问题是,ECMAScript 和 JavaScript 到底是什么关系?
要讲清楚这个问题,需要回顾历史。1996 年 11 月,JavaScript 的创造者 Netscape 公司,决定将 JavaScript 提交给标准化组织 ECMA,希望这种语言能够成为国际标准。次年,ECMA 发布 262 号标准文件(ECMA-262)的第一版,规定了浏览器脚本语言的标准,并将这种语言称为 ECMAScript,这个版本就是 1.0 版。
该标准从一开始就是针对 JavaScript 语言制定的,但是之所以不叫 JavaScript,有两个原因。一是商标,Java 是 Sun 公司的商标,根据授权协议,只有 Netscape 公司可以合法地使用 JavaScript 这个名字,且 JavaScript 本身也已经被 Netscape 公司注册为商标。二是想体现这门语言的制定者是 ECMA,不是 Netscape,这样有利于保证这门语言的开放性和中立性。
因此,ECMAScript 和 JavaScript 的关系是,前者是后者的规格,后者是前者的一种实现(另外的 ECMAScript 方言还有 JScript 和 ActionScript)。日常场合,这两个词是可以互换的。
1.2 ES6与ECMAScript 2015的关系
ECMAScript 2015(简称 ES2015)这个词,也是经常可以看到的。它与 ES6 是什么关系呢?2011 年,ECMAScript 5.1 版发布后,就开始制定 6.0 版了。因此,ES6 这个词的原意,就是指 JavaScript 语言的下一个版本。
但是,因为这个版本引入的语法功能太多,而且制定过程当中,还有很多组织和个人不断提交新功能。事情很快就变得清楚了,不可能在一个版本里面包括所有将要引入的功能。常规的做法是先发布 6.0 版,过一段时间再发 6.1 版,然后是 6.2 版、6.3 版等等。
但是,标准的制定者不想这样做。他们想让标准的升级成为常规流程:任何人在任何时候,都可以向标准委员会提交新语法的提案,然后标准委员会每个月开一次会,评估这些提案是否可以接受,需要哪些改进。如果经过多次会议以后,一个提案足够成熟了,就可以正式进入标准了。这就是说,标准的版本升级成为了一个不断滚动的流程,每个月都会有变动。
标准委员会最终决定,标准在每年的 6 月份正式发布一次,作为当年的正式版本。接下来的时间,就在这个版本的基础上做改动,直到下一年的 6 月份,草案就自然变成了新一年的版本。这样一来,就不需要以前的版本号了,只要用年份标记就可以了。
ES6 的第一个版本,就这样在 2015 年 6 月发布了,正式名称就是《ECMAScript 2015 标准》(简称 ES2015)。2016 年 6 月,小幅修订的《ECMAScript 2016 标准》(简称 ES2016)如期发布,这个版本可以看作是 ES6.1 版,因为两者的差异非常小(只新增了数组实例的includes方法和指数运算符),基本上是同一个标准。根据计划,2017 年 6 月发布 ES2017 标准。因此,ES6 既是一个历史名词,也是一个泛指,含义是 5.1 版以后的 JavaScript 的下一代标准,涵盖了 ES2015、ES2016、ES2017 等等,而 ES2015 则是正式名称,特指该年发布的正式版本的语言标准。本书中提到 ES6 的地方,一般是指 ES2015 标准,但有时也是泛指“下一代 JavaScript 语言”。1.3 ECMAScript 的历史ES6 从开始制定到最后发布,整整用了 15 年。前面提到,ECMAScript 1.0 是 1997 年发布的,接下来的两年,连续发布了 ECMAScript 2.0(1998 年 6 月)和 ECMAScript 3.0(1999 年 12 月)。3.0 版是一个巨大的成功,在业界得到广泛支持,成为通行标准,奠定了 JavaScript 语言的基本语法,以后的版本完全继承。直到今天,初学者一开始学习 JavaScript,其实就是在学 3.0 版的语法。2000 年,ECMAScript 4.0 开始酝酿。这个版本最后没有通过,但是它的大部分内容被 ES6 继承了。因此,ES6 制定的起点其实是 2000 年。为什么 ES4 没有通过呢?因为这个版本太激进了,对 ES3 做了彻底升级,导致标准委员会的一些成员不愿意接受。ECMA 的第 39 号技术专家委员会(Technical Committee 39,简称 TC39)负责制订 ECMAScript 标准,成员包括 Microsoft、Mozilla、Google 等大公司。2007 年 10 月,ECMAScript 4.0 版草案发布,本来预计次年 8 月发布正式版本。但是,各方对于是否通过这个标准,发生了严重分歧。以 Yahoo、Microsoft、Google 为首的大公司,反对 JavaScript 的大幅升级,主张小幅改动;以 JavaScript 创造者 Brendan Eich 为首的 Mozilla 公司,则坚持当前的草案。2008 年 7 月,由于对于下一个版本应该包括哪些功能,各方分歧太大,争论过于激烈,ECMA 开会决定,中止 ECMAScript 4.0 的开发,将其中涉及现有功能改善的一小部分,发布为 ECMAScript 3.1,而将其他激进的设想扩大范围,放入以后的版本,由于会议的气氛,该版本的项目代号起名为 Harmony(和谐)。会后不久,ECMAScript 3.1 就改名为 ECMAScript 5。 2009 年 12 月,ECMAScript 5.0 版正式发布。Harmony 项目则一分为二,一些较为可行的设想定名为 JavaScript.next 继续开发,后来演变成 ECMAScript 6;一些不是很成熟的设想,则被视为 JavaScript.next.next,在更远的将来再考虑推出。TC39 委员会的总体考虑是,ES5 与 ES3 基本保持兼容,较大的语法修正和新功能加入,将由 JavaScript.next 完成。当时,JavaScript.next 指的是 ES6,第六版发布以后,就指 ES7。TC39 的判断是,ES5 会在 2013 年的年中成为 JavaScript 开发的主流标准,并在此后五年中一直保持这个位置。2011 年 6 月,ECMAScript 5.1 版发布,并且成为 ISO 国际标准(ISO/IEC 16262:2011)。2013 年 3 月,ECMAScript 6 草案冻结,不再添加新功能。新的功能设想将被放到 ECMAScript 7。2013 年 12 月,ECMAScript 6 草案发布。然后是 12 个月的讨论期,听取各方反馈。2015 年 6 月,ECMAScript 6 正式通过,成为国际标准。从 2000 年算起,这时已经过去了 15 年。1.4 ES6新特性参考:阮一峰教程 1.4.1 let和const命令var在目前我们的知识盲区内,js定义变量只有一个关键字:varvar有一个问题,就是定义的变量有时会莫名奇妙的成为全局变量。例如这样的一段代码:for(var i = 0; i < 10; i++){ console.log(i);}console.log(\"你猜i是多少:\" + i)你猜打印的结果是什么?letlet所声明的变量,只在let命令所在的代码块内有效。我们把刚才的var改成let试试:for(let i = 0; i < 10; i++){ console.log(i);}console.log(\"你再猜猜i是多少:\" + i)constconst声明的变量是常量,不能被修改1.4.2 字符串拓展新APIES6为字符串扩展了几个新的API:includes():返回布尔值,表示是否找到了参数字符串。startsWith():返回布尔值,表示参数字符串是否在原字符串的头部。endsWith():返回布尔值,表示参数字符串是否在原字符串的尾部。 字符串模板传统的 JavaScript 语言,输出模板通常是这样写的(下面使用了 jQuery 的方法)。$('#result').append( 'There are ' + basket.count + ' ' + 'items in your basket, ' + '' + basket.onSale + ' are on sale!');上面这种写法相当繁琐不方便,ES6 引入了模板字符串解决这个问题。$('#result').append(` There are ${basket.count} items in your basket, ${basket.onSale} are on sale!`);模板字符串(template string)是增强版的字符串,用反引号(`)标识。它可以当作普通字符串使用,也可以用来定义多行字符串,或者在字符串中嵌入变量。// 普通字符串`In JavaScript '\\n' is a line-feed.`// 多行字符串`In JavaScript this is not legal.`console.log(`string text line 1string text line 2`);// 字符串中嵌入变量let name = \"Bob\", time = \"today\";`Hello ${name}, how are you ${time}?`上面代码中的模板字符串,都是用反引号表示。如果在模板字符串中需要使用反引号,则前面要用反斜杠转义。let greeting = `\\`Yo\\` World!`;模板字符串中嵌入变量,需要将变量名写在${}之中。function authorize(user, action) { if (!user.hasPrivilege(action)) { throw new Error( // 传统写法为 // 'User ' // + user.name // + ' is not authorized to do ' // + action // + '.' `User ${user.name} is not authorized to do ${action}.`); }}大括号内部可以放入任意的 JavaScript 表达式,可以进行运算,以及引用对象属性。let x = 1;let y = 2;`${x} + ${y} = ${x + y}`// \"1 + 2 = 3\"`${x} + ${y * 2} = ${x + y * 2}`// \"1 + 4 = 5\"let obj = {x: 1, y: 2};`${obj.x + obj.y}`// \"3\"模板字符串之中还能调用函数。function fn() { return \"Hello World\";}`foo ${fn()} bar`// foo Hello World bar1.4.3 解构表达式数组解构有如下数组:let arr = [10,20,30] 如果需要获取其中的值,只能通过角标。ES6可以这样:const [a,b,c] = arr;//a,b,c将与arr中的每个位置对应来取值// 然后打印console.log(a, b, c);对象解构有如下person对象:const person = { name:\"张三\", age:22, subjects: ['java','js','css']}我们可以这么做:// 解构表达式获取值const {name,age,subjects} = person;// 打印console.log(name);console.log(age);console.log(subjects);1.4.4 函数优化函数参数默认值优化在ES6以前,我们无法给一个函数参数设置默认值,只能通过逻辑表达式判断function add(a , b) { // 判断b是否为空,为空就给默认值1 b = b || 1; return a + b;}// 传一个参数console.log(add(10)); 现在可以这么写:function add(a , b = 1) { return a + b;}// 传一个参数console.log(add(10));箭头函数ES6中定义函数的简写方式:一个参数时:var print = function (obj) { console.log(obj);}// 简写为:var print_v2 = obj => console.log(obj);多个参数:// 两个参数的情况:var sum = function (a , b) { return a + b;}// 简写为:var sum_v2 = (a,b) => a+b;代码不止一行,可以用{}括起来var sum_v3 = (a,b) => { return a + b;}对象的函数属性简写比如一个Person对象,里面有eat方法:let person = { name: \"张三\", // 方式一: eat: function (food) { console.log(this.name + \"在吃\" + food); }, // 方式二:箭头函数版: eat2: food => console.log(person.name + \"在吃\" + food),// 箭头函数默认不具备this // 方式三:简写版: eat3(food) { console.log(this.name + \"在吃\" + food); }}箭头函数结合解构表达式比如有一个函数:const person = { name:\"张三\", age:21, subjects: ['java','js','css']}function hello(person) { console.log(\"hello,\" + person.name)}如果用箭头函数和解构表达式var hello_v2 = ({name}) => console.log(\"hello,\" + name);1.4.5 map和reducemapmap():接收一个函数,将原数组中的所有元素用这个函数处理后放入新数组返回。 举例:有一个价格数组,我们希望在原有价格基础之上五折出售let price = [10, 20, 30, 40];console.log(price)let sale = price.map(i => i*0.5);console.log(sale)reducereduce(callback(x, y),initvalue):接收一个函数(必须)和一个初始值(可选),该函数接收两个参数:第一个参数是上一次reduce处理的结果第二个参数是数组中要处理的下一个元素reduce()会从左到右依次把数组中的元素用reduce处理,并把处理的结果作为下次reduce的第一个参数。如果是第一次,会把前两个元素作为计算参数,或者把用户指定的初始值作为起始参数。1.4.6 Promise 对象Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了Promise对象。 所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。 语法:const promise = new Promise(function(resolve, reject) { // ... 执行异步操作 if (/* 异步操作成功 */){ resolve(value);// 调用resolve,代表Promise将返回成功的结果 } else { reject(error);// 调用reject,代表Promise会返回失败结果 }});这样,在promise中就封装了一段异步执行的结果。如果我们想要等待异步执行完成,做一些事情,我们可以通过promise的then方法来实现,语法:$.get('/api/user/list',function(res){},function(error){})promise.then(function(value){ // 异步执行成功后的回调});如果想要处理promise异步执行失败的事件,还可以跟上catch:promise.then(function(value){ // 异步执行成功后的回调}).catch(function(error){ // 异步执行失败后的回调})1.4.7 对象拓展ES6给Object拓展了若干新的方法,如:keys(obj):获取对象的所有key形成的数组values(obj):获取对象的所有value形成的数组entries(obj):获取对象的所有key和value形成的二维数组。格式:[[k1,v1],[k2,v2],...]assian(dest, ...src) :将多个src对象的值 拷贝到 dest中 1.4.8 数组拓展ES6给数组新增了若干方法:find(callback):把数组中的元素逐个传递给函数callback执行,如果返回true,则返回该元素findIndex(callback):与find类似,不过返回的是品牌到的元素的索引includes(value):与find类似,如果匹配到元素,则返回true,代表找到了 1.4.9 模块化(了解思想,以下代码别敲了)1.4.9.1 何为模块化?模块化就是把代码进行拆分,方便重复利用。模块功能主要由两个命令构成:export和import。export命令用于规定模块的对外接口,import命令用于导入其他模块提供的功能。 1.4.9.2 export比如我定义一个js文件:util.js,里面有一个对象: const util = { sum(a,b){ return a + b; }}我可以使用export将这个对象导出:const util = { sum(a,b){va{} return a + b; }}export util;当然,也可以简写为:export const util = { sum(a,b){ return a + b; }}export不仅可以导出对象,一切JS变量都可以导出。比如:基本类型变量、函数、数组、对象。当要导出多个值时,还可以简写。比如我有一个文件:user.js:var base_url = \"http://localhost:8080\"var age = 21export {base_url,age}省略名称上面的导出代码中,都明确指定了导出的变量名,这样其它人在导入使用时就必须准确写出变量名,否则就会出错。因此js提供了default关键字,可以对导出的变量名进行省略例如:// 无需声明对象的名字export default { sum(a,b){ return a + b; }}这样,当使用者导入时,可以任意起名字1.4.9.3 import使用export命令定义了模块的对外接口以后,其他 JS 文件就可以通过import命令加载这个模块。例如我要使用上面导出的util: // 导入utilimport util from 'util.js'// 调用util中的属性let result = util.sum(1,2)要批量导入前面导出的name和age: import {base_url, age} from 'user.js'console.log(base_url, age);2、Vue入门2.1 Vue简介Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。 官网GitHub 从架构层看为什么要使用Vue?Vue:MVVM模式的框架M:即Model,模型,包括数据和一些基本操作V:即View,视图,页面渲染结果VM:即View-Model,模型与视图间的双向操作(无需开发人员干涉)在MVVM之前,开发人员从后端获取需要的数据模型,然后要通过DOM操作Model渲染到View中。而后当用户操作视图,我们还需要通过DOM获取View中的数据,然后同步到Model中。而MVVM中的VM要做的事情就是把DOM操作完全封装起来,开发人员不用再关心Model和View之间是如何互相影响的:只要我们Model发生了改变,View上自然就会表现出来。当用户修改了View,Model中的数据也会跟着改变。把开发人员从繁琐的DOM操作中出来,把关注点放在如何操作Model上。2.2 安装环境(Node.js、npm)2.2.1 Node.js简单的说 Node.js 就是运行在服务端的 JavaScript。Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台。Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。下载地址https://nodejs.org/en/检查版本node -v 2.2.2 NPMNPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种:允许用户从NPM服务器下载别人编写的第三方包到本地使用。允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。由于新版的nodejs已经集成了npm,所以之前npm也一并安装好了。同样可以通过输入 \"npm -v\" 来测试是否成功安装。注意:更换npm镜像npm默认的仓库地址是在国站,速度较慢,建议大家设置到淘宝镜像。此处使用nrm镜像切换工具进行切换我们首先安装nrm,这里-g代表全局安装npm install nrm -g 然后通过nrm ls命令查看npm的仓库列表,带*的就是当前选中的镜像仓库:通过nrm use taobao来指定要使用的镜像源,并通过npm config ls查看当前镜像2.3 快速入门2.3.1 安装Vue方式一:CDN对于制作原型或学习,你可以这样使用最新版本: 对于生产环境,我们推荐链接到一个明确的版本号和构建文件,以避免新版本造成的不可预期的破坏:方式二:NPM1.初始化项目npm init -y2.安装vuenpm install vue --save3.引入vue2.3.2 入门案例1. HTML模板
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- xiaozhentang.com 版权所有 湘ICP备2023022495号-4
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务