首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Vue 2.6尝鲜

Vue 2.6尝鲜

作者头像
前端知否
发布于 2020-03-23 09:50:07
发布于 2020-03-23 09:50:07
76203
代码可运行
举报
文章被收录于专栏:前端知否前端知否
运行总次数:3
代码可运行

昨天Vue 2.6 "Macross" 发布了,同时也是Vuejs五周年~

在这篇文章中,将会介绍新版本的新特性, 比如 slots的新语法, Vue.observable()等等

1. Scoped slots(作用域插槽)的新语法

这是一个比较重大的改变,包含的有:

  • v-slot新指令,结合了 slotslot-scope的功能
  • scoped slots的简写

之前Vue@2.5.22中是这样使用 scoped-slots的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
   <TestComponent>
     <! - 默认 scoped slot ->
     <div slot-scope="{message}">
       {{`Default slot with message: ${message}`}}
     </ div>
     <! - 具名 scoped slot ->
     <div slot="text" slot-scope="{text}">
       {{`Named slot with text: ${text}`}}
     </ div>
   </ TestComponent>
</ template>

现在是这样的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
   <TestComponent>
     <! - 默认 scoped slot ->
     <template v-slot="{message}">
       <div>
         {{`Default slot with message: ${message}`}}
       </ div>
     </ template>
     <! - 具名 scoped slot ->
     <template v-slot:text="{text}">
       <div>
         {{`Named slot with text: ${text}`}}
       </ div>
     </ template>
   </ TestComponent>
</ template>

默认插槽:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
   <! - v-slot is used directly on the parent ->
   <TestComponent v-slot="{message}">
     <div>
       {{`Default slot with message: ${message}`}}
     </ div>
   </ TestComponent>
</ template>

具名插槽:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
   <TestComponent>
     <! - # 简写: ->
     <template #text="{text}">
       <div>
         {{`Named slot with text: ${text}`}}
       </ div>
     </ template>
   </ TestComponent>
</ template>

新版中,可以不使用任何作用域插槽变量,但是仍然可以通过父组件的 $scopedSlots去引用到

2. 动态参数指令

如果我们想在 v-bind or v-on中使用动态变量,在Vue@2.5.22中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div v-bind="{ [key]: value }"></div>
<div v-on="{ [event]: handler }"></div>

但是这个例子有几个缺点:

  • 不是所有人都知道在 v-bind/v-on中可以使用动态变量名
  • vue-template-compiler 生成了低效的代码
  • v-slot没有类似的使用对象的语法

为了解决这些问题, Vue@2.6.0引入了一个新语法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div v-bind:[key]="value"></div>
<div v-on:[event]="handler"></div>

举个例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
   <div>
     <! - v-bind 动态key ->
     <div v-bind:[key]="value"> </ div>

     <! - 简写 ->
     <div :[key]="value"> </ div>

     <! - v-on 动态事件,event变量 ->
     <div v-on:[event]="handler"> </ div>

     <! - 简写 ->
     <div @[event]="handler"> </ div>

     <! - v-slot 动态名字 ->
     <TestComponent>
       <template v-slot:[name]>
         Hello
       </ template>
     </ TestComponent>

     <! - 简写 ->
     <TestComponent>
       <template #[name]>
         Cool slot
       </ template>
     </ TestComponent>
   </ div>
</ template>

3. 使用Vue.observable()创建一个响应对象

之前,创建一个响应对象,必须在一个Vue实例中配置。现在我们可以在Vue实例外部,通过使用 Vue.observable(data)创建,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import vue from vue;
const state = Vue.observable ({
   counter: 0,
});
export default {
   render () {
     return (
       <div>
         {state.counter}
           <button v-on:click={() => {state.counter ++; }}>
           Increment counter
         </ button>
       </ div>
     );
   },
};

4. server端获取数据

在新的升级版本中, vue-server-renderer改变了SSR的数据加载策略。

之前,我们推荐使用 asyncData()router.getMatchedComponents()方法中获取的组件中,获取数据。

新版本中有一个特别的组件方法: serverPrefetch() 。vue-server-renderer会在每个组件中调用它,它会返回一个promise。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
   <div v-if="item">
     {{item.name}}
   </ div>
</ template>
<script>
export default {
   // Call on the server
   async serverPrefetch () {
     await this.fetchItem();
   },
   computed: {
     item () {
       return this.$store.state.item;
     },
   },
   // Call on client
   mounted () {
     if (!this.item) {
       this.fetchItem();
     }
   },
   methods: {
     async fetchItem () {
       await this.$store.dispatch('fetchItem');
     },
   },
};
</ script>

serverPrefetch()执行之后,我们需要知道应用在什么时候渲染完成,在server render 上下文中,我们可以使用 rendered()钩子方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/ * Simplified entry-server.js * /
import {createApp} from './app';
export default context => new Promise ((resolve, reject) => {
   const {app, router, store} = createApp();
   const {url} = context;
   router.push(url);
   router.onReady(() => {
     context.rendered = () => {
       context.state = store.state;
     };
     resolve (app);
   }, reject);
});

5. 改进的错误输出

render方法中编译html, vue-template-compiler可能会产生错误。在之前,Vue会产生一个没有位置的错误描述。新版本中会展示这个错误出现在哪里,比如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
  <div>
    <template key="test-key">
      {{ message }}
    </template>
  </div>
</template>

vue-template-compiler@2.5.22中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Error compiling template:
<div>
    <template key="test-key">
      {{ message }}
    </template>
  </div>
- <template> cannot be keyed. Place the key on real elements instead.

vue-template-compiler@2.6.0中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Errors compiling template:
<template> cannot be keyed. Place the key on real elements instead.
1  |
2  |  <div>
3  |    <template key="test-key">
   |              ^^^^^^^^^^^^^^
4  |      {{ message }}
5  |    </template>

6. 捕捉异步错误

现在Vue可以在生命周期方法钩子和事件方法中捕捉到异步错误异常。比如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/ * TestComponent.vue * /
<template>
   <div @click="doSomething()">
     Some message
   </ div>
</ template>
<script>
export default {
   methods: {
     async doSomething () {
       await this.$nextTick ();
       throw new Error ('Another Error');
     },
   },
   async mounted () {
     await this.$nextTick ();
     throw new Error ('Some Error');
   },
};
</ script>

mount后错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[Vue warn]: Error in mounted hook (Promise/async): "Error: Some Error"

点击事件后错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[Vue warn]: Error in v-on handler (Promise/async): "Error: Another Error"

7. ESM 浏览器中的新版构建

新版本中,增加了一个vue.esm.browser.js。它是为了支持ES6 Modules的浏览器设计的。

特性:

  • 在render函数中,包含HTML编译器
  • 使用ES6模块语法
  • 包含非副本代码(non-transcript)

举例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<html lang="en">
   <head>
     <title> Document </ title>
   </ head>
   <body>
     <div id="app">
       {{message}}
     </ div>
     <script type="module">
       import Vue from 'path/to/vue.esm.browser.js';
       new Vue {{
         el: '#app',
         data () {
           return {
             message: 'Hello World!',
           };
         },
       });
     </ script>
   </ body>
</ html>

8. v-bind.prop简写

v-bind指令有一个特殊的修饰符--- .prop。你可以在文档中查看具体用法。我自己从没使用过,暂时也想不到在什么时候使用。

现在有一个简写方式,对于 v-bind:someProperty.prop="foo", 可以写成 .someProperty="foo"

Vue@2.5.22中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
   <div>
     <div v-bind:textContent.prop="'Important text content'" />
     <! - 简写版本 ->
     <div: textContent.prop="'Important text content'" />
   </ div>
</ template>

Vue@2.6.0:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
  <div .textContent="'Important text content'" />
</template>

9. 支持自定义toString()

规则很简单:如果重写了对象的 toString()方法,显示的时候,Vue将使用它,而不是 JSON.stringify()

举例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/ * TestComponent.vue * /
<template>
   <div>
     {{message}}
   </ div>
</ template>
<script>
export default {
   data () {
     return {
       message: {
         value: 'qwerty',
         toString () {
           return 'Hello Habr!';
         },
       },
     };
   },
};
</ script>

Vue@2.5.22中显示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{ "value": "qwerty" }

Vue@2.6.0:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Hello Habr!

10. v-for和可迭代对象

在新版本中, v-for可以遍历任何实现了[iterable 协议]的对象,比如Map, Set

2.X版本中,Map和Set, 不支持数据响应。

举例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/ * TestComponent.vue * /
<template>
   <div>
     <div
       v-for="item in items"
       :key="item"
     >
       {{item}}
     </ div>
   </ div>
</ template>
<script>
export default {
   data () {
     return {
       items: new Set([4, 2, 6]),
     };
   },
};
</ script>
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-02-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端知否 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
vue2升级vue3:Vue2/3插槽——vue3的jsx组件插槽slot怎么处理
vue 在 2.6 版本中,对插槽使用 v-slot 新语法,取代了旧语法的 slot 和 slot-scope,并且之后的 Vue 3.0 也会使用新语法,这并不是仅写法的不同,还包括了性能的提升
周陆军博客
2022/06/24
2.5K0
10个简单的技巧让你的 vue.js 代码更优雅
作为深度代码洁癖,我们都希望能写出简单高效的代码,让我们的代码看起来更加优雅,让我们抛弃繁杂的代码,一起开启简单的旅程~~
王小婷
2020/11/10
1.2K0
Vue 开发必须知道的 36 个技巧【近1W字】
Vue 3.x 的Pre-Alpha 版本。后面应该还会有 Alpha、Beta 等版本,预计至少要等到 2020 年第一季度才有可能发布 3.0 正式版; 所以应该趁还没出来加紧打好 Vue2.x 的基础; Vue基本用法很容易上手,但是有很多优化的写法你就不一定知道了,本文从列举了 36 个 vue 开发技巧; 后续 Vue 3.x 出来后持续更新.
火狼1
2019/10/09
1.3K0
一个合格的中级前端工程师应该掌握的 20 个 Vue 技巧
之前写过一篇文章,关于 Vue 属性透传的,文章中我列举了很多种方法去实现属性透传。其中包括直接设置 props,v-bind="$attrs",render function 等方式。感兴趣,详情看 【Vue 进阶】——如何实现组件属性透传?
GopalFeng
2020/09/24
6.2K0
一个合格的中级前端工程师应该掌握的 20 个 Vue 技巧
【转载】vue 3.x 如何有惊无险地快速入门 —— 一文扫遍 vue2 与 3 的差异点
虽然 vue2 到 vue3 的实现大改,但在用法上变化基本不大,比较明显的一个变化就是添加了 setup(){} 函数了,几乎所有的配置变成了以函数的方式进行定义。即使是这样,但小改动还是很多的。本文主要分享的是 vue 2.x 与 vue 3.x 之间一些常见用法的差异。虽然记录的不多,但也不算少。本文资料来源:github.com/vuejs/rfcs/…
FungLeo
2020/05/27
2.1K0
【转载】vue 3.x 如何有惊无险地快速入门 —— 一文扫遍 vue2 与 3 的差异点
前端系列13集-内置内容,单文件组件,进阶 API
在你的站点上动态渲染任意的 HTML 是非常危险的,因为它很容易导致 [XSS 攻击]。请只对可信内容使用 HTML 插值,绝不要将用户提供的内容作为插值
达达前端
2023/10/08
4650
1.1、文本插值
Vue 使用一种基于 HTML 的模板语法,使我们能够声明式地将其组件实例的数据绑定到呈现的 DOM 上。所有的 Vue 模板都是语法层面合法的 HTML,可以被符合规范的浏览器和 HTML 解析器解析。
张果
2022/11/12
9.2K0
1.1、文本插值
Vue3开发之components组件
开发过程中我们会经常遇到一些复杂的页面,而这些页面大部分由一个个小部分组合起来的,而且不同页面中可能有些部分是一样的,所以我们通常会将这些部分封装成组件。在Vue中,我们可以使用components组件(模板)来实现。
BennuCTech
2023/09/01
2.7K0
Vue3开发之components组件
Web前端-Vue.js必备框架(三)
vue是一款渐进式javascript框架,由evan you开发。vue成为前端开发的必备之一。
达达前端
2019/07/03
1.8K0
Web前端-Vue.js必备框架(三)
7 个有用的 Vue 开发技巧
随着组件的细化,就会遇到多组件状态共享的情况, Vuex 当然可以解决这类问题,不过就像 Vuex 官方文档所说的,如果应用不够大,为避免代码繁琐冗余,最好不要使用它,今天我们介绍的是 vue.js 2.6 新增加的 Observable API ,通过使用这个 api 我们可以应对一些简单的跨组件数据状态共享的情况。
夜尽天明
2019/06/17
5670
7 个有用的 Vue 开发技巧
浅学Vue3
NPM的全称是Node Package Manager,是一个NodeJS包管理和分发工具,已经成为了非官方的发布Node模块(包)的标准。2020年3月17日,Github宣布收购npm,GitHub现在已经保证npm将永远免费。
QGS
2024/01/14
4370
Vue 2.6 全新的slot语法
2019年大年三十,Vue 2.6发布,其中改动最大的就是slot(插槽),今天为大家分析一下最新版的slot。
用户1687375
2019/05/06
4.1K0
Vue 2.6 全新的slot语法
vue课程大全
var app=new Vue({el:"#app",data:{msg:"hello vue!"}})
李才哥
2021/02/20
1.7K0
vue课程大全
【可视化】Vue基础
Vue框架,框架的作者,尤雨溪,组件化,快速开发的特点。 生命周期 beforeCreate:组件刚刚被创建 created:组件创建完成 生成
达达前端
2019/12/20
6290
【可视化】Vue基础
Vue学习笔记---暂保存
当我们创建这样一个Vue实例后,它就挂在到了一个id为app的dom对象上,我们就不再需要和HTML直接交互了,我们仅仅需要利用Vue实例操作即可
名字是乱打的
2021/12/23
3.1K0
Vue学习笔记---暂保存
插槽slot
上面代码中,组件标签内的h1是要插入子组件内部的元素,子组件内使用slot标签接收父组件插入的h1标签。
小小杰啊
2022/12/21
7680
Vue进阶——组件化开发
类似微服务的软件架构,在前端开发中,一个页面的实现往往十分复杂,我们可以将一个页面划分为多个块,每个块负责相应的功能,块之间通过通信来交互。这样的前端开发方式正是组件化开发,一个页面是一个大的组件树,其下又划分有很多小的组件。这样一来,不仅降低了一次开发的难度,而且避免了重复造轮子,组件可以灵活的嵌入其他的Vue项目中进行使用。
matt
2022/10/25
1.2K0
Vue进阶——组件化开发
Vue常用内置指令
v-show指令根据表达式的真假,显示或隐藏HTML元素。   使用v-show指令,元素本身是要被渲染的,至于是否显示是通过设置CSS样式属性display来控制的,如果表达式的值为false,则设置样式:"display:none"
别团等shy哥发育
2023/02/25
4640
Vue常用内置指令
「.vue文件的编译」3. 模板编译之AST生成
下面parseHTML方法是用来遍历html字符串的并解析出标签(当然包含标签中的属性)、文本等信息,详细分析参考这里。
tinyant
2023/02/24
1.4K0
vue之vue组件component整理
组件是可复用的 Vue 实例,且带有一个名字:在这个例子中是。我们可以在一个通过 new Vue 创建的 Vue 根实例中,把这个组件作为自定义元素来使用:
山行AI
2019/07/30
6.9K0
vue之vue组件component整理
相关推荐
vue2升级vue3:Vue2/3插槽——vue3的jsx组件插槽slot怎么处理
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档