vue_basic Flashcards
MVVM模式是什么?
MVVM是Model-View-ViewModel的简写。
应用的UI以及基础表示和业务逻辑被分成三个独立的类:
1.视图,用于封装UI和UI逻辑;
2.视图模型,用于封装表示逻辑和状态;
3.以及模型,用于封装应用的业务逻辑和数据。
MVVM模式优点
降低了代码的耦合性,提高了视图或者逻辑的重用性,因为视图和数据层都是独立的,不必因为谁而改变谁。
自动更新DOM,利用双向绑定,关注业务逻辑。
MVVM模式缺点
bug调试困难,界面出现异常,可能是view或者model层发生错误,并且数据绑定的声明是无法进行打断点debug,可以用扩展的工具进行调试。
一个大的模块中model也会很大,会占用更多的内存,相应viewmodel的构建和维护也是成本。
MVVM核心
双向绑定
双向绑定是什么?
先说单向绑定,通过 JavaScript 控制 DOM 的展示,就是数据(Data)到模板(DOM)的绑定。
而双向绑定就是在这个基础上,模板到数据的绑定。
vue2实现双向绑定
Vue2 的双向绑定设计模式基于观察者模式和发布订阅模式实现,通过数据响应式模块、模板编译模块和视图渲染模块的协作,实现了数据和视图的双向绑定功能。
其中,数据响应式模块和模板编译模块是观察者模式,视图渲染模块是发布订阅模式。
vue3实现双向绑定
响应式监测机制的改变,用es6的proxy来进行代理,解决了vue2中,基于Object.defineProperty所带来一大部分的问题。
vue2使用的响应式监测机制,会带来什么问题?为什么?有没有解决办法?
1.当添加或者删除对象的属性时,Object.definePropert监听不到,只能通过set来处理,例如:this.set来处理,例如:this.set来处理,例如:this.set( this.data,’job’,’teacher’ ),而proxy是是直接代理整个对象,而非对象的属性,可以监听到添加或者删除。
2.无法检测到数组的长度的变化,proxy代理数组,可以解决。
vue2、3除了使用的响应式监测机制不同外,还有什么区别?
1.生命周期的使用上的不同,setup围绕 beforeCreate 和 created 生命周期钩子运行,在script setup语法糖里进行使用,调用生命周期钩子函数
2. vue3是composition api,vue2是options api,一个逻辑会散落在文件不同位置,可读性差
3. teleport组件
4. 静态提升
5. 全局api也只能通过导入的方式进行调用,做到更好的treesharking(可能是调用了全局api却没有使用…)
Vue3的静态提升是啥?
Vue3中对不参与更新的元素,会做静态提升,只会被创建一次,在渲染时直接复用
这样就免去了重复的创建节点,大型应用会受益于这个改动,免去了重复的创建操作,优化了运行时候的内存占用
SPA首页加载慢怎么解决
1.减小入口文件体积,常见的手段就是进行路由的懒加载,动态加载路由
2.合理利用静态资源本地缓存
3.按需加载UI组件
4.合理使用webpack等打包工具进行前端性能优化
组件通信的方式
1.props:父组件传递数据给子组件
2.$emit:子组件通过触发自定义事件传递数据给父组件
3.ref:获取组件实例,调用其方法
4.EventBus:兄弟组件传值
5.provide和inject:全局通信
6.状态管理工具:vuex/pinia
7.本地存储localstorage
Computed和Watch的区别
Computed:支持缓存,不支持异步,当有异步操作的时候,无法发起监听的作用,根据依赖的响应式数据动态计算而来的属性,它具有缓存和实时更新的特点,适用于需要进行复杂计算的场景。
Watch:支持异步,监听数据的变化,并在特定数据发生变化时执行自定义的回调函数,适用于需要执行异步操作或复杂逻辑的场景。
keepalive是什么,有哪几种使用方式?
keep-alive是一个抽象组件:它自身不会渲染一个 DOM 元素,也不会出现在父组件链中;使用keep-alive包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。
使用方式:
1.动态组件
2.在vue-router中的应用include定义缓存白名单,keep-alive会缓存命中的组件;exclude定义缓存黑名单,被命中的组件将不会被缓存,优先级高于前者;max定义缓存组件上限,超出上限使用LRU的策略置换缓存数据。
keepalive配合router的高级使用
router-view也是一个组件,如果直接被包在keepalive里面,那么所有路径匹配到的视图组件都会被缓存。
如果只想要router-view里面的某个组件被缓存,怎么办?
1. 使用 include/exclude
2. 使用 meta 属性