vue3 Composition Api

158 阅读3分钟

本文主要讲解vue3中组合式api相关。废话不多说,先上文档。
vue3文档:vue3js.cn/docs/guide/…
composition api文档:vue3js.cn/docs/api/co…
先讲讲vue2和3的一些区别:

在vue2中创建一个vue应用:
    new Vue(options).$mount('#app');
    Vue.use(插件);
在vue3中创建一个vue应用:
    createApp(App根组件).use(插件).mount('#app');

Vue2中一个vue应用既是一个vue组件也是一个vue实例。this指向组件实例。访问属性就是访问vue实例的属性。不管是use还是mixin都会污染整个vue应用。 Vue3中可以创建多个vue应用,只需挂载在不同的节点上。提供的数据依赖只针对本个应用,不会污染其他应用,利于tree shaking。对于option api,this其实是个代理对象,代理了组件实例。访问属性是访问组件代理对象,组件代理对象去访问vue实例的属性。写起来和过去一样。

#### setup函数

setup函数会在所有声明周期之前调用,相当于created和beforeCreate,返回的数据会挂载到组件实例上。thisundefined,那么怎么获取数据呢?
setup函数接收两个参数props和context。
props:是一个对象,包含了所有的组件属性值。
context:是一个对象,提供了组件的上下文信息。

interface Data {
  [key: string]: unknown
}

interface SetupContext {
  attrs: Data
  slots: Slots
  emit: (event: string, ...args: unknown[]) => void
}

function setup(props: Data, context: SetupContext): Data

注意一点:数据方面在setup函数里面ref object是一个对象,访问需要.value。但vue在模板里面做了处理,对于ref object可以直接使用数据而不用.value去访问。原因是我们在模板里面访问数据首先访问的是组件代理对象,他会去组件实例中访问对应的.value。

生命周期:

上面说到setup函数相当于created和beforeCreate,会在一开始执行。再看看其他的声明周期函数:
options api -> composition api

  • beforeCreate-> setup
  • ceated-> setup
  • beforeMount -> onBeforeMount
  • mounted -> onMounted
  • beforeUpdate -> onBeforeUpdate
  • updated -> onUpdated
  • beforeUnmount -> onBeforeUnmount
  • unmounted -> onUnmounted
  • errorCaptured -> onErrorCaptured
  • renderTracked -> onRenderTracked//运行时间:模板预编译会编译成一个render函数,render函数中会创建虚拟节点收集依赖。只要收集到依赖,这个生命周期就会运行。事件参数e.target就是收集的依赖。
  • renderTriggered -> onRenderTriggered//运行时间:当依赖被更改组件重新渲染时运行。

相比于vue2增加了两个钩子函数:
renderTracked:模板预编译会编译成一个render函数,render函数中会创建虚拟节点收集依赖。只要收集到依赖,这个生命周期就会运行。事件参数e.target就是收集的依赖。
renderTriggered:当依赖被更改组件重新渲染时运行。

Provide / Inject:

和vue2稍微有点不同,但作用相同。vue3需要显式导入provide和inject。
provide('xxx', 变量)
inject('xxx')就可以访问变量了
如果不希望注入的数据被子组件更改,可以使用readonly。
注:若有理解上的疏漏望指正。