vue面试总结

10,981 阅读18分钟

这是我参与8月更文挑战的第3天,活动详情查看:8月更文挑战

总结一些vue相关的知识,将笔记整理跟大家分享,有些知识会经常在前端面试的时候会问到,所以做个记录,希望对大家有所帮助,如果有什么问题,可以指出,会积极修正。
如果大家喜欢,可以点赞或留言我再继续更新面试题~~~~,谢谢大家~~~

1、那首先谈谈你对Vue的理解吧?vue.js是什么?

Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。 vue是一个渐进式框架,相当于view层, 双向数据绑定, 他更轻量, 性能上更高效, 比其他框架更容易上手, 学习成本低, vue需要一个el对象进行实例化,

2、Vue与Angular以及React的区别?

angular是mvvm框架, 而vue是一个渐进式的框架, 相当于view层, 都有双向数据绑定, 但是angular中的双向数据绑定是基于脏检查机制, vue的双向数据绑定是基于ES5的getter和setter来实现, 而angular是有自己实现一套模板编译规则,vue比angular更轻量, 性能上更高效, 比angular更容易上手, 学习成本低, vue需要一个el对象进行实例化, 而angular是整个html页面下的,单页面应用, 而vue可以有个vue实例
1.与AngularJS的区别
相同点: 都支持指令:内置指令和自定义指令;都支持过滤器:内置过滤器和自定义过滤器;都支持双向数据绑定;都不支持低端浏览器。
不同点: AngularJS的学习成本高,比如增加了Dependency Injection特性,而Vue.js本身提供的API都比较简单、直观;在性能上,AngularJS依赖对数据做脏检查,所以Watcher越多越慢;Vue.js使用基于依赖追踪的观察并且使用异步队列更新,所有的数据都是独立触发的。
2.与React的区别
相同点: React采用特殊的JSX语法,Vue.js在组件开发中也推崇编写.vue特殊文件格式,对文件内容都有一些约定,两者都需要编译后使用;中心思想相同:一切都是组件,组件实例之间可以嵌套;都提供合理的钩子函数,可以让开发者定制化地去处理需求;都不内置列数AJAX,Route等功能到核心包,而是以插件的方式加载;在组件开发中都支持mixins的特性。
不同点: React采用的Virtual DOM会对渲染出来的结果做脏检查;Vue.js在模板中提供了指令,过滤器等,可以非常方便,快捷地操作Virtual DOM。

1.模板语法不同

Vue使用了基于HTML的模板语法,可以在 HTML模板中使用Vue的指令,如v-for、v- if 等,用于渲染视图。React则使用了 JSX语法,允许在 JavaScript代码中嵌入 HTML,用于描述组件的结构和行为。

Angular使用了自己的模板语法,类似于 HTML,但有些语法上的区别。

2.数据绑定方式不同

Vue 使用了双向数据绑定,即数据的修改可以自动同步到视图中,视图中的修改也可以自动同步到数据中。React 则使用了单向数据流,即组件通过 props 接收数据,通过 state来管理自己的状态。Angular则使用了双向数据绑定和单向数据绑定两种方式,具体取决于开发者的选择。

3.组件化方式不同

Vue和React都是基于组件的方式来构建应用程序的。Vue 的组件化方式比较简单,每个组件包含模板、状态和方法。React的组件化方式则更加灵活,每个组件只包含render 方法,可以通过props和state来管理组件的数据和状态。Angular 也是基于组件的方式,但它使用了更加复杂的依赖注入机制来管理组件的依赖和状态。

4.状态管理方式不同

Vue使用了Vuex来管理应用程序的状态,包括状态的存储、修改和同步等。React 则使用了Redux或MobX来管理应用程序的状态。Angular自带了自己的状态管理机制,包括服务、RxJS等。

3、vue 的生命周期?

实例从创建到销毁的过程,就是生命周期。也就是从开始创建、初始化数据、编译模板、挂载Dom→渲染、更新→渲染、卸载等一系列过程,我们称这是 Vue 的生命周期。
应用场景
beforeCreate:在new一个vue实例后,只有一些默认的生命周期钩子和默认事件,其他的东西都还没创建。在beforeCreate生命周期执行的时候,data和methods中的数据都还没有初始化。不能在这个阶段使用data中的数据和methods中的方法
create:data 和 methods都已经被初始化好了,如果要调用 methods 中的方法,或者操作 data 中的数据,最早可以在这个阶段中操作
beforeMount:执行到这个钩子的时候,在内存中已经编译好了模板了,但是还没有挂载到页面中,此时,页面还是旧的
mounted:执行到这个钩子的时候,就表示Vue实例已经初始化完成了。此时组件脱离了创建阶段,进入到了运行阶段。 如果我们想要通过插件操作页面上的DOM节点,最早可以在和这个阶段中进行
beforeUpdate: 当执行这个钩子时,页面中的显示的数据还是旧的,data中的数据是更新后的, 页面还没有和最新的数据保持同步
updated:页面显示的数据和data中的数据已经保持同步了,都是最新的
beforeDestory:Vue实例从运行阶段进入到了销毁阶段,这个时候上所有的 data 和 methods , 指令, 过滤器 ……都是处于可用状态。还没有真正被销毁
destroyed: 这个时候上所有的 data 和 methods , 指令, 过滤器 ……都是处于不可用状态。组件已经被销毁了。

4、vue生命周期的作用是什么?

它的生命周期中有多个事件钩子,让我们在控制整个Vue实例的过程时更容易形成好的逻辑。

5、vue生命周期总共有几个阶段?

它可以总共分为8个阶段:创建前/后, 载入前/后,更新前/后,销毁前/销毁后

6、第一次页面加载会触发哪几个钩子?

beforeCreate, created, beforeMount, mounted

7、vue获取数据在哪个周期函数?

一般 created/beforeMount/mounted 皆可.
比如如果你要操作 DOM , 那肯定 mounted 时候才能操作.

8、mvvm 框架是什么?

vue是实现了双向数据绑定的mvvm框架,当视图改变更新模型层,当模型层改变更新视图层。在vue中,使用了双向绑定技术,就是View的变化能实时让Model发生变化,而Model的变化也能实时更新到View。

9、Vue中双向数据绑定是如何实现的?

vue 双向数据绑定是通过 数据劫持 结合 发布订阅模式的方式来实现的, 也就是说数据和视图同步,数据发生变化,视图跟着变化,视图变化,数据也随之发生改变;
核心:关于VUE双向数据绑定,其核心是 Object.defineProperty()方法。

原理:vue .js 则是采用数据劫持结合发布者-订阅者模式的⽅式,Object.defineProperty()来劫持各个属性的 setter,消息给订阅者,触发相应的监听回调

10、vue是如何实现响应式数据的呢?(响应式数据原理)❗

参考:blog.csdn.net/kzj0916/art…
原理:
相信用过vue的都知道,vue中data中定义的数据会随着我们通过方法改变该数据的同时,页面上相关此数据的也会相应的刷新,实现响应式数据。可你知道它是如何实现这一功能的吗?下面让我们来了解了解它是如何做到这神奇操作的。

Object.defineProperty 监听修改读取数据:
Object.defineProperty(obj, prop, descriptor) 可传入三个值,其作用是该方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。
第一个值传入要修改的对象
第二个值传入该对象中要修改的key
第三个值是一个对象,里面有set 和get两种方法 set为值发生修改是所做的操作 get为读取改值时的操作
默认配置如下
image.png 现在我们来研究下vue是如何利用Object.defineProperty 监听修改读取数据的
我们创建一个对象,并利用Object.keys()将对象中的key返回到一个数组中,并对该数组forEach遍历
将key对应值先取过来,对这个对象中每个不同的key通过Object.defineProperty修改并监听数据的变化,在修改该 key对应的value值时,调用set方法 打印下监听xxxx数据改变 并将修改值赋给value
在读取该key对应的value值时,调用get方法 打印下获取xxxx对应的值 并直接返回当前value值
image.png

11、vue中是如何检测数组变化的呢?

vue.set()

12、vue组件中的data为什么是函数?

因为JavaScript的特性所导致,在component中,data必须以函数的形式存在,不可以是对象。 组建中的data写成一个函数,数据以函数返回值的形式定义,这样每次复用组件的时候,都会返回一份新的data,相当于每个组件实例都有自己私有的数据空间,它们只负责各自维护的数据,不会造成混乱。而单纯的写成对象形式,就是所有的组件实例共用了一个data,这样改一个全都改了。

13、分别简述computed和watch的使用场景?

computed:
当一个属性受多个属性影响的时候就需要用到computed
最典型的栗子: 购物车商品结算的时候
watch:
当一条数据影响多条数据的时候就需要用watch(当一个属性发生变化时,需要执行对应的操作,一对多)
栗子:搜索数据

14、created和mounted的区别?

created:在模板渲染成html前调用,即通常初始化某些属性值,然后再渲染成视图。
mounted:在模板渲染成html后调用,通常是初始化页面完成后,再对html的dom节点进行一些需要的操作。

15、vue-router的两种模式?

hash模式:即地址栏 URL 中的 # 符号;

hash 模式是开发中默认的模式,它的 URL 带着一个#,例如:http://www.aaa.com/#/vue, 它的 hash 值就是#/vue。

history模式:window.history对象打印出来可以看到里边提供的方法和记录长度。利用了 HTML5 History Interface 中新增的 pushState() 和 replaceState() 方法。(需要特定浏览器支持)。 history 模式的URL中没有#,它使用的是传统的路由分发模式,即用户在输入一个URL时,服务器会接收这个请求,并解析这个URL,然后做出相应的逻辑处理。

image.png

Hash 模式
在 hash 模式下,URL 中的 hash 值作为路由路径。该模式可以兼容较老的浏览器,并且无需后端服务器的支持。在使用 hash 模式时,我们可以实现单页应用的效果,从而提高页面的性能。但是,该模式的缺点是 URL 中会带有 # 号,可能不太友好,对于一些 URL 形式有要求的场景,不适用。在使用 hash 模式时,需要注意一些需要刷新页面的操作,例如在页面中使用锚点进行定位时,需要使用 JavaScript 来实现。

History 模式
在 history 模式下,URL 中的路径作为路由路径,不会带有 # 号。该模式的优点是 URL 美观,更符合一些场景的要求。此外,由于使用了 HTML5 中新增的 History API,可以实现前进和后退操作,提高用户体验。但是,该模式需要后端服务器的支持,而且需要正确地配置 URL 路径映射,否则会导致页面刷新时出现 404 错误。

Abstract 模式
在 abstract 模式下,路由器不会监听 URL 变化,而是通过调用路由器 API 进行导航。该模式的优点是可以在不需要浏览器 API 的情况下使用路由,比如在 Node.js 等非浏览器环境下。但是,由于需要手动管理路由的变化,使用起来比较麻烦,并且不适用于大多数场景。

模式之间的区别
三种路由模式的区别主要在于 URL 的形式和后端服务器的支持情况。对于需要兼容较老浏览器的场景,可以选择 hash 模式;对于需要美观 URL 的场景,可以选择 history 模式;如果需要在非浏览器环境下使用路由,可以选择 abstract 模式。

在使用 Vue Router 时,我们需要根据项目的实际需求来选择路由模式。如果需要兼容较老的浏览器,或者是单页应用场景,可以选择 hash 模式;如果需要美观 URL,或者需要使用浏览器的前进和后退功能,可以选择 history 模式;如果需要在非浏览器环境下使用路由,可以选择 abstract 模式。

16、params和query的区别?

用法:query要用path来引入,params要用name来引入,接收参数都是类似的,分别是this.$route.query.name和this.$route.params.name
url地址显示:query更加类似于我们ajax中get传参,params则类似于post,说的再简单一点,前者在浏览器地址栏中显示参数,后者则不显示
注意点:query刷新不会丢失query里面的数据、params刷新会丢失params里面的数据。

//query语法:
this.$router.push({path:"地址",query:{id:"123"}}); //这是传递参数
this.$route.query.id//这是接受参数
//params语法:
this.$router.push({name:"地址",params:{id:"123"}}); //这是传递参数
this.$route.params.id; //这是接受参数

17、组件之间传值?

  • 父传子:props
  • 子传父:$emit方法
  • 兄弟传值:eventBus
  • $children / $parent
  • $ref
  • vuex

18、$nextTick的使用?

当你修改了data的值然后马上获取这个dom元素的值,是不能获取到更新后的值, 你需要使用$nextTick这个回调,让修改后的data值渲染更新到dom元素之后在获取,才能成功。

// 修改数据
vm.msg = 'Hello'
// DOM 还未更新
Vue.nextTick(function () {
  // DOM 更新
})

19、< keep-alive></ keep-alive>的作用是什么?

keep-alive 是 Vue 内置的一个组件,可以使被包含的组件保留状态,或避免重新渲染。

20、为什么使用key?

需要使用key来给每个节点做一个唯一标识,Diff算法就可以正确的识别此节点。
作用主要是为了高效的更新虚拟DOM。

21、v-show和v-if指令的共同点和不同点?

共同点:都能控制元素的显示和隐藏;
不同点:实现本质方法不同,v-show本质就是通过控制css中的display设置为none,控制隐藏,只会编译一次;v-if是动态的向DOM树内添加或者删除DOM元素,若初始值为false,就不会编译了。而且v-if不停的销毁和创建比较消耗性能。
总结:如果要频繁切换某节点,使用v-show(切换开销比较小,初始开销较大)。如果不需要频繁切换某节点使用v-if(初始渲染开销较小,切换开销比较大)。

22、如何让CSS只在当前组件中起作用?

在组件中的style前面加上scoped

23、如何获取dom?

ref="domName" 用法:this.$refs.domName

24、说出几种vue当中的指令和它的用法?

v-model双向数据绑定;
v-for循环;
v-if v-show 显示与隐藏;
v-on事件;v-once: 只绑定一次。

25、v-modal的使用?

v-model用于表单数据的双向绑定,其实它就是一个语法糖,这个背后就做了两个操作:
v-bind绑定一个value属性;
v-on指令给当前元素绑定input事件。

26、请说出vue.cli项目中src目录每个文件夹和文件的用法?

assets文件夹是放静态资源;components是放组件;router是定义路由相关的配置; app.vue是一个应用主组件;main.js是入口文件。

27、assets和static的区别?

相同点:assets和static两个都是存放静态资源文件。项目中所需要的资源文件图片,字体图标,样式文件等都可以放在这两个文件下,这是相同点
不同点:assets中存放的静态资源文件在项目打包时,也就是运行npm run build时会将assets中放置的静态资源文件进行打包上传,所谓打包简单点可以理解为压缩体积,代码格式化。而压缩后的静态资源文件最终也都会放置在static文件中跟着index.html一同上传至服务器。static中放置的静态资源文件就不会要走打包压缩格式化等流程,而是直接进入打包好的目录,直接上传至服务器。因为避免了压缩直接进行上传,在打包时会提高一定的效率,但是static中的资源文件由于没有进行压缩等操作,所以文件的体积也就相对于assets中打包后的文件提交较大点。在服务器中就会占据更大的空间。
建议:将项目中template需要的样式文件js文件等都可以放置在assets中,走打包这一流程。减少体积。而项目中引入的第三方的资源文件如iconfoont.css等文件可以放置在static中,因为这些引入的第三方文件已经经过处理,我们不再需要处理,直接上传。

28、v-on可以监听多个方法吗?

可以,例子:< input type="text" v-on="{ input:onInput,focus:onFocus,blur:onBlur, }">。

29、vue的两个核心点

数据驱动、组件系统
数据驱动:ViewModel,保证数据和视图的一致性。
组件系统:应用类UI可以看作全部是由组件树构成的。

30、vue和jQuery的区别

jQuery是使用选择器($)选取DOM对象,对其进行赋值、取值、事件绑定等操作,其实和原生的HTML的区别只在于可以更方便的选取和操作DOM对象,而数据和界面是在一起的。比如需要获取label标签的内容:$("lable").val();,它还是依赖DOM元素的值。
Vue则是通过Vue对象将数据和View完全分离开来了。对数据进行操作不再需要引用相应的DOM对象,可以说数据和View是分离的,他们通过Vue对象这个vm实现相互的绑定。这就是传说中的MVVM。

31、delete和Vue.delete删除数组的区别

delete只是被删除的元素变成了 empty/undefined 其他的元素的键值还是不变。Vue.delete 直接删除了数组 改变了数组的键值。

32、axios的特点有哪些

从浏览器中创建XMLHttpRequests;
node.js创建http请求;
支持Promise API;
拦截请求和响应;
转换请求数据和响应数据;
取消请求;
自动换成json。
axios中的发送字段的参数是data跟params两个,两者的区别在于params是跟请求地址一起发送的,data的作为一个请求体进行发送
params一般适用于get请求,data一般适用于post put 请求。

33、vue初始化页面闪动问题

使用vue开发时,在vue初始化之前,由于div是不归vue管的,所以我们写的代码在还没有解析的情况下会容易出现花屏现象,看到类似于{{message}}的字样,虽然一般情况下这个时间很短暂,但是我们还是有必要让解决这个问题的。
首先:在css里加上[v-cloak] { display: none; }。 如果没有彻底解决问题,则在根元素加上style="display: none;" :style="{display: 'block'}"

34、vue更新数组时触发视图更新的方法

push();pop();shift();unshift();splice(); sort();reverse()

35、vue常用的修饰符?

.stop:等同于JavaScript中的event.stopPropagation(),防止事件冒泡;
.prevent:等同于JavaScript中的event.preventDefault(),防止执行预设的行为(如果事件可取消,则取消该事件,而不停止事件的进一步传播);
.capture:与事件冒泡的方向相反,事件捕获由外到内;
.self:只会触发自己范围内的事件,不包含子元素;
.once:只会触发一次。

36、vuex相关问题

参考:blog.csdn.net/u012967771/…

37、vuex是什么?怎么使用?哪种功能场景使用它?

vue框架中状态管理。在main.js引入store,注入。
新建了一个目录store.js,….. export 。
场景有:单页应用中,组件之间的状态。音乐播放、登录状态、加入购物车

38、关于VueX

VueX是适用于在Vue项目开发时使用的状态管理工具。试想一下,如果在一个项目开发中频繁的使用组件传参的方式来同步data中的值,一旦项目变得很庞大,管理和维护这些值将是相当棘手的工作。为此,Vue为这些被多个组件频繁使用的值提供了一个统一管理的工具——VueX。在具有VueX的Vue项目中,我们只需要把这些值定义在VueX中,即可在整个Vue项目的组件中使用。

39、使用Vuex的目的

实现多组件状态管理。多个组件之间需要数据共享时,Vuex是个很好的帮手哦

40、Vuex 的五大核心

其中state和mutation是必须的,其他可根据需求来加
1、state:负责状态管理,类似于vue中的data,用于初始化数据 //状态管理
2、mutation:专用于修改state中的数据,通过commit触发 //修改state
3、action:可以处理异步,通过dispatch触发,不能直接修改state,首先在组件中通过dispatch触发action,然后在action函数内部commit触发mutation,通过mutation修改state状态值 //异步操作
4、getter:Vuex中的计算属性,相当于vue中的computed,依赖于state状态值,状态值一旦改变,getter会重新计算,也就是说,当一个数据依赖于另一个数据发生变化时,就要使用getter
5、module:模块化管理 //模块

// 导入vue及vuex
import Vue from 'vue'
import Vuex from 'vuex'
// 挂载vuex
Vue.use(Vuex)

// 创建vuex对象并向外暴露
export default new Vuex.Store({
  // 全局属性变量
  state: {
  },
  // 全局同步方法, 调用方法,this.$store.commit("xxx")
  mutations: {
  },
  // 异步方法 调用方法,this.$store.dispatch("xxx") 
  actions: {
  },
  // Vuex属性计算,在视图里面当变量使用
  getters: {
  },
  // 模块化注册
  modules: {
  }
})

action与mutation的区别?

const store = new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment (state) {
      state.count++
    }
  },
  actions: {
    increment (context) {
      context.commit('increment')
    }
  }
})

1、流程顺序

“相应视图—>修改State”拆分成两部分,视图触发Action,Action再触发Mutation。

2、角色定位

基于流程顺序,二者扮演不同的角色。

Mutation:专注于修改State,理论上是修改State的唯一途径。

Action:业务代码、异步请求。

3、限制

角色不同,二者有不同的限制。

Mutation:必须同步执行。

Action:可以异步,但不能直接操作State。

41、solt插槽

1、默认插槽

子组件用标签来确定渲染的位置标签里面可以放DOM结构,当父组件使用的时候没有往插槽传入内容 ,标签内 DOM结构就会显示在页面父组件在使用的时候,直接在子组件的标签内写入内容即可

子组件Child.vue

  <template> 
      <slot>
          <p>插槽内容<p> 
      </slot>
  </template>

父组件

  <Child> 
      <div>默认插槽</div>
  </Child>

2、具名插槽

子组件用name属性来表示插槽的名字,不传为默认插槽 父组件中在使用时在默认插槽的基础上加上slot属性,值为子组件插槽name属性值

子组件Child.vue

  <template> 
      <slot>插槽内容</slot>
      <slot name="content">插槽内容</slot>
  </template>

父组件

  <Child> 
      <template v-slot:default>具名插槽</template>
        <!-- 具名插槽用插槽名做参数  -->
      <template v-slot:content>内容 ...</template>
  </Child>

3、作用域插槽

子组件在作用域上绑定属性来将子组件的信息传给父组件使用,这些属性会被挂在父组件v-slot 接受的对象上 父组件中在使用时通过v-slot:简写:获取子组件的信息 ,在内容中使用

子组件Child.vue

  <template> 
      <slot name="footer" testProps="子组件的值 ">
          <h3>没传footer插槽</h3>
      </slot>
  </template>

父组件

  <Child> 
      <!-- 把v-slot的值指定为作用域![]()上下文对象  -->
      <template v-slot:default="slotProps">来自子组件数据 :{{slotProps.testProps}}</template>
      <template #default="slotProps">来自子组件数据 ![]()  {{slotProps.testProps}}</template>
  </Child>

42、vue2和vue3的区别

  1. 根节点不同
    • vue2中必须要有根标签
    • vue3中可以没有根标签,会默认将多个根标签包裹在一个fragement虚拟标签中,有利于减少内存。
  2. 组合式API和选项式API
    • 在vue2中采用选项式API,将数据和函数集中起来处理,将功能点切割了当逻辑复杂的时候不利于代码阅读。
    • 在vue3中采用组合式API,将同一个功能的代码集中起来处理,使得代码更加有序,有利于代码的书写和维护。
  3. 生命周期的变化
    • Vue2 中的生命周期:beforeCreate 组件创建之前;created 组建创建之后;beforeMount 组件挂载到页面之前执行;Mounted 组件挂载到页面之后执行,beforeUpdate 组件更新之前;updated组件更新之后
    • Vue3 中的生命周期:setup 开始创建组件;onBeforeMount 组件挂载到页面之前执行;onMounted 组件挂载到页面之后执行;onBeforeUpdate 组件更新之前;onUpdated 组件更新之后;
    • 整体来看,变化不大,只是名字大部分需要 + on,功能上类似
    • beforeCreate -> 使用setup()
    • created -> 使用setup()
    • beforeMount -> onBeforeMount
    • mounted -> onMounted
    • beforeUpdate -> onBeforeUpdate
    • updated -> onUpdated
  4. v-if和v-for优先级已更改
    • vue2在同一元素v-for优先级高于v-if,
    • vue3则相反,仍不建议在同一标签同时使用
  5. watch监听数组
    • vue3当中,如果想要监听数组内容的变化那么必须要写deep。
  6. 响应式原理不同
    • vue2通过Object.definedProperty()的get()和set()来做数据劫持、结合和发布订阅者模式来实现,Object.definedProperty()会遍历每一个属性。
    • vue3通过proxy代理的方式实现。
    • proxy的优势:不需要像Object.definedProperty()的那样遍历每一个属性,有一定的性能提升proxy可以理解为在目标对象之前架设一层“拦截”,外界对该对象的访问都必须通过这一层拦截。这个拦截可以对外界的访问进行过滤和改写。
    • 当属性过多的时候利用Object.definedProperty()要通过遍历的方式监听每一个属性。利用proxy则不需要遍历,会自动监听所有属性,有利于性能的提升
  7. 插槽方式不同
    • 在vue3中匿名插槽和在vue2中一样

    • 具名插槽使用方式不同:vue2使用slot='',vue3使用v-slot:''

    • 作用域插槽使用方式不同:vue2中在父组件中使用slot-scope="data"从子组件获取数据,vue3中在父组件中使用 #data 或者 #default="{data}"获取

其他相关总结文章