vue3-基础

375 阅读5分钟

优势:性能更好,体积更小,更好的ts支持,更好的代码组织和逻辑抽离,更多新功能

起项目:cn.vuejs.org/guide/quick…

生命周期(支持两种)

Options API

vue2基础上:beforeDestory改为beforeUnmount,destroyed改为unmouted

beforeCreate() {
    console.log("beforeCreate");
  },
  created() {
    console.log("created");
  },
  beforeMount() {
    console.log("beforeMount");
  },
  mounted() {
    console.log("mounted");
  },
  beforeUpdate() {
    console.log("beforeUpdate");
  },
  updated() {
    console.log("updated");
  },
  //   beforeDestroy改名
  beforeUnmount() {
    console.log("beforeUnmount");
  },
  //  destroyed改名
  unmounted() {
    console.log("unmounted");
  },

Composition API

// setup()相当于创建
// onBeforeMount  onMounted相当于挂载
// onbeforeUpdate  onUpdated相当于更新
// onBeforeUnmount onUnmounted相当于销毁/卸载
  import {
  onBeforeMount,
  onMounted,
  onBeforeUpdate,
  onUpdated,
  onBeforeUnmount,
  onUnmounted,
} from "vue";
   setup() {
    console.log("setup");
    onBeforeMount(() => {
      console.log("onBeforeMount");
    });
    onMounted(() => {
      console.log("onMounted");
    });
    onBeforeUpdate(() => {
      console.log("onBeforeUpdate");
    });
    onUpdated(() => {
      console.log("onUpdated");
    });
    onBeforeUnmount(() => {
      console.log("onBeforeUnmount");
    });
    onUnmounted(() => {
      console.log("onUnmounted");
    });
  },

Composition API 和Options API

Options API :data methods watch mounted 类似对象形式

Composition API:

  • 更好的代码组织:Options API业务逻辑分散,Composition API通过setup函数规整统一返回
  • 逻辑复用(多个组件之间功能复用)
  • 更好的类型推导,举例如下:

vue2使用方法如下,常规应该是this.methods不利于类型推导。但是vue3中Options API支持这样写。

vue3,Composition API:setup里面直接引用函数,接收函数返回值,然后统一返回。

Composition API如何实现代码逻辑复用?

Options API

Composition API和React Hooks对比?

reactive ref toRef toRefs .value语法?

ref

  • 生成值类型响应式数据,js代码中通过.value获取并改变值
  • ref创建的变量可用于模板和reactive。js代码中用.value获取值,但是.value不能写在reactive和模板中

  • 获取模板中的dom元素,template通过ref绑定变量

toRef

针对一个响应式对象(reactive封装)的一个prop创建一个具有响应式的ref,两者保持引用关系,指向同一个地址

普通对象通过reactive变为响应式对象,reactive对象内部某个属性prop想实现响应式就通过toRef

toRefs

将整个响应式对象(reactive封装)转为普通对象,批量转化,对象的每一个prop都是对应的ref。两者保持引用关系,指向同一个地址。

  • 转换前后对比

  • 普通对象reactive变为响应式对象,reactive对象内部全部属性要实现响应式就通过toRefs

  • 合成函数返回响应式对象

直接返回state不通过toRefs, 对象中的属性就会丢失响应式,若封装的函数内部有个响应式数据需要返回必须要toRefs(obj),这样在其他地方解构出来才能保持响应式。解构出来后续在模板中使用时候就不用state.xxx。(比如:Composition API抽离代码逻辑)

ref toRef toRefs reactive使用时机?

  • 创建响应式数据:对象用reactive,值类型用ref
  • setup中返回toRefs(state),或者toRef(state,'xxxx'):初始用reactive定义响应式对象,返回的时候用toRefs或toRef包装一下,这样模板中可以不用“.”的方式获取值,直接写属性名。
  • ref 数据命名采用xxxRef
  • 合成函数中最后使用toRefs返回响应式对象,有助于使用方进行解构

为何需要ref?

值类型会丢失响应式,这个值类型不仅仅是在初始化定义值类型,还有setup computed 合成函数都可能返回值类型。比如reactive创建的响应式对象取内部的值实际上也是一个值类型。

为何需要.value?

首先ref不会丢失响应式,说明ref是个对象。value存储值。{},通过.value属性的get set实现响应式。

reactive和模板中经过vue编译不需要通过.value获取值,但是自己写的代码中需要。共享同一个地址。

为何需要toRef toRefs?

toRef 为源响应式对象上的属性新建一个ref,保持对其源对象属性的响应式连接。参数:源响应式对象和属性名,返回ref数据。例如使用父组件传递的props数据时,要引用props的某个属性且要保持响应式连接时用。

toRefs 将响应式对象转换为普通对象,其中每个属性都会指向原始对象相应属性的ref(保持响应式)。用于es6解构赋值,因为对响应式对象直接解构后不再有响应式,用toRefs可以保持。

vue3新功能

异步组件写法

移除filter

Teleport

suspense

compostion api

vue3响应式

object.defineProperty:深度监听要一次性递归,不能监听新增删除属性,不能监听原生数组

new proxy(data,{get set deleteProperty(target key)}),关键在于Reflect

v-model参数用法

  • vue2

.sync:父子组件弹框控制显隐,对prop双向绑定,this.$emit('xx',value)。v-bind结合v-on

  • vue3

watch和watchEffect区别

都可监听data属性变化

watch要明确监听哪个属性,ref类型不用.value,默认初始化不执行,需要配置参数

watchEffect自动检测执行函数中包含哪些属性,自动监听, 初始化一定会执行一次

setup中如何获取组件实例

setup和composition API没有this, 通过getCurrentInstance()获取

options api可以用this

data中的值在onmounted才能获取

vue3为什么快?

响应式proxy

patchflag:编译模板,动态节点做标记,diff算法区分静态节点以及不同类型的,

hoistStatic:静态节点的定义提升至父作用域缓存,合并多个相邻的静态节点,空间换时间

cacheHandler:缓存事件

ssr优化:静态节点直接输出,绕过vdom, 动态节点还是动态渲染

tree-shaking:编译时候根据不同情况引入不同API

vite为什么快?

原因是开发环境用ES6module,无需打包直接引用。生产环境用rollup。webpack是打包成es5。