面试|Vue常见的基础面试题(2)
1.computed
和watch
区别
computed拥有依赖缓存特性,如果依赖值不变,computed不会重新计算
Computed
本质是一个具备缓存的watcher
,依赖的属性发生变化就会更新视图。 适用于计算比较消耗性能的计算场景。
watch更多的是观察作用,类似于某些数据的监听回调。有两个选项,immediate和deep。
当 immediate:true 时,回调函数会在监听开始后立刻执行,可以监听到到第一次变化。
当deep:true 会监听到obj对象的所有内部属性,默认值为false
2.对于MVVM的理解
M==model, 代表数据模型,可以在model中定义数据修改和操作的业务逻辑。
V==view ,代表UI视图,可以将数据模型转换为UI视图展示出来
VM==ViweModel,它是model和view的桥梁,监听模型数据的改变,和控制视图行为处理用户交互。
3.说说对SPA单页面的理解
在Web页面初始化时加载相应的HTML ,CSS, Javascript,一旦页面加载完成, SPA 不会因为用户的操作而进行页面的重新加载或跳转。取而代之的是利用路由机制实现 HTML 内容的变换,UI 与用户的交互,避免页面的重新加载。
4.Vue2.x组件通信有哪些方式?
- 父子组件通信 父->子
props
,子->父$on、$emit
获取父子组件实例$parent、$children
Ref
获取实例的方式调用组件的属性或者方法
Provide、inject
官方不推荐使用,但是写组件库时很常用
- 兄弟组件通信
Event Bus
实现跨组件通信Vue.prototype.$bus = new Vue
Vuex
- 跨级组件通信
Vuex
$attrs、$listeners
Provide、inject
query要用path来引入,this.$route.query.name
params要用name来引入,this.$route.params.name。
query更加类似于我们ajax中get传参,params则类似于post
(在此可以了解了解post和get的区别)
6. 路由有哪些模式呢?又有什么不同呢?
- hash模式:有“#”号,触发
hashchange
事件,实现路由切换
- history模式:没有“#”号,通过
pushState
和replaceState
切换url,触发popstate
事件,实现路由切换,需要后端配合
- 绑定到普通元素上:获取dom元素
this.$refs.box
- 绑定到子组件上:获取子组件的data和它的方法
$route
和$router
的区别简单来说一个是用来获取路由信息的,一个是用来操作路由的。
9.什么回流和重绘?
简单理解就是 回流:页面布局和几何属性发生改变就会回流(布局发生改变)
重绘:就是节点样式发生改变,比如color,字体大小之类
回流必定会触发重绘,重绘不一定会引发回流
减少重绘和回流
使用transfrom代替top
使用visibility替换display:none,因为前者只会引起重绘,后者会引起回流(改变了布局)
不要使用table布局,可能很小的一个改变会造成整个table的重新布局
10.Vue 的响应式原理中 Object.defineProperty 有什么缺陷
Object.defineProperty
无法监控到数组下标的变化,导致通过数组下标添加元素,不能实时响应;Object.defineProperty
只能劫持对象的属性,从而需要对每个对象,每个属性进行遍历,如果,属性值是对象,还需要深度遍历。Proxy
可以劫持整个对象,并返回一个新的对象(vue3中的proxy可以弥补Object.defineProperty的缺陷)
【面试|Vue常见的基础面试题(2)】
推荐阅读
- vue-cli|vue-cli 3.x vue.config.js 配置
- 2020-04-07vue中Axios的封装和API接口的管理
- 唱歌教学(导致嗓音损坏的几个常见的错误唱歌方法!)
- Hive常见问题汇总
- 2018国考外交部面试演讲不再难——只需把握好三点
- iOS面试题--基础
- VueX--VUE核心插件
- JS常见数组操作补充
- 孕期妈妈们常见的几个误区
- vue组件中为何data必须是一个函数()