Bootstrap

vue3面试题1|[2024-11-12]

问题1:vue2与vue3的区别

1.vue2 和 vue3 双向绑定 方法不同

        vue2:Object.defineProperty()

                ***使用这种方法,对于后添加的属性是劫持不到的,所以就会出现数据更新了,

                    但是视图没有更新,所以vue2就需要使用$set来添加属性。

                    this.obj.c = 3;  // 这样会导致数据更新了视图没有更新

                    this.$set(this.obj, 'c', '3')   // 这样可以解决这个问题

        vue3:new Proxy()

                ***即使是后添加的也可以劫持到,所以也不需要$set

                ***还不需要循环

2.$set在vue3中没有,因为new Proxy不需要

3.关于写法

        vue2是选项式API

        vue3可以向下兼容(选项式API),也可以组合式API或者setup语法糖形式

4.v-if和v-for优先级不同

5.ref和¥children也不同

6.根节点不同

        vue2中必须要有根标签

        vue3中可以没有根标签

7.生命周期的变化

        

问题2:vue3如果使用setup写怎么组织代码

说明:hooks(就是函数式),主要让功能模块细化(提升项目的维护性)

        解决问题:<script setup>

                                // 代码  比较乱

                          <script> 

面试题:你们vue3写代码的方式 => setup形式

        解决:hooks

 问题3:vue3如果用setup写如何获取类似于vue2中的this

可以通过vue提供的方法来获取全局的东西:

1.首先打印出一个特定的对象

        console.log(getCurrentInstance())  --  这个对象中包含上下文等信息,可以从中找到所需的全局变量

2.创建一个全局插件并注册

// 1.在component文件夹中新建loading/index.js文件

   export default {
       install(app) {
           app.config.globalProperties.loading = "加载中";
       }
   };

// 2.在需要使用该全局插件的地方引入并注册

   import loading from './components/loading';
   const app = createApp(App);
   app.use(loading);
   app.mount('#app');

3.在组件中调用全局变量

// 在组件的setup函数中,通过以下方式调用全局变量
   import { getCurrentInstance } from 'vue';
   setup() {
       const instance = getCurrentInstance();
       const appContext = instance.appContext;
       console.log(appContext.config.globalProperties.loading);
       return {};
   }

 问题4:vue3常用的api有哪些

1.createApp  ---->   创建一个应用实例

        说明:等于vue2的====new Vue()

        使用场景:写插件(封装全局组件会使用) 

2.provide/inject  ---->  依赖注入

        说明:其实就是传值

        场景:某一个父组件传值到后代组件,如果层级过多传递会很麻烦,所以就可以使用

        缺点:不好维护和查询数据来源

3.directive

        说明:自定义指令

        场景:后台管理系统中的按钮权限控制(一个用户拥有某些权限,但是只能查看和修改,不能删除)

4.mixin

        说明:1--全局混入  2--局部混入

        场景:可以添加生命周期,在小程序的分享功能就会用到

        缺点:不好维护和查询数据来源

5.app.config.globalProperties

        说明:获取vue这个全局对象的属性和方法

        场景:自己封装插件的时候需要把方法添加到对象中

6.nextTick

        说明:等待下一次DOM更新刷新的工具方法:nextTick返回一个Promise,回调函数是放在Promise中的,所以是异步执行的

        场景:就是要把DOM更新,vue是数据驱动DOM,所以数据的赋值就要在nextTick进行

7.computed

        说明:计算属性

        场景:有缓存

8.reactive、ref

        说明:来定义数据的,和vue2的data类似

9.watch

        说明:监听(vue3不需要深度监听)

10.markRaw()

        说明:不被new Proxy代理,说白了就是静态的数据

11.defineProps()

        说明:父组件传递的值,子组件使用setup的形式,需要用defineProps接收

12.defineEmits()

        当前组件使用setup形式、自定义事件需要使用defineEmits

13.slot

        说明:分为 1:匿名插槽  2:具名插槽  3:作用域插槽

        场景:后台管理系统、左侧是固定菜单、右侧是不是固定内容、那么右侧就是slot

问题5:请介绍一下vue3常用的响应式数据类型

ref:基本类型

import { ref } from 'vue'
let sum = ref(10)
// 若是要修改他的值,需要.value
sum.value = 200

reactive:复杂类型

import {reactive} from 'vue'
// reactive用于定义复杂的数据
let obj = reactive({
    name:'张三',
    age: 18,
    sex:'男'
})

// 若要修改他的值,可直接修改
obj.name = '李四'

toRef:解构某一个值

import { reactive,toRef } from 'vue'
let obj = reactive({
    name:'张三',
    age:18,
    sex:'男'
})
let name = toRef(obj,'name')

toRefs: 解构所有值

import { reactive, toRefs } from 'vue'
let obj = reactive({
    name:'张三',
    age:18,
    sex:'男'
})

let {name, age, sex} = toRefs(obj)

        解构之后,在组件中就可以直接使用 {{ name }}

问题6:请介绍一下teleport组件及其使用场景 

teleport组件就是一个传送门

假如自己写弹出框,需要在页面居中显示,不受当前组件的限制,可以把盒子传送到body中

<teleport to='body'>
    <div class='mo' v-if='show'>
</teleport>
;