1. v-if与v-show的区别
- 共同点:两者都可以控制显示与隐藏
- v-show通过display也就是css来控制显示与隐藏 浏览器会渲染HTML 初始渲染成本高 频繁切换显示与隐藏的场景使用。
- v-if 根据条件渲染DOM,不符合条件浏览器找不到这个DOM,每次切换显示与隐藏,都会重新渲染走一趟生命周期,切换开销较大,适合一次渲染,或者条件场景较多时使用。
2.v-for中key的作用
主要是提高渲染性能,v-for中key属性的值应唯一,起到身份认证的作用,避免v-for“就地更新”策略导致的问题。
3.vue中的data为什么是function
- 组件根据业务的需要,可以复用,function保证每一个组件data都是新创建的数据对象,多个组件的data数据是独立的
- 如果直接通过{}对象 给data赋值,多次使用组件会造成组件之间的data都是共享的,就是一份数据,一个组件修改data后,其他组件都受到影响。
- 另外一种解释:函数在每次使用的时候都会创建并返回一个新的实例,从而实现数据独立。如果使用的是对象,则是把内存的指向赋值给每个父组件,指向一样,那么修改的也是同一个值。
4.vue中双向绑定的原理
5、keep-alive的作用和被keep-alive声明的组件的生命周期
- 缓存组件,缓存内部实例,避免重复渲染DOM。
- 当页面第一次页面加载时会触发 beforeCreate, created, beforeMount, mounted 这几个钩子函数
- activated:keep-alive 组件激活时调用。再次进入页面只触发activated
- deactivated:keep-alive 组件停用时调用。退出页面触发deactivated
6、说一下vue的生命周期,以及生命周期都做了什么事情
一个组件通过创建到销毁就是生命周期。生命周期可以分为八个阶段:
- beforeCreate(创建前):此阶段是vue实例初始化之后。
- created(创建后):可以拿到data数据,方法以及事件,并完成数据劫持observe以及给组件实例配置watcher观察者实例。可以调用方法进行数据请求。
- beforeMount(挂载前):渲染render函数,产生虚拟DOM,新老虚拟DOM对比计算,然后渲染成真实的DOM并且替换vm.$el,然后append到我们的页面,初步流程完成。
- mounted(挂载后):此时可以操控DOM,DOM已经渲染完成。
- beforeUpdate(更新前):状态数据发生变化触发,要将变化后的数据渲染到页面上,产生一个新的虚拟DOM(Vnode),最新的和原来的Vnode做diff算法,算出最小的更新范围,从而更新render函数中的最新数据,再将更新后的render函数渲染成真实的DOM,完成数据更新。
- update(更新后):可以操作DOM,并拿到最新更新后的DOM
- 此时注意mounted和updated的执行,并不会等所有子组件都被挂载后完成执行,如何想等所有视图更新完毕后做某些事情需要在mouted或者updated中加$nextTick()中去做。
- beforeDestroy(销毁前):在这个函数还是可以操作实例 destroy(销毁后):销毁完成执行此函数。
7.vue组件间传值有哪些方式
- 父向子传值(props):从父到子的数据流向这个过程为单向数据流,props变量本身是只读不能重新赋值。
- 子向父传值:子: this.$emit("自定义事件名", 传值) - 执行父methods里函数代码 父: @自定义事件名="父methods函数"
- 兄弟组件:evenBus.on('事件名',函数体)