请简单描述一下vue的生命周期
beforeCreate、created(此时需说明可以在created中首次拿到data中定义的数据)、 beforeMount、mounted(此时需说明dom树渲染结束,可访问dom结构)、 beforeUpdate、updated、 beforeDestroy、destroyed
请阐述一下你所理解的MVVM模式
vue是采用数据劫持配合发布者-订阅者模式的方式,通过Object.definerproperty()来劫持各个属性的setter和getter,在数据变动时,发布消息给依赖收集器,去通知观察者,做出对应的回调函数,去更新视图
v-if和v-show的区别
v-if
:
v-if
会控制这个DOM节点的存在与否- 如果在运行时条件很少改变,则使用v-if比较好
v-show
:
v-show
仅仅控制元素的显示方式,通过display的属性none- 当我们需要经常切换某个元素的显示/隐藏时,使用v-show会更加节省性能上的开销
vue-router的hash和history的区别
hash 是根据页面锚点实现跳转 history是通过浏览器API实现锚点
Vue组件如何通信?
- 父传子:props
- 子传父:#emit $on
- 兄弟之间通信 eventBus vuex
- 获取父组件实例的方式children
- ref获取实例的方式调用组建的属性或者方法
$nextTick用过吗,有什么作用
在下次DOM更新循环结束之后执行延迟回调,在修改数据之后立即使用这个方法,获取更新后的DOM(官网) 解决的问题:有些时候在改变数据后立即要对dom进行操作,此时获取到的dom仍是数据刷新前的dom,无法满足需要,这个时候就用到了$nextTick
为何Vue采用异步渲染?
理解:vue是组件级更新 如果不采用异步更新,那么每次更新数据都会对当前组件进行渲染,所以为了性能考虑,vue会在本轮数据更新后,再去异步更新视图
什么场景下是必须用watch
父传子的时候
双向数据绑定双层数组不能绑定??
使用$set来设置属性
v-model的原理
v-model主要提供了两个功能,view层输入值影响data的属性值,data属性值发生改变会更新view层的数值变化。 其核心就是,一方面modal层通过defineProperty来劫持每个属性,一旦监听到变化通过相关的页面元素更新。另一方面通过编译模板文件,为控件的v-model绑定input事件,从而页面输入能实时更新相关data属性值。 v-model就是vue的双向绑定的指令,能将页面上控件输入的值同步更新到相关绑定的data属性,也会在更新data绑定属性时候,更新页面上输入控件的值
vue中v-html会导致哪些问题
- 可能会导致xxs攻击
- v-html会替换掉标签内部的子元素
什么是作用域插槽?
1、插槽
- 创建组件虚拟节点时,会将组建的儿子的虚拟节点保存起来,当初始化组件时,通过插槽属性将儿子进行分类
{a:[vnode],b:[vnode]}
- 渲染数组时会拿对应的slot属性的节点进行替换操作(插槽的作用域为父组件) 2、作用域插槽
- 作用域插槽在解析的时候,不会作为组建的孩子节点,会解析成函数,当子组件渲染时,会调用此函数进行渲染(插槽的作用域为子组件)
谈谈你对keep-alive的了解?
理解:keep-alive 可以实现组件的缓存,当组件切换时不会对当前组件进行卸载,常用的两个属性include/exclude
,2个生命周期activated,deactivated
LRU算法