手摸手带你初探Vue 3.0

这篇具有很好参考价值的文章主要介绍了手摸手带你初探Vue 3.0。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 前言

距离Vue 3.0正式发布已经过去一段时间了,2月7日Vue团队正式宣布Vue 3正式成为新的默认版本。最近接触的新项目也使用Vue 3.0来开发,因此有必要对它进行一波总结和学习。

2 简介

在最开始的时候,Vue仅仅是一个运行时库。但经过多年的发展,它已经逐渐变成了一台包含许多子项目的框架。Vue的核心库只关注图层,不仅易于上手,还便于与第三方库或既有项目整合。那么Vue 3.0带来了哪些新的表现呢?

  • 重写了虚拟Dom
  • 编译模板的优化
  • 更高效的组件初始化
  • SSR速度提高了2~3倍
  • 更新性能提高了1.3~2倍
  • 看起来Vue 3相比于2性能上有了很大的提升,作为终端用户的我们,还是来看看代码是如何实现的吧。

3 新的特性

3.1 组合式API

Vue 2中采用的是Options API(选项式API),即在data、methods、computed、watch中分别写入代码,如果我们需要增加一个逻辑,就需要在这些选项中反复横跳,导致组件难以理解和阅读。Vue 3新增了setup选项,它是组合式API的入口。它将同一个逻辑关注点相关代码收集在一起,这样我们需要维护一个功能点的时候,就不需要去关心其他的逻辑。

举个例子

<template>
  <div>{{number}}</div>
  <button @click="add">Add</button>
</template>

<script>
import { ref } from 'vue'

export default {
  setup () {
    const number = ref(0)  //ref()函数使变量变为响应式
    const add = () => {
      number.value++   //使用ref创建的响应式变量需要加.value
    }
    return {  //返回的变量和方法可以在模板中直接使用
      number,  
      add
    }
  }
}
</script>

这看起来不就是把data、methods中的内容都放到setup里了吗,也没多大区别啊?其实,我们还可以把setup里面的内容分割成一个个独立的函数,每个函数负责独立的功能。这样,我们就可以在不同组件中进行复用,简洁代码,这才是组合式API的强大之处。

3.2 响应式API

3.2.1 ref

在上面的代码中我们使用了ref创建了响应式对象,它接受js基本类型或引用类型作为参数,返回的就是一个只包含名为value参数的RefImp对象。在setup函数中如果我们要使用该响应式对象,就需要加上.value。但是在模板中被渲染时,自动展开内部的值,因此不需要在模板中追加.value。

ref常用于基础类型,如果ref传入对象,其内部会转换为reactive进行处理。

import { ref } from "vue";
const str = ref("");
const male = ref(true);

str.value = "new val";
console.log(str.value);  //new val

male.value = false;
console.log(male.value)  //fals

3.2.2 reactive

reactive函数只接收object和array等复杂数据类型,它会返回一个proxy对象。reactive可以深层次递归,也就是如果发现展开的属性值是引用类型的而且被引用,还会用reactive递归处理。而且属性是可以被修改的。 proxy是es6中用于创建一个对象的代理函数,可以实现对目标对象的增删改查等基本操作的拦截和自定义。

const p=new Proxy(target,handler) //target是proxy包装的目标对象,handler是一个以函数作为属性的对象

简单模拟实现reactive实现响应式:

      const obj={a:1,b:2}
      const p=new Proxy(obj,{
          get(target,key){
            console.log(`p的${key}属性被访问了!`)
            return Reflect.get(target,key)
          },
          set(target,key,value){
            console.log(`p的${key}属性被修改了!`)
            return Reflect.set(target,key,value)
          },
          deleteProperty(target,key){
            console.log(`p的${key}属性被删除了!`)
            return Reflect.deleteProperty(target,key)
          }
        })

3.2.3 toRefs

通过上面的介绍我们已经知道了ref通常用来创建基础类型数据的双向绑定,reactive通常用来创建引用数据类型的双向绑定。除此之外,ref也可以创建复杂类型的双向绑定,而reactive不能代理基础类型。我们来看一个例子:

<template>
  <div>{{user.name}}</div>
  <div>{{user.age}}</div>
  <div>{{user.sex}}</div>
  <button @click="changeInfo">更改个人信息</button>
</template>

<script>
import { ref } from 'vue'

export default {
  setup () {
    const user = ref({name:'张三',age:'18',sex:'男'})  
    const changeInfo = () => {
      user.name.value='李四'
      user.age=20
      user.sex='女'
    }
    return {  
       user
    }
  }
}
</script>

上面的代码中我们绑定到页面使用的是user.name,user.age,这样写感觉很繁琐,那能通过解构解构user然后在模板中直接使用吗?答案是不能的,这样做会使user丢失掉响应式。但是通过使用toRefs,就可以直接使用解构后的数据了。 toRefs 用于将一个 reactive 对象转化为属性全部为 ref 对象的普通对象。具体使用方式如下:

<template>
  <div>{{name}}</div>
  <div>{{age}}</div>
  <div>{{sex}}</div>
  <button @click="changeInfo">更改个人信息</button>
</template>

<script>
import { ref } from 'vue'

export default {
  setup () {
    const user = ref({name:'张三',age:'18',sex:'男'})  
    const changeInfo = () => {
      user.name.value='李四'
      user.age=20
      user.sex='女'
    }
    return {  
       ...toRefs(user)  //使用toRefs
    }
  }
}

3.3 响应式侦听

watch 函数用来侦听特定的数据源,并在回调函数中执行副作用。默认情况是惰性的,也就是说仅在侦听的源数据变更时才执行回调。

watch(source,callback,[options])
  • source:可以支持 string,Object,Function,Array; 用于指定要侦听的响应式变量
  • callback:执行的回调函数
  • options:可选项,支持 deep、immediate 和 flush

监听单个数据源的用法:

import { reactive, ref, watch } from "vue";

const state = reactive({
  number:0,
  id:'01'
});
//侦听reative对象
watch(
  () => state.number,
  (newvalue, oldvalue) => {
    console.log(newvalue, oldvalue); //1 0
  }
);
state.number++;

const count = ref(0);
//侦听ref对象
watch(count, (count, prevCount) => {
  console.log(count, prevCount, "watch"); //2 0
});
count.value = 2

监听多个数据源的用法:

import { reactive, ref, watch } from "vue";


const state = reactive({
  number:0,
  id:'01'
});
const count = ref(0);
watch([count,()=>{state.number}],([curcount,precount],[curnumber,prenumber])=>{
  console.log(curcount,precount)  //2 0
  console.log(curnumber,prenumber) //1 0
})
state.number++
count.value=2

对于多层嵌套的引用对象,可以使用{deep:true}开启深度监听。否则仅能监听到外层数据变化。前面提到,默认清空下watch的回调函数是惰性的,只有当监听数据变化时才会执行。当配置{immediate: true}时,可以立即执行回调函数。

3.4 生命周期

在Vue2中有8个生命周期函数:

  • beforeCreate
  • created
  • beforeMount
  • mounted
  • beforeUpdate
  • updated
  • beforeDestroy
  • destroyed

在vue3中,新增了一个setup生命周期函数,setup执行的时机是在beforeCreate生命函数之前执行,因此在这个函数中是不能通过this来获取实例的;同时为了命名的统一,将beforeDestroy改名为beforeUnmount,destroyed改名为unmounted,因此vue3有以下生命周期函数:

  • beforeCreate -> 不需要
  • created -> 不需要
  • beforeMount -> onBeforeMount
  • mounted -> onMounted
  • beforeUpdate -> onBeforeUpdate
  • updated -> onUpdated
  • beforeUnmount -> onBeforeUnmount
  • unmounted -> onUnmounted
  • errorCaptured -> onErrorCaptured
  • renderTracked -> onRenderTracked
  • renderTriggered -> onRenderTriggered

4 总结

通过对以上知识的总结对Vue 3有了进一步的认识,基本能够满足项目开发。更多的改动大家可以自行查阅官方文档和阅读源码,相信Vue 3能给我们带来更多新的体验。

作者:京东物流 颜之婷

来源:京东云开发者社区 自猿其说Tech文章来源地址https://www.toymoban.com/news/detail-599847.html

到了这里,关于手摸手带你初探Vue 3.0的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 手摸手教你写任务中心-积分领取&消耗&回收

    继上一篇签到任务之后呢, 就有朋友让我写一下任务积分的领取和使用, 以及回收; 其实前面两种都不难, 就只是积分的加减而已, 真正麻烦的是回收, 有回收的话你就需要考虑到每笔积分存在多种状态的可能了; 明细表(mysql) 记录积分的每一笔获取, 消耗的回收的记录, 并且回收

    2024年02月08日
    浏览(55)
  • 手摸手2-springboot编写基础的增删改查

    创建controller层 实现 test 表中的添加、修改、删除及列表查询接口(未分页) 添加service层接口 service层实现 添加mapper层 mapper层对应的sql 添加扫描注解,对应sql文件的目录

    2024年02月10日
    浏览(46)
  • 手摸手教你把Ingress Nginx集成进Skywalking

    在微服务大行其道的今天,如何观测众多微服务、快速理清服务间的依赖、如何对服务之间的调用性能进行衡量,成了摆在大家面前的难题。对此,Skywalking应运而生,它是托管在 Apache 基金会下的开源项目,旨在帮助开发者监控分布式程序的性能、了解各个服务的调用关系和

    2024年04月23日
    浏览(33)
  • 手摸手接入Github实现Oauth2第三方登录

    最近在学习oauth2授权登录流程,oauth2简单来说就是接入第三方应用(qq、微信、github、gitee等),不用在本站登录,而是去请求第三方应用的用户信息完成登录。 下面就一起来看一下如何接入github实现第三方登录 首先,我们需要在github中添加OAuth App,登录你的github(如果还有

    2024年02月04日
    浏览(69)
  • 泰裤辣!!!手摸手教学,如何训练一个你的专属AI歌姬~

    最近在做AIGC的项目,不过是与图片相关的,现在的模型效果可比前几年图片替换效果好多了。之前尝试过用 faceswap 工具来进行人脸替换的,具体可以参看下我之前的这篇文章:https://blog.csdn.net/sinat_26918145/article/details/79591717   现代的模型对于图生图的支持效果已经非常好了,

    2024年02月06日
    浏览(58)
  • 使用 Burp Suite 暴力破解密码 撞库攻击 从0到1手摸手教学

    一个学习的过程 增加自己网络安全知识 切勿用于违法用途 设置密码尽量使用6位以上并规避简单数字组合、加强对同一ip的频繁访问次数限制、设置人机验证减小撞库攻击的危害 本地环境 kali 2022 Burp Suite FireFox 靶机环境 一台服务器 CentOS 7 宝塔面板 一个域名(你不会没有吧)

    2024年02月09日
    浏览(41)
  • 【AI帮我写代码,上班摸鱼不是梦】手摸手图解CodeWhisperer的安装使用

    除了借助ChatGPT通过问答的方式生成代码,也可以通过IDEA插件在写代码是直接帮助我们生成代码。 目前,IDEA插件有CodeGeeX、CodeWhisperer、Copilot。其中,CodeGeeX和CodeWhisperer是完全免费的,Copilot是收费的,每月10美元。 下面我们来了解CodeWhisperer的安装和使用,如果你还想了解其他

    2024年02月11日
    浏览(46)
  • 45天带你玩转Node(第一天)初探Node.js

    45天带你玩转Node 粉丝要求博主系统的写一篇关于Node.js的学习资料,但其实我们的Node.js知识点并不少,所以博主为大家搭建了一个专栏,为了方便大家系统的学习Node.js,大家记得订阅哦!虽然我们的Node.js还很年轻,但是他也已经有了很高的地位,让我们尽情的畅游在Node.js的

    2024年02月12日
    浏览(54)
  • 大数据小白初探HDFS架构原理:带你揭秘背后的真相(一)

             目录 1.前言 2. HDFS架构 2.1 架构定义 2.2 揭秘架构 2.3 HDFS核心结构  3. HDFS 的优缺点         3.1 HDFS 的优点         3.2 HDFS 的缺点 4. HDFS 的应用场景 5. 总结         前面的文章写了一篇,大数据方面的基础知识,目的是希望大数据小白可以对大数据能有个清楚

    2024年02月21日
    浏览(48)
  • 【Vue】快速上手--Vue 3.0

    Vue (发音为 /vjuː/,类似  view ) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。无论是简单还是复杂的界面,Vue 都可以胜任。 下面是一个最基本的示例: js template 结

    2024年02月10日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包