首页IT科技选择vue2还是vue3(Vue经典面试题:Vue2和Vue3的区别)

选择vue2还是vue3(Vue经典面试题:Vue2和Vue3的区别)

时间2025-05-01 19:26:39分类IT科技浏览3214
导读:双向绑定原理...

双向绑定原理

vue2是用过ES5的一个API Object.defineProperty()对数据进行劫持配合发布订阅者模式的方式来实现的

Vue3是使用了ES6的proxyAPI对数据代理

Vue3支持碎片(Fragments)

就是说组件可以有多个根节点

Composition API

vue2采用选项类型API         ,而vue3采用 合成型API         。代码更加的简便整洁

生命周期钩子函数

若组件被keep-alive包裹                ,则多出下面两个钩子函数

onActivated() 激活时执行 onDeactivated() 失活时执行

setup()函数新特性

它接受两个参数(props         、context(包含attrs                、slots      、emit))

在beforeCreate和Created 两个钩子函数之前的函数

执行setup时      ,组件实例尚未被创建       ,在setup内部this不指向vue实例               ,是undefined

和模板一起使用:需要返回一个对象 定义的变量和方法最后都需要return 出去

使用渲染函数:可以返回一个渲染函数         ,该函数可以直接使用在同一作用域中声明的响应式状态

注意:

setup函数中的props是响应式的     ,当传入新的prop时              ,它将被更新 但是因为props是响应式的            ,所以不能使用ES6解构   ,因为会消除prop的响应式                。可以通过setup函数中的toRefs来完成此操作

setup函数只能是同步的不能是异步的

setup函数只会在初始化的时候执行一次

teleport瞬移组件

如何取舍ref和reactive

优先使用ref函数              ,因为ref函数 可以处理简单数据类型               ,也可以处理复杂类型,常用于数据类型定义响应式数据

ref特点:在代码中获取或者修改值时           ,需要补 .value 但是在template模板中不需要

reactive 常用于定义复杂数据类型作为响应式数据

特点 :不需要 .value                 ,如果明确知道对象中有什么属性久使用reactive

父子通信

父传子

在setup函数中有两个参数 第一个参数为props   ,第二个参数为context

- props为一个对象         ,props接收后                ,内部包含了所有传递过来的prop数据- context包含了attrs      ,slots       ,emit属性               ,其中emit方法可以完成子传父

子传父

setup(props,context) { context.emit(name,李雷) }

<template> <Son @name="name" ></Son> </template> setup() {   const name = (name)=>console.log(name);     return {name} },

父传子:在setup中使用props数据 setup(props){ props就是父组件数据 }

子传父:触发自定义事件的时候emit来自 setup(props,{emit}){ emit 就是触发事件函数}

performance

原本在vue2中虚拟dom时进行全量的杜比         ,而在vue3中新增了静态标记(patchFlag)     ,值对比带有PF的节点              ,并通过Flag的信息得知当前节点要比对的内容            ,这样就无需遍历整个虚拟dom   ,从而大大提升性能      。

vue3响应式原理

实现原理

通过proxy(代理):拦截对象中任意属性的变化              ,包括:属性值的读写       、添加和删除

通过reflect(反射)ES6:对源数据的属性进行操作       。

proxy:   [[handle]]: 增删改查靠它完成   [[target]]: 数据 }

Object.defineProperty是单线程               ,不能捕获错误 只能通过try和catch实现

Reflect可以捕获错误(reflect也具有defineProperty)

const per 代理数据 = new proxy 代理对象 (源数据person,操作项{    per: 代理数据  proxy: 代理对象,俩个参数(源数据               、操作项) ​ get (源数据target,属性名propName) {        return Reflect.get(target,propName) } set (源数据target,属性名propName,操作后的值value) {        追加也能调用,引起源数据的变化        Reflect.set(target,propName,value)   } ​ deleteProperty (源数据target,属性名propName) {        return Reflect.delete(target,propName)   } })

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
怎么提高网站的收录(新网站怎么提高收录量) 外链质量提升是稳定排名的关键(不断提高外链质量,巩固SEO优势)