详解 Vue 2.4.0 带来的 4 个重大变化
在这篇文章中,我将跟大家分享4个有突破性新特性。
- 服务端渲染异步组件
- 包裹组件内实现属性继承
- 异步组件支持webpack3
- 组件渲染后可保留HTML注释
1、服务端渲染异步组件
在vue2.4.0以前版本,由于无法支持服务端渲染异步组件,导致他们通常在SSR中被忽略,只能等待在客户端渲染。新版本使异步组件有着突破性的进展,同时修复这问题可以让Vue更好的实现PWAs。
异步组件
异步组件是非常方便的,简而言之,它能让你的应用代码分离,使非必要组件(比如模态,选项卡,折叠内容,其他页面等)在首页加载后延迟加载, 从而让用户更快的看到主页。
假如你决定以异步方式加载内容,主组件可能如下所示:
<template>
<div id="app">
<!--Above-the-fold-->
<sync-component></sync-component> <!--Below-the-fold-->
<async-component></async-component>
</div>
</template>
<script> import SyncComponent from './SyncComponent.vue';
const AsyncComponent = import('./AsyncComponent.vue'); export default {
components: {
SyncComponent,
AsyncComponent
}
}
</script>
通过使用webpack的动态import 函数,可使异步组件将在服务端页面后,通过ajax请求被加载。不足就是,当加载中用户可能只能看到微调框或者是空白区域。
这可以通过服务端渲染来改进,被标记的异步组件可以在初始页面内渲染,避免出现微调框或者空白区域,提高用户体验。
VUE2.4.0增加server-rendered属性使其变得可能。SSR中主组件输出如下。
<div id="app" server-rendered="true">
<!--Above-the-fold-->
<div>
Whatever sync-component renders as...
</div>
<!--Below-the-fold-->
</div>
从VUE2.4.0开始,异步组件将被包含在SSR输出内容中,因此你有无白屏用户体验的进行VUE程序代码分离。
2、组件内新增实现属性继承
VUE中一个比较令人烦恼的事情是属性只能从父组件传递给子组件。这也就意味着当你想向嵌套层级比较深组件数据传递,只能由父组件传递给子组件,子组件再传递给孙子组件...像下面这样
<parent-component :passdown="passdown">
<child-component :passdown="passdown">
<grand-child-component :passdown="passdown">
Finally, here's where we use {{ passdown }}!
demo中只有一两个属性还好,试想一下,当在一个真实的项目中,你可能有非常非常多的属性需要传递时,那是怎样一种恐怖的场景。
事件总线模式或者vuex也可以解决跨非直接父子组件通信的问题,但VUE2.4.0版本提供了一种新的解决方案。事实上,这个新功能是有两个独立却相关的部分组成,首先,组件支持inheritAttrs的选项,其次需用到实例属性$attrs。我们通过一个例子来看它是如何工作的。
例子
我们首先绑定两个属性在组件上,propa是组件自己需要使用的,而propb只是组件需要向下传递的一个属性
<my-component :propa="propa" :propb="propb"></my-component>
在Vue2.4.0之前版本,组件内未被注册的属性将作为普通html元素属性被渲染。所以你组件可能定义起来像是这样
<template>
<div>{{ propa }}</div>
</template>
<script>
export default {
props: [ 'propa' ]
}
</script>
它将渲染成下面的样子
<div propb="propb">propa</div>
propb仅仅被渲染普通html属性,如果想让属性能够向下传递,即使prop组件没有被使用,你也需要在组件上注册。
export default {
props: [
'propa',
'propb' // 注册后才能向下传递
]
}
这样做会使组件预期功能变得模糊不清,同时也难以维护组件的DRY。在Vue2.4.0,可以在组件定义中添加inheritAttrs:false,组件将不会把未被注册的propb呈现为普通的HTML属性。渲染效果如下:
<div>propa</div>
向下传递propb
虽然prop在组件中没有出现,但通过组件实例的$attrs(也是Vue2.4.0新增功能)获取。组件的$attrs包含所有未被注册的props
<template>
<div>
{{ propa }}
<grand-child v-bind:propb="$attrs.propb"></grand-child>
</div>
</template>
<script>
export default {
props: [ 'propa' ],
inheritAttrs: false
}
</script>
想象当你需要向多个嵌套层级中,传递上千百个属性时,这个特性使你的在每个中间组件属性定义变得相当简洁。
<input v-bind="$attrs">
当然,也可以通过这种方式用v-on绑定事件监听传递函数
<div>
<input v-bind="$attrs" v-on="$listeners">
</div>
3、异步组件支持webpack3
作用域提升是最近发布的webpack3的关键功能之一。webpack 1和2是将模块打包到一个独立的函数作用域内。通过新的ES2015模块语法实现的范围提升方法在浏览器中的执行速度,比老的独立范围的方式要快的多。
两个星期以前,vue-loaderv13.0.0发布了,并将.vue文件作为ES模块输出,这使得vue能够享受新的变量提升带来的便利。
由于ES模块导出方式不同,在Vue项目中用于代码拆分的简洁的异步组件语法
例如
const Foo = () => import('./Foo.vue');
// 将改为:
const Foo = () => import('./Foo.vue').then(m => m.default);
然而在Vue2.4.0在处理异步组件时,将自动解析为ES模块默认导出,允许以前更简洁的语法。
4、保留HTML注释
好吧,这个功能看起来并不是那么的重要,然我仍然觉得很酷。在Vue2.4.0之前版本,注释将被省略
<template>
<div>Hello <!--I'm a comment.--></div>
</template>
渲染后:
<div>Hello</div>
问题是,有些注释需要被渲染在页面中,有些库可能需要这些注释。
在Vue2.4.0,你可以使用comments选项开启注释
<template>
<div>Hello <!--I'm a comment.--></div>
</template>
<script>
export default {
comments: true
}
</script>
详解 Vue 2.4.0 带来的 4 个重大变化的更多相关文章
- 详解vue的数据binding原理
自从angular火了以后,各种mv*框架喷涌而出,angular虽然比较火,但是他的坑还是蛮多的,还有许多性能问题被人们吐槽.比如坑爹的脏检查机制,数据binding是受人喜爱的,脏检查就有点…性能 ...
- 详解Vue 方法与事件处理器
本篇文章主要介绍了详解Vue 方法与事件处理器 ,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 方法与事件处理器 方法处理器 可以用 v-on 指令监听 DOM 事件 ...
- 详解Vue中的computed和watch
作者:小土豆 博客园:https://www.cnblogs.com/HouJiao/ 掘金:https://juejin.cn/user/2436173500265335 1. 前言 作为一名Vue ...
- 详解Vue.js 技术
本文主要从8个章节详解vue技术揭秘,小编觉得挺有用的,分享给大家. 为了把 Vue.js 的源码讲明白,课程设计成由浅入深,分为核心.编译.扩展.生态四个方面去讲,并拆成了八个章节,如下: 准备工作 ...
- 详解vue 路由跳转四种方式 (带参数)
详解vue 路由跳转四种方式 (带参数):https://www.jb51.net/article/160401.htm 1. router-link ? 1 2 3 4 5 6 7 8 9 10 ...
- 详解Vue 如何监听Array的变化
详解Vue 如何监听Array的变化:https://www.jb51.net/article/162584.htm
- 详解Vue中的虚拟DOM
摘要: 什么是虚拟DOM? 作者:浪里行舟 Fundebug经授权转载,版权归原作者所有. 前言 Vue.js 2.0引入Virtual DOM,比Vue.js 1.0的初始渲染速度提升了2-4倍,并 ...
- 详解Vue中的插槽
作者: 小土豆 博客园:https://www.cnblogs.com/HouJiao/ 掘金:https://juejin.im/user/2436173500265335 什么是插槽 在日常的项目 ...
- 详解Vue的slot新用法
摘要: 理解Vue插槽. 作者:前端小智 原文:vue 2.6 中 slot 的新用法 Fundebug经授权转载,版权归原作者所有. 为了保证的可读性,本文采用意译而非直译. 最近发布不久的Vue ...
随机推荐
- Android SDK Manager配置
Android SDK Manager就是一个Android软件开发工具包管理器,就像一个桥梁,连通本地和服务器,从服务器下载安卓开发所需工具到本地. 而AVD Manager是一个Android虚拟 ...
- Java容器---List
List 承诺可以将元素维护在特定的序列中.List 接口在Collection的基础上添加了大量的方法,使得可以在List的中间插入和移除元素. 有两种类型的List: -----基本的 ...
- uEditor富文本编辑器
在配合vue和webpack使用时,在严格模式下注意会报错,需要修改配置. 我采用的方式:----不建议全部取消严格模式,因为一些插件必须要再严格模式才能运行的 对UEditor的严格模式报错文件,取 ...
- js间隔几秒弹出一次联系框
运行效果截图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/js-3-sec-alert-dlg-codes/ 具体代码如下: <html> < ...
- 学习整理与细化(1)——Internet 的域名系统(domain name system)
2015-09-20 整理人:承蒙时光 如有错误欢迎指教O(∩_∩)O谢谢 1.作用:提供主机符号符名与IP地址之间转换服务也称域名服务: 2..域名系统的层次型结构命名机制(服务器地址): 计算机名 ...
- Ubuntu16.04安装配置sublime text3
1.安装Sublime Text 3 首先添加sublime text 3的仓库: sudo add-apt-repository ppa:webupd8team/sublime-text-3 根据提 ...
- Nginx集群之SSL证书的WebApi微服务
目录 1 大概思路... 1 2 Nginx集群之SSL证书的WebApi微服务... 1 3 HTTP与HTTPS(SSL协议)... 1 4 Ope ...
- flex弹性布局语法介绍及使用
一.语法介绍 Flex布局(弹性布局) ,一种新的布局解决方案 可简单.快速的实现网页布局 目前市面浏览器已全部支持1.指定容器为flex布局 display: flex; Webkit内核的浏览器, ...
- JavaWeb项目中获取对Oracle操作时抛出的异常错误码
最近在项目中碰到了这么一个需求,一个JavaWeb项目,数据库用的是Oracle.业务上有一个对一张表的操作功能,当时设置了两个字段联合的唯一约束.由于前断没有对重复字段的校验,需要在插入时如果碰到唯 ...
- android利用adb安装应用程序出现“more than one device and emulator wait for device ”
今天,写自动化脚本时,因在这之前进行了一下真机版本的更新,还没有从电脑上拔出,就又在adt打开了一个AVD. 于是,自由自在的就去写脚本了,企图在emulator上装一个APK,在cmd窗口下,利用: ...