Vue3中新增API的见解

1. 组件API按需引入

import { ref, toRef, toRefs, computed, watch, getCurrentInstance, reactive, component, onMounted } from 'vue'

2. setup执行时机与注意点

  • setup执行时机在beforeCreate之前
  • setup中是不能使用datamethods,因为还没初始化好
  • 由于不能再setup函数中使用datamethods,所以Vue为了避免我们错误的使用,它直接将setup
    函数中的this修改成undefined.
  • setup只能同步,不能异步
  • setup中定义的数据需要return后才能被模板使用
//  Vue3中可以创建多个根节点
<template>
  <div>{num.age}</div>
  <div>{num1.age}</div>
<template>

<script>
import { defineComponent,  ref, reactive } from 'vue'
// 关于defineComponent请移步第六小节
export default defineComponent({
  setup () {
    const num = ref({ age: 18 })
    console.log(num.value) // {age: 18}   // 此处不理解者请先看第四小节
    const num1 = reactive({ age: 18 })
    console.log(num1) // {age: 18} 
    return {
      num,
      num1
    }
  },
})
</script>

3.Suspense 组件

  • Suspense 中可以添加多个异步组件
  • Suspense组件是有两个插槽的。默认的 default 是在异步组件加载完成之后显示,还有个插槽 fallback 代表异步组件加载中显示
<template>
    <Suspense>
        <template #default>
            <!-- 异步组件加载完成之后展示的控件 -->
        </template>
        <template #fallback>
            <!-- 异步组件加载中展示的控件 -->
        </template>
    </Suspense>
</template>
  • 子组件setup内执行异步需用Suspense包裹,但是,这个时候想要在页面加载完成功之后处理一些内容的话需要确保在第一个 await 语句之前注册生命周期钩子
<Suspense>
    <!-- 子节点。。。 -->
    <Children></Children>
</Suspense>
// ...
async setup () {
    onMounted(() => {
        //...页面加载完成之后需要做其他操作
    })
    await $http.getUserInfo().then((res: any) => {
        //... 处理数据
    })
    await $http.getApplicationInfo().then((res: any) => {// ...})
    return {
        //....
    }
}

4. reactive VS ref

一般来说,ref被用来定义简单的字符串或者数值,而reactive被用来定义对象数组等
ref定义对象时,value返回的是proxyreactive定义对象时返回的也是proxy,而这确实存在一些联系
ref来定义数据时,会对里面的数据类型进行一层判断,当遇到复杂的引用类型时,还是会使用reactive来进行处理
那么能否使用reactive来定义普通类型?答案是不行会出现警告,因此reactive只能被用来定义对象

let num = reactive(100)

如果非要用reactive定义基本数据类型的话,我们需要在reactive中将数据包装一下

let num = reactive({val:100})

但是使用reactive定义的数据和ref定义的数据打印结果有一些差异

let num = reactive({val:100})
let num1 = ref(10)
console.log(num) // {val:100}  // 使用reactive定义的num结果是一个数值类型的100
console.log(num1) // 获得一个对象  // 需要用num1.value去获取数据   // 使用vue3中提供的ref方法定义的num打印时候是一个对象

注意ref定义的数据需要用.value获取,但template模板中不需要直接写入return出去的值即可

5: toRef与 toRefs的作用

Vue3提供了一个新的API:toRef/toRefs,它可以将一个响应型对象(reactive object) 转化为普通对象(plain object),同时又把该对象中的每一个属性转化成对应的响应式属性(ref)。说白了就是放弃该对象(Object)本身的响应式特性(reactivity),转而给对象里的属性赋予响应式特性(reactivity)。

  • toRef :从一个reactive形式的对象里面,提取出来一个指定的属性,然后变成ref形式的对象,,其接收两个参数,第一个参数为对象 A,第二个参数为对象中的某个属性名 x,以便于保持属性的响应性。
// toRef
   const num3 = reactive({
      name: 'zs',
      age: 18
    })
    const personNameToRef = toRef(num3, 'name')
    console.log('num3ToRef', personNameToRef)
    console.log('num3ToRefValue', personNameToRef.value)

打印看效果

其实这个不是和ref一个意思吗

ref(num3 .name)
  • toRefs:简单的说,就是批量的toRef
    toRef一次只能变一个属性,toRefs一次能把所有属性都变了。
    // toRefs
    const num3 = reactive({
      name: 'zs',
      age: 18
    })
    const personNameToRef = toRefs(num3)
    console.log('num3ToRefs', personNameToRef)
    console.log('num3ToRefsValue', personNameToRef.name)

打印看效果
  • 那么ref toref torefs区别到底是什么呢?
  1. 参数不同:ref()接收一个 js 基本数据类型的参数;toRef()接收两个参数,第一个为对象,第二个为对象中的某个属性;
  2. 原理不同:ref()是对原数据的一个深拷贝,当其值改变时不会影响到原始值;
  3. toRef()是对原数据的一个引用,当值改变时会影响到原始值
  4. 当我们希望对象的多个属性都变成响应式数据,并且要求响应式数据和原始数据相关联,这时候toRefs()就派上用场了,它用于批量设置多个响应式数据。
  5. 那么,到这里又有疑问了,通过上面的学习我们知道使用 reactive()创建的数据已经具有响应式了,为什么还要再toRefs()呢?
    如果return 时使用 ES6 的扩展运算符那么其内部属性就失去了响应性 ,对响应式对象进行 toRefs 后,可以对其进行解构方便 Vue 模版使用,但是不会使其失去响应性。
  6. 具体可以理解为:为响应式对象的每一个键值对创建了一个ref响应式,即使这个响应式对象被拆分了,并不影响键值对的响应式变化,这就好比给羊圈的每只洋套了根绳子,即使羊圈没了,我们依旧可以通过绳子追踪到某一只羊
    如果还是不理解那就让我们上 -- 传送门 --
  • 如果转换值为普通对象,那么只会改变对象里的某一个值,并不会引起视图更新

6. defineComponent作用

  1. defineComponent可以给组件的setup方法准确的参数类型定义.
  2. defineComponent 可以接受显式的自定义 props 接口或从属性验证对象中自动推断
  3. defineComponent 可以正确适配无 props、数组 props 等形式
  4. 引入 defineComponent() 以正确推断 setup() 组件的参数类型

7. getCurrentInstance函数

setup的执行时组件对象还没有创建,此时不能使用this来访问setup里的数据或者操作router和vuex等
我们可以通过 getCurrentInstance这个函数来返回当前组件的实例对象,也就是当前Vue这个实例对象,从而去操作一些数据与方法,getCurrentInstance函数里的ctx /proxy就相当于this

import { getCurrentInstance } from 'vue';
// 获取当前组件实例
const instance = getCurrentInstance();

// 获取当前组件的上下文,下面两种方式都能获取到组件的上下文。
const { ctx }  = getCurrentInstance();  //  方式一,这种方式只能在开发环境下使用,生产环境下的ctx将访问不到
const { proxy }  = getCurrentInstance();  //  方式二,此方法在开发环境以及生产环境下都能放到组件上下文对象(推荐)
// ctx 中包含了组件中由ref和reactive创建的响应式数据对象,以及以下对象及方法;
proxy.$attrs
proxy.$data
proxy.$el
proxy.$emit
proxy.$forceUpdate
proxy.$nextTick
proxy.$options
proxy.$parent
proxy.$props
proxy.$refs
proxy.$root
proxy.$slots
proxy.$watch
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容