面试题(总结了笔者经常忘记的或者旧的不太准确的知识点)
1、组件通信方式:
-
父子组件
- props(单向的,父组件数据变化,会向子组件传递,反之则不行,为了防止子组件无意修改父组件状态)
- emit/on
- parent/children
- ref
-
兄弟组件
- eventbus
- vuex
-
跨级组件
- provide/inject
- eventbus
- vuex
2、data为什么为一个函数
- 因为组件是可复用的,可能被用来创建多个实例,那么这些组件就会共用一组数据对象,当数据变化后会相互影响,如果为一个函数,每次创建一个组件,数据都是独立的,不会相互影响,我们调用data函数就会获取一个全新的数据对象
3、nextTick
- 因为在vue中的dom更新不是同步的,如果我们想在created周期中操作dom,我们可以将操作放在nextTick中,因为nextTick实在dom更新之后才执行的
- 如果当数据变化后要更改dom结构的时候,那么这个操作要放到nextTick回调函数中。
4、生命周期
- beforeCreate
- created(适合初始化数据)
- BeforeMount
- mounted(适合操作dom)
- beforeUpdate(当数据发生变化后触发)
- updated()
5、如何操作dom
使用.refs(在组件属性中定义ref属性,在js中使用this.$refs)
6、常用指令
- 文本插值:{{ }} Mustache
- DOM属性绑定: v-bind
- 指令绑定一个事件监听器:v-on
- 实现表单输入和应用状态之间的双向绑定:v-model
- 控制切换一个元素的显示:v-if 和 v-else
- 列表渲染:v-for
- 根据条件展示元素:v-show
7、双向绑定
- vue2.0:defineProperty(不可以监听数组索引和长度的变化)
- vue3.0:proxy
优势
* 可以直接监听对象而非属性
* 可以监听数组的变化
* 方法很多,而且返回的是一个新数组,不像define直接修改数组
* 性能更好
8、vue响应式系统(就是有人在盯着data数据)
- vue中data的属性会被添加getter,setter属性,getter会收集所有的依赖data的数据,当data数据变化时,会触发setter ,vue会通知render进行更新。
9、为什么vue可以数据劫持还需要虚拟do
- 因为为对每一个数据进行劫持都需要一个观察者,观察者如果过多会影响性能,虚拟dom不需要观察者,他时不断地对比dom,寻找差异,然后进行更新。
- react的shouldComponentUpdate相当于响应式。对数据变化有一个更好的处理。针对dom改变还是使用虚拟dom。
10、vue中Class和style如何动态绑定
思路就是在标签内对对象进行绑定,在data内改变数据(布尔值或者属性值)来决定style
11、父子组件生命周期执行顺序
- 渲染过程:父beforeMount-子beforeCreate---子mounted-父mounted
- 子更新:子在父中间
- 销毁:子在父中间
12、vue如何检测对象和数组的变化
- vue增添了vm.$set
- vm.$set原理源码分析:如果监听目标是数组,直接使用数组方法splice触发响应;如果目标是对象,会先判断对象属性是否存在、是否为响应式,如果对象需要响应式处理的话,vue会调用defineReactive进行响应式处理(此方法就是vue在初始化对象时,采用defineProperty给对象添加getter和setter功能的方法)