VUE面试题

63 阅读3分钟

一.vue的生命周期

1.系统自带:beforeCreate、created、beforeMount、mounted、beforeUpdate、updated、beforeDestory、destoryed。

2.一旦进入到页面或者组件,会执行哪些生命周期,顺序:beforeCreate、created、beforeMount、mounted。

3.如果加入了keep-alive,会多两个生命周期:activated(进入),deactivated(离开)。

4.如果加入了keep-alive,第一次进入组件,会执行哪些生命周期:beforeCreate、created、beforeMount、mounted、activated。

5.如果加入了keep-alive,第二次或第n次进入组件,会执行哪些生命周期:只执行一个生命周期:activated。

6.在哪个阶段有el、那个阶段有el、那个阶段有data:beforeCreate啥也没有,created开始有datamounted开始有data,mounted开始有el。

二.谈谈你对keep-alive的了解。

1.keep-alive是什么:vue系统自带的一个组件,功能:是来缓存组件的,可以提升性能。

2.使用场景:就是来缓存组件,提升项目的性能。具体实现比如首页进入到详情页,如果用户在首页每次点击都是相同的,那么详情页就没必要请求N次了,直接缓存起来就可以了,当然如果点击的不是同一个,那么就直接请求。

三、v-if和v-show的区别

1.展示形式不同:v-if是通过创建一个dom节点来显示。v-show是display:block/none来显示与隐藏。 2.使用场景不同:当组件中某块内容只会显示或隐藏不会被再次改变显示状态,此时用v-if更加合适,例如请求后台接口通过后台数据控制某块内容是否显示或隐藏,且这个数据在当前页不会被修改;当组件某块内容显示隐藏是可变化的,此时用v-show更加合理,例如页面中有一个toggle按钮,点击按钮来控制某块区域的显示隐藏。

四、v-if和v-for的优先级

1.v-for优先级要比v-if高。一般v-if写在外标签判断完之后v-for。

五、ref是什么

1.ref是用来获取dom的。<div ref='box'> ...this.$refs.box;

六、nextTick是什么

1.获取更新后的dom内容。 2.场景:原来的dom <div ref='box'>{{str}},data里定义str='aaaa',然后更改str的值:this.str = 'bbbb',console.log(this.$refs.box.innerHTML)获取到的值还是aaaa,this.$nextTick(()=>{console.log(this.$refs.box.innerHTML)})获取到的值就是bbbb。 3.Vue生命周期的created()钩子函数进行的DOM操作一定要放在Vue.nextTick()的回调函数中。 4.当项目中你想在改变DOM元素的数据后基于新的dom做点什么,对新DOM一系列的js操作都需要放进Vue.nextTick()的回调函数中。

七、scoped原理

1.作用:让样式在本组件中生效,不影响其他组件。 2.原理:给节点新增自定义属性,然后CSS根据属性选择器添加样式。 scss样式穿透: 父元素 /deep/ 子元素 stulus样式穿透: 父元素 >>> 子元素

八、组件间传值

1.父传子:props 父组件:在子组件标签上写:<Header :msg="msg"> 子组件:props:['msg']

2.子传父:$emit 子组件:this.$emit.("childInput",要传的数据)childInput是自定义事件名称 父组件:<Header @childInput="getVal"> methods:{getVal(msg){//msg就是子组件传递的数据}}

子组件通过props来接受数据和通过$emit来触发父组件的自定义事件;

3.兄弟组件之间传值:bus.bus.emit。bus.bus.on。

九、computed、methods、watch有什么区别

1.computed 和 methods区别:computed有缓存,methods没有。

2.computed 和 watch区别:watch是监听,数据或者路由发生了改变才可以响应(执行)。computed是计算,如果某个值改变了,计算属性会监听到进行返回。watch是当前监听到数据改变了,才会执行内部代码。

十、props 和 data 优先级谁高

  1. props 、 methods 、 data 、 computed 、 watch。

十一、Vuex你理解了哪些

1.vuex属性:state:类似于数组中的data,存放数据。 getters:类似于组件中的computed。 mutations:类似于组件中methods。 actions:提交mutations的。 modules:把以上4个属性再细分,让仓库更好管理 2.vuex是单向数据流。修改只能通过mutations、actions。 3.vuex中的mutations和actions的区别:mutations:都是同步事务。actions:可以包含任意异步操作。 4.vuex如何做持久化存储:vuex本身不是持久化存储。可以通过使用localStorage自己写,也可以使用vuex-persist插件。

十二、vue路由模式

1.路由模式有两种:hash、history 2.区别:表现形态不同:hash多个#号,history就是正常网页。 跳转请求不同:找不到的页面,history也会发送请求,hash不会。 打包后前端自测要使用hash,如果使用history会出现空白页。

十三、介绍一下SPA,SPA有什么缺点

1.SPA:单页面应用。 2.缺点:SEO优化不好, 性能不是特别好。

十四、vue路径传值

1.显式(路径上可以看到)传:this.$router.push({path:'/about',query:{a:1} })。接:this.$route.query.a 。 2.隐式:传:this.$router.push({name:'about',params:{a:1} }) 。接:this.$route.params.a 。

router:是路由实例对象,包括了路由跳转方法,钩子函数等。 route:是路由信息对象,包括“path,parms,hash,name“等路由信息参数。

十五、路由导航守卫

1.全局:beforeEach、beforeResolve、afterEach 2.路由独享:beforeEnter 3.组件内:beforeRouteEnter、beforeRouteUpdate、beforeRouteLeave 使用场景:判断是否登录,如果登录就next,否则就跳转到登录页。

十六、vue中父子组件传值,父组件异步请求,子组件不能实时更新怎么解决?(vue中数据不能实时更新怎么解决?)

首先了解父子组件生命周期执行顺序 ==> 加载渲染数据过程: 父组件 beforeCreate --> 父组件 created --> 父组件 beforeMount --> 子组件 beforeCreate --> 子组件 created --> 子组件 beforeMount --> 子组件 mounted --> 父组件 mounted --> 原因:因为生命周期只会执行一次,数据是要等到异步请求以后才能拿到,那么子组件的mounted钩子执行的时候,还没有拿到父组件传递过来的数据,但是又必须要打印出来结果,那这样的话,就只能去打印props中的默认值空字符串了,所以打印的结果是一个空字符串。 解决办法:1.使用v-if控制组件渲染的时机。初始还没拿到后端接口的异步数据的时候,不让组件渲染,等拿到的时候再去渲染组件。使用v-if="变量"去控制,初始让这个变量为false,这样的话,子组件就不会去渲染,等拿到数据的时候,再让这个变量变成true。2.使用watch监听数据的变化。3. 使用VueX

十七、路由跳转方式

  • router-link 标签跳转
  • this.$router.push()
  • this.$router.replace()
  • this.$router.go(n) :(0:当前页,-1上一页,+1下一页,n代表整数)