首頁 > web前端 > js教程 > Vue.js 2.5新特性分享

Vue.js 2.5新特性分享

小云云
發布: 2018-01-20 17:08:18
原創
1447 人瀏覽過

本文主要和大家分享Vue.js 2.5新特性,Vue 2.5 Level E 已發布,在原來2.x的基礎上做了很多相應改進和對bug 的修復,目前2.5 系列最新的版本為2.5. 2,本文為大家介紹vue 2.5 新特徵,需要的朋友參考下吧,希望能幫助大家。

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, 38858,380, 385,0085, eprove closes #6771

improve option type checks b7105ae

功能元件

compiled templates for functional component support ea0d227

##scoped CSS support for functional supports 050bb33

伺服器端渲染

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

add shouldPrefetch option (same signature as shouldcreload)

addP89, 777b

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

now ships an environment-agnostic build of the server renderer in v-server renderr. .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。

错误提示

在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>
 <p>{{ props.msg }}</p>
</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(&#39;/path/to/vue.js&#39;);
$renderer_source = file_get_contents(&#39;/path/to/vue-server-renderer/basic.js&#39;);
$app_source = file_get_contents(&#39;/path/to/app.js&#39;);
$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: `<p>{{ msg }}</p>`,
 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">
 <p>{{ props.msg }}</p>
 </template>
</comp>
登入後複製

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

<comp>
 <p slot-scope="props">
 {{ props.msg }}
 </p>
</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的组件和模板详解

vue.js项目打包上线的图文讲解

Vue.js在数组中插入重复数据详解

以上是Vue.js 2.5新特性分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板