Vue3面试题

本文深入探讨Vue3的新特性,包括Composition API、ref、toRef和toRefs的使用,生命周期的变化,以及Vue3如何实现响应式和性能优化。Vue3相比Vue2具有更小的体积、更好的TypeScript支持和更好的代码组织。文中还讨论了Vue3的createApp、emits、Teleport、Suspense等新功能,以及与React Hooks的对比。
摘要由CSDN通过智能技术生成

Vue3比Vue2 有什么优势?

  • 性能更小
  • 体积更小
  • 更好的ts支持
  • 更好的代码组织
  • 更好的逻辑抽离
  • 更多新功能

描述Vue3生命周期

  • beforeDestroy 改为 beforeUnmount
  • destroyed 改为unmouted
  • 其他沿用Vue2的生命周期
import {
   
  onBeforeMount,
  onMounted,
  onBeforeUpdate,
  onUpdated,
  onBeforeUnmount,
  onUnmounted,
} from "vue";

// 相当于beforeCreate 和 created
  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");
    });
  },

Options API生命周期

业务逻辑分散在各地
vue2在使用的方式

Composition API生命周期

setup()方式的生命周期

Composition API带来了什么?
  • 更好的代码组织(业务逻辑集中)
  • 更好的逻辑复用(有一道专门的面试题)
  • 更好的类型推导
Composition API和Options API 如何选择?

如何看待 Composition API和 Options API ?

如何理解 ref toRef和 toRefs ?

是什么
最佳使用方式

ref
  • 生成值类型的响应式数据
  • 可用于模板和reactive
  • 通过.value 修改值
toRef
  • 针对一个响应式对象(reactive 封装)的 prop
  • 创建一个ref,真有响应式
  • 两者保持引用关系
setup() {
   
      const state = reactive({
   
        age: 20,
        name: '小明'
      })
    // const state = { // 不具备响应式
    //   age: 20,
    //   name: "小明",
    // };

    // 普通对象实现响应式要加reactive()
    // 普通对象某一个属性要实现响应式要toRef

    // toRef如果用域普通对象(非响应式对象)产出的结果不具备响应式
    const ageRef = toRef(state, "age"); // 针对响应式数据

    setTimeout(() => {
   
      // age修改,ageRef也会修改
      state.age = 25;
    }, 1500);

    setTimeout(() => {
   
      ageRef.value = 30; // state.age也会修改
    }, 3000);

    return {
   
      state,
      ageRef,
    };
toRefs
  • 将响应式对象(reactive 封装)转换为普通对象
  • 对象的每个prop都是对应的ref
  • 两者保持引用关系
setup() {
   
    const state = reactive({
   
      age: 20,
      name: "小明",
    });

    // 将响应对象变成普通对象
    const stateAsRefs = toRefs(state);

    // 每个属性都是ref对象
    // const { age: ageRef, name: nameRef } = stateAsRefs;  
    // return {
   
    //     ageRef,
    //     nameRef,
    // };
    
    // computed返回的数据是类似ref的对象,也可以.value
    const age1 = computed(() => {
   
      return state.age + 1;
    });

    return stateAsRefs; // html可以直接使用age和name
    // return { state }  // html使用state.age, state.name
    // return { ... state }  // html中的age和name不具备响应式
  },

toRefs的一个用处:合成函数返回响应式对象
在这里插入图片描述

最佳使用方式
  • 用reactive 做对象的响应式,用 ref 做值类型响应式
  • setup 中返回 toRefs(state),或者 toRef(state,xxx’)
  • ref的变量命名都用xxxRef
  • 合成函数返回响应式对象时,使用 toRefs
为何需要ref
  • 返回值类型,会丢失响应式
  • 如在 setup、computed、合成函数,都有可能返回值类型
  • Vue如不定义ref,用户将自造 ref,反而混乱
为何需要 .value
  • ref是一个对象(不丢失响应式),value 存储值
  • 通过.value 属性的 get和 set 实现响应式
  • 用于模板、reactive 时,不需要 value,其他情况都需要
// 错误
function computed(value) {
   
    const value = 0
    setTimeout(() => {
   
        value = getter()
  
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值