vue知识点总结

141 阅读2分钟

面试题(总结了笔者经常忘记的或者旧的不太准确的知识点)

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功能的方法)