Vue.js 2.5新特性介绍(推荐)


Posted in Javascript onOctober 24, 2017

TypeScript

TypeScript是一种由微软开发的自由和开源的编程语言。它是JavaScript的一个超集,而且本质上向这个语言添加了可选的静态类型和基于类的面向对象编程。2012年十月份,微软发布了首个公开版本的TypeScript,在2013年6月19日,微软发布了TypeScript 0.9的正式版本,到目前为止,TypeScript已发展到2.x版本

安装TypeScript

安装TypeScript主要有两种方式:

通过npm方式安装(Node.js包管理器)

安装TypeScript的Visual Studio插件

说明:Visual Studio2016和Visual Studio 2013 Update 2默认包含了TypeScript。npm安装的命令如下:

npm install -g typescript

创建TypeScript文件

在编辑器中新建一个greeter.ts文件,并输入以下JavaScript代码:

function greeter(person) {
 return "Hello, " + person;
}
var user = "Jane User";
document.body.innerHTML = greeter(user);

上面的代码直接输出“hello Jane User”。

编译代码

在在命令行中运行TypeScript编译器即可编译代码:

tsc greeter.ts

运行TypeScript web程序

现在在greeter.html中输入以下代码:

<!DOCTYPE html>
<html>
 <head><title>TypeScript Greeter</title></head>
 <body>
  <script src="greeter.js"></script>
 </body>
</html>

在浏览器中打开greeter.html即可去运行第一个TypeScript web应用程序demo!

Vue.js 2.5新特性

Vue 2.5 Level E 已发布,在原来2.x的基础上做了很多相应改进和对 bug 的修复,目前 2.5 系列最新的版本为 2.5.2。如果读者希望全面的了解Vue 2.5的内容,可以通过查看Vue 2.5发布说明来获取详细的介绍。针对官方的介绍和网上搜集的资料,本次2.5版本主要做了如下几方面的改进:

更好的 TypeScript 集成
更好的错误处理
更好地支持单文件组件中的功能组件
与环境无关的服务端渲染
读者可以通过下面的链接查看原文介绍:

TypeScript 声明改进

further improve Vue type declarations for canonical usage (#6391) db138e2

错误处理和报告

improve error handling with new errorCaptured hook b3cd9bc [Details]

improve template expression error message e38d006, closes #6771

improve option type checks b7105ae

功能组件

compiled templates for functional component support ea0d227

scoped CSS support for functional components 050bb33

服务器端渲染

renderToString now returns a Promise if no callback is passedf881dd1, closes #6160

add shouldPrefetch option (same signature as shouldPreload) 7bc899c, closes #5964

auto-remove initial state embed script if in production (#6763) 2d32b5d, closes #6761

now ships an environment-agnostic build of the server renderer in vue-server-renderer/basic.jsc5d0fa0 Details

TypeScript改进

自Vue2.0发布以来,一直有开发者提出请求,希望能更好地集成TypeScript。从那时起,我们已经为大多数核心库(vue,vue - routervuex)加入了官方的TypeScript类型声明。然而,当使用开箱即用的Vue API时,目前的集成还是有所欠缺。例如:TypeScript不能轻易地推断出Vue使用的默认基于对象的API中的this类型。为了使我们的Vue代码与TypeScript更好地协作,我们需要使用vue-class-component装饰器,它允许我们使用基于类的语法来写Vue组件。

对于喜欢基于类的API的用户,这可能够好了,但还是有点不足,只是为了类型判断,用户就得使用不同的API。这也使得现有的Vue代码库迁移到TypeScript更加困难。

今年的早些时候,TypeScript引入了一些新特性,能使TypeScript更好地理解基于对象字面量的API,这也使得改进Vue的类型声明更具可能。来自TypeScript团队的Daniel Rosenwasser发起了一个雄心勃勃的PR计划。使用TypeScript后,将会有如下的好处:

使用默认的Vue API时,对this的正确类型推断。在单文件组件中同样有效!

基于组件的props配置的的props的类型推断。

更重要的是,这些改进也会使原生JavaScript用户受益!,如果你正在使用VSCode且安装了优秀的Vetur扩展,在Vue组件中使用原生JavaScript时,你会获得十分完善的自动补全提示甚至是类型提示!这是因为vue-language-server,这个分析Vue组件的内部包,可以利用TypeScript编译器来提取关于你代码的更多信息。此外,任何支持语言服务协议的的编辑器都可以利用vue-language-server来提供类似的功能。

说明:注意:TypeScript 用户还应将以下包更新为最新版本从而兼容类型声明:vue-router,vuex,vuex-router-sync 和 vue-class-component。

Vue.js 2.5新特性介绍(推荐)

错误提示

在2.4及更早版本中,通常使用全局 config.errorHandleroption 来处理应用程序中的意外错误。当然,还可以使用renderError 组件选项来处理渲染函数中的错误。

而在新版本中,vue引入了errorCaptured 钩子,具有此钩子的组件捕获其子组件树(不包括其自身)中的所有错误(不包括在异步回调中调用的那些)。这和React的思想是一致的。

要利用 errorCaputerd,可以封装一个通用组件,来包含其他的业务组件,来捕获业务组件内的异常,并做对应的展示处理。下面列一个官方给的简单示例,封装一个通用组件(ErrorBoundary)来包含和处理其他业务组件(another component)的异常。

Vue.component('ErrorBoundary', {
 data: () => ({ error: null }),
 errorCaptured (err, vm, info) { 
 this.error = `${err.stack}\n\nfound in ${info} of component`
 return false
 },
 render (h) { 
 if (this.error) {  
  return h('pre', { style: { color: 'red' }}, this.error)
 } 
 // ignoring edge cases for the sake of demonstration
 return this.$slots.default[0]
 }
})
<error-boundary>
 <another-component />
</error-boundary>

errorCaputed参数传递主要有如下的特性:

如果定义了全局的 errorHandler,所有的异常还是会传递给 errorHadnler,如果没有定义
errorHandler,这些异常仍然可以报告给一个单独的分析服务。

如果一个组件上通过继承或父组件定义了多个 errorCapured 钩子函数,这些钩子函数都会收到同样的异常信息。
可以在 errorCapured 钩子内 return false 来阻止异常传播,表示:该异常已经被处理,可忽略。而且,也会阻止其他的 errorCapured 钩子函数和全局的 errorHandler 函数触发这个异常。

SFC 函数式组件

通过 vue-loader v13.3.0 或以上版本,支持在单文件组件内定义一个“函数式组件”,且支持模板编译、作用域 CSS 和 热部署等功能。

函数式组件的定义,需要在 template 标签上定义 functional 属性来声明。且模板内的表达式的执行上下文是 函数式声明上下文,所以要访问组件的属性,需要使用 props.xxx 来获取。例子见下:

<template functional>
 <div>{{ props.msg }}</div>
</template>

与环境无关的服务端渲染(SSR 环境)

使用 vue-server-renderer 来构建 SSR 应用时,默认是需要一个 Node.js 环境的,使得一些像 php-v8js 或 Nashorn 这样的 JavaScript 运行环境下无法运行。v2.5 中对此进行了完善,使得上述环境下都可以正常运行 SSR 应用。

在 php-v8js 和 Nashorn 中,在环境的准备阶段需要模拟 global 和 process 全局对象,并且需要单独设置 process 的环境变量。需要设置 process.env.VUE_ENV 为 “server”,设置 process.env.NODE_ENV 为 “development” 或 “production”。

另外,在 Nashorn 中,还需要用 Java 原生的 timers 为 Promise 和 settimeout 提供一个 polyfill。官方给出了一个在 php-v8js 中的使用示例,如下:

<?php
$vue_source = file_get_contents('/path/to/vue.js');
$renderer_source = file_get_contents('/path/to/vue-server-renderer/basic.js');
$app_source = file_get_contents('/path/to/app.js');
$v8 = new V8Js();
$v8->executeString('var process = { env: { VUE_ENV: "server", NODE_ENV: "production" }}; this.global = { process: process };');
$v8->executeString($vue_source);
$v8->executeString($renderer_source);
$v8->executeString($app_source);
?>
// app.js
var vm = new Vue({
 template: `<div>{{ msg }}</div>`,
 data: {
 msg: 'hello'
 }
})
// exposed by vue-server-renderer/basic.js
renderVueComponentToString(vm, (err, res) => {
 print(res)
})

Vue.js 这款渐进式的 JavaScript 框架自 2013 年发布至今,其简洁的语法设计、轻量快速的特点深受技术社区喜爱,在国内外都获得了非常广泛的应用及拓展,比如饿了么的开源组件库 Element UI 即是 根据Vue 开发的,而阿里巴巴的 Weex 与 Vue 也多有合作,而美团点评的mpVue也是比较出色的一款框架。

v-on 修饰符

键值 key 自动修饰符

在 Vue v2.5 之前的版本中,如果要在 v-on 中使用没有内置别名的键盘键值,要么直接使用 keyCode 当修饰符(@keyup.13=”foo”),要么需要使用 config.keyCodes 来为键值注册别名。在 v2.5中,你可以直接使用合法的键值 key 值(参考MDN中的 KeyboardEvent.key)作为修饰符来串联使用它。如下:

<input @keyup.page-down="onPageDown">

上述例子中,事件处理函数只会在 $event.key === ‘PageDown' 时被调用。

注意:现有键值修饰符仍然可用。在IE9中,一些键值(.esc 和 方向键的 key)不是一致的值,如果要兼容 IE9,需要按 IE9 中内置的别名来处理。

.exact 修饰符

新增了一个 .exact 修饰符,该修饰符应该和其他系统修饰符(.ctrl, .alt, .shift and .meta)结合使用,可用用来区分一些强制多个修饰符结合按下才会触发事件处理函数。如下:

<!-- 当 Alt 或 Shift 被按下也会触发处理函数 -->
<button @click.ctrl="onClick">A</button>
<!-- 只有当 Ctrl 被按下,才会触发处理函数 -->
<button @click.ctrl.exact="onCtrlClick">A</button>

简化 Scoped Slots 的使用

之前,如果要在 template 标签上使用 scope 属性定义一个 scoped slot,可以像下面这样定义:

<comp>
 <template scope="props">
 <div>{{ props.msg }}</div>
 </template>
</comp>

在 v2.5 中,scope 属性已被弃用(仍然可用,但是会爆出一个警告,就像本文文首的那样),我们使用 slot-scope 属性替代 scope 属性来表示一个 scoped slot,且 slot-scope 属性除了可以被用在 template 上,还可以用在标签元素和组件上。如下:

<comp>
 <div slot-scope="props">
 {{ props.msg }}
 </div>
</comp>

注意:这次的调整,表示 slot-scope 已经是一个保留属性了,不能再被单独用在组件属性上了。

Inject 新增默认值选项

本次调整中,Injections 可以作为可选配置,并且可以声明默认值。也可以用 from 来表示原属性。

export default {
 inject: {
 foo: {
  from: 'bar',
  default: 'foo'
 }
 }
}

与属性类似,数组和对象的默认值需要使用一个工厂函数返回。

export default {
 inject: {
 foo: {
  from: 'bar',
  default: () => [1, 2, 3]
 }
 }
}

总结

以上所述是小编给大家介绍的Vue.js 2.5新特性介绍,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
javascript十个最常用的自定义函数(中文版)
Sep 07 Javascript
JavaScript 组件之旅(一)分析和设计
Oct 28 Javascript
了解jQuery技巧来提高你的代码
Jan 08 Javascript
js 动态为textbox添加下拉框数据源的方法
Apr 24 Javascript
js读取json的两种常用方法示例介绍
Oct 19 Javascript
JS DOM实现鼠标滑动图片效果
Sep 17 Javascript
javascript高级选择器querySelector和querySelectorAll全面解析
Apr 07 Javascript
vuejs2.0实现分页组件使用$emit进行事件监听数据传递的方法
Feb 22 Javascript
Angularjs渲染的 using 指令的星级评分系统示例
Nov 09 Javascript
Vue的watch和computed方法的使用及区别介绍
Sep 06 Javascript
vue项目两种方式实现竖向表格的思路分析
Apr 28 Vue.js
vue route新窗口跳转页面并且携带与接收参数
Apr 10 Vue.js
Vue 2.5 Level E 发布了: 新功能特性一览
Oct 24 #Javascript
浅谈在vue项目中如何定义全局变量和全局函数
Oct 24 #Javascript
Angularjs添加排序查询功能的实例代码
Oct 24 #Javascript
详解基于Vue+Koa的pm2配置
Oct 24 #Javascript
Vue.js2.0中的变化小结
Oct 24 #Javascript
使用Node.js实现ORM的一种思路详解(图文)
Oct 24 #Javascript
分享vue.js devtools遇到一系列问题
Oct 24 #Javascript
You might like
几款免费开源的不用数据库的php的cms
2010/12/19 PHP
PHP实现生成透明背景的PNG缩略图函数分享
2014/07/08 PHP
php实现用于计算执行时间的类实例
2015/04/18 PHP
laravel学习笔记之模型事件的几种用法示例
2017/08/15 PHP
PHP使用Nginx实现反向代理
2017/09/20 PHP
防止网站内容被拷贝的一些方法与优缺点好处与坏处分析
2007/11/30 Javascript
jquery获取iframe中的dom对象(两种方法)
2013/07/02 Javascript
JQuery Highcharts 动态生成图表的方法
2013/11/15 Javascript
js中top的作用深入剖析
2014/03/04 Javascript
JavaScript sup方法入门实例(把字符串显示为上标)
2014/10/20 Javascript
jQuery构造函数init参数分析续
2015/05/13 Javascript
JavaScript实现广告的关闭与显示效果实例
2015/07/02 Javascript
JS实现的简易拖放效果示例
2016/12/29 Javascript
vue实现动态数据绑定
2017/04/28 Javascript
vue.js 使用v-if v-else发现没有执行解决办法
2017/05/15 Javascript
使用InstantClick.js让页面提前加载200ms
2017/09/12 Javascript
详解微信小程序中的页面代码中的模板的封装
2017/10/12 Javascript
浅谈FastClick 填坑及源码解析
2018/03/02 Javascript
在react项目中使用antd的form组件,动态设置input框的值
2020/10/24 Javascript
python中使用xlrd、xlwt操作excel表格详解
2015/01/29 Python
分享Python字符串关键点
2015/12/13 Python
pycharm配置pyqt5-tools开发环境的方法步骤
2019/02/11 Python
使用pyqt 实现重复打开多个相同界面
2019/12/13 Python
keras 使用Lambda 快速新建层 添加多个参数操作
2020/06/10 Python
python如何从键盘获取输入实例
2020/06/18 Python
欧洲最大的笔和书写专家:The Pen Shop
2017/03/19 全球购物
Moda Italia荷兰:意大利男士服装
2019/08/31 全球购物
大学在校生求职信范文
2013/11/21 职场文书
2014全国两会学习心得体会2000字
2014/03/10 职场文书
网络管理专业求职信
2014/03/15 职场文书
搞笑爱情保证书
2014/04/29 职场文书
2014年酒店工作总结范文
2014/11/17 职场文书
2014年最新版离婚协议书范本
2014/11/25 职场文书
2016年“我们的节日·中秋节”活动总结
2016/04/05 职场文书
nginx 多个location转发任意请求或访问静态资源文件的实现
2021/03/31 Servers
浅析CSS在DevTools 中架构演变
2021/10/05 HTML / CSS