vue2面试题

本文详细探讨了Vue.js的生命周期,包括不同阶段的执行情况以及keep-alive的影响;对比了v-if和v-for的使用场景及优先级;介绍了ref的用途和keep-alive的功能;讲解了nextTick的作用;区分了computed、methods和watch的区别;阐述了Vue组件间通信的方式,包括父传子、兄弟组件间通信;最后讨论了Vue路由的常见面试题,如SPA与传统页面的区别、路径传值、路由模式和路由守卫。
摘要由CSDN通过智能技术生成

一、Vue生命周期

1.1 Vue生命周期都有哪些?

​ 解答:系统自带了八个生命周期,分别是:

	beforeCreate
	created
  beforeMount
  mounted
  beforeUpdate
  updated
  beforeDestroy
  Destroyed

1.3 一旦进入组件或者一旦进入页面,会执行哪些生命周期?

​ 解答:会之前前面4个

	beforeCreate
	created
  beforeMount
 	Mounted

1.4 如果使用了keep-alive会多出来俩个生命周期

activated
Deactivated

1.5 如果使用了keep-alive第一次进入组件会执行5个生命周期

beforeCreate
created
beforeMount
mounted
activated

1.6 如果使用了keep-alive第二次或者第N次,每次都会执行一个生命周期

activated

二、v-show和v-if是干什么?有什么区别?

2.1 v-show

显示和隐藏 : display:none进行隐藏 、display:block进行显示		

2.2 v-if

创建和删除:remove、append		

2.3 区别:

显示和隐藏用:v-show
创建和删除用:v-if

频繁切换用:v-show
不频繁切换用:v-if	

首次加载:用v-if,不用v-show
为什么:
			如果用v-if可以没有这个盒子,然后再通过v-if进行创建(但是第一次进入页面是没有这个盒子,是不加载的)。
			如果用v-show这个盒子不管是显示还是隐藏,该盒子都是在的(节点都是存在)

2.4 使用场景:

v-show : 加入购物车、分享、蒙层这种都基本上用v-show
v-if : 首页栏目切换的时候v-if

三、v-if和v-for 优先级

v-for的优先级要比v-if的优先级高

证明这个事情,是在vue.js源码种10997行

if (el.staticRoot && !el.staticProcessed) {
  return genStatic(el, state)
} else if (el.once && !el.onceProcessed) {
  return genOnce(el, state)
} else if (el.for && !el.forProcessed) {
  return genFor(el, state)
} else if (el.if && !el.ifProcessed) {
  return genIf(el, state)
} else if (el.tag === 'template' && !el.slotTarget && !state.pre) {
  return genChildren(el, state) || 'void 0'
} else if (el.tag === 'slot') {
  return genSlot(el, state)
} else {
注:v-if和v-for不要写在同一个节点上,这个性能很差。(v-if要写在父节点上)

四、ref

4.1 是什么?

​ 获取dom
4.2 场景?

​ 如果项目中使用插件,并且插件是要获取dom的,那么就可以使用ref了。

五、keep-alive

5.1 是什么?

​ 缓存组件
5.2 一旦使用keep-alive会多倆个生命周期

​ activated
​ deactivated
5.3 功能

​ 提升性能的

六、nextTick

6.1 是什么?

​ 当dom更新完毕执行内部代码
6.2 场景

​ 使用插件的时候会用到。例如new Swiper这个插件可能会获取当前元素的宽度或者高度,等dom都加载完毕再去获取宽度和高度就不会有任何问题了。

七、computed、methods、watch区别

computed:计算属性
可以监听某些数据的变化,并且有缓存。
如果一进入页面调用,就会触发
methods : 可以放入函数
没有缓存
如果一进入页面调用,就会触发
watch :监听(路由和数据)
当数据发生改变时,才会触发
可以得到现在的值和过去的值

八、Vue组件的通信(组件的传值)

8.1 父传子

父:
<HelloWorld :msg="str" />
<HelloWorld :msg="str" ></HelloWorld>

子:
props:['msg']
props: {
	msg: String,
},### 8.2 子传父​

子:
<button @click=“changeParentName”>改变父组件的name
export default {
methods: {
//子组件的事件
changeParentName: function() {
this.$emit(‘handleChange’, ‘Jack’) // 触发父组件中handleChange事件并传参Jack
// 注:此处事件名称与父组件中绑定的事件名称要一致
}
}
}
父:
<child @handleChange=“changeName”>
methods: {
changeName(name) { // name形参是子组件中传入的值Jack
this.name = name
}
}

8.3 兄弟组件传值

创建bus作为中转​
import Vue from “vue”;
export default new Vue;

A组件:
<button @click=‘btn’>HelloWorld按钮
data () {
return {
hlStr:“这是helloWorld组件的数据”
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值