首页 前端知识 Vue系列面试题

Vue系列面试题

2024-08-21 22:08:48 前端知识 前端哥 971 127 我要收藏

大家好,我是有用就扩散,有用就点赞。

1.Vue中组件间有哪些通信方式?

父子组件通信:

(1)props | $emit (接收父组件数据 | 传数据给父组件)

(2)ref | $refs(给普通的DOM元素或者子组件注册引用信息 | 获取通过ref注册的引用)

(3)$parent | $children(获取当前组件的父组件实例 | 获取当前组件的子组件实例)

多层级组件通信:

(1)provide | $inject(提供子组件要使用的数据 | 子组件获取父组件定义的数据)

(2)$attrs | l i s t e n e r s (获取一个组件没有声明 p r o p 时所包含的数据,搭配 i n h e r i t A t t r s : f a l s e 使用,设置继承 listeners(获取一个组件没有声明prop时所包含的数据,搭配inheritAttrs:false使用,设置继承 listeners(获取一个组件没有声明prop时所包含的数据,搭配inheritAttrs:false使用,设置继承attrs默认行为关闭 | 获取包含父作用域中的事件监听器)

非关系组件通信:

(1)(利用vue注册自定义事件)$emit | $on(发送数据 | 获取数据)

(2)Vuex 数据全局状态管理

  • state单一状态树(mapState获取多个状态,state获取数据)

  • mutation 更改Vuex的store中的状态的唯一方法(commit设置数据)

  • getter接受state作为其第一个参数

  • actions处理异步逻辑

(3)ocalstorage和sessionstorage用作存储数据

2.Vue中v-show和v-if的区别是什么?

v-show:是渲染组件,然后改变组件的display为block或none

v-if:是惰性渲染机制,在属性初始为false时,组件就不会被渲染,直到条件为true,并且切换条件时会触发销毁/挂载组件。

如果需要非常频繁地切换,则使用v-show较好;如果在运行时条件很少改变,则使用v-if较好

3.keep-alive组件有什么作用?

1)keep-alive是vue内置的一个组件,可以使被包含的组件保留状态,避免重新渲染。

2)对于keep-alive组件来说,它拥有两个独有的生命周期钩子函数,分别为activated和deactivated。用keep-alive包裹的组件在切换时不会进行销毁,而是缓存到内存中并执行deactivated钩子函数,命中缓存渲染后会执行actived钩子函数。

3)keep-alive几个重要的属性:

  • include - 只有名称匹配的组件会被缓存
  • exclude - 任何名称匹配的组件不会被缓存
  • max - 最多可以缓存多少组件实例

4.说下Vue生命周期钩子函数?

beforeCreate 组件实例刚被创建,组件属性计算之前

created 组件实例创建完成,属性已绑定,但DOM还未生成,$el属性还不存在

beforeMount 模板编译/挂载之前$el还不存在

mounted 模板编译/挂载之后(不保证组件已在DOM中)

beforeUpdate组件更新之前

updated组件更新之后

beforeDestory 组件销毁前调用

destoryed 组件销毁后调用

Vue3支持多个相同生命周期

setup是围绕beforeCreate和created生命周期钩子运行,在setup()内部调用生命周期钩子

在Vue2生命周期钩子前面加上”on“来访问组件的生命周期钩子

5.Vue中computed和watch区别?

computed是计算属性,依赖其他属性计算值,并且computed的值有缓存,只有当计算值变化才会返回内容。

watch监听到值的变化就会执行回调,在回调中可以进行一些逻辑操作。

6.v-if和v-for为什么不能连用?

1)v-for优先于v-if被解析,从源码中发现,先处理静态节点,在处理once,在处理for,在处理if,代码显示for的优先级比if高,断点调试也证实for优先于if。在vue3中v-if优先于v-for被解析

2)如果同时使用,每次渲染都会先执行循环在判断条件,无论如何循环都避免不了,浪费了性能。

3)要避免出现这种情况,可以采用多层包裹来解决性能损耗问题。例如外层给标签绑定指令v-if或者是内层标签绑定v-if。

7.单页面应用和多页面应用区别及优缺点?

SPA优点:

(1)用户体验好、快,内容的改变不需要重新加载整个页面,基于这一点SPA对服务器压力较小

(2)前后端分离

(3)页面用户体检比较好

SPA缺点:

(1)不利于SEO

(2)导航不可用,需要自己实现导航

(3)初次加载耗时长

(4)页面复杂度提高

MPA优点:

(1)多页面应用对于SEO更加友好

(2)更容易扩展

(3)更易的数据分析

MPA缺点:

(1)程序开发成本高

(2)增加服务端压力,多页面会不停的加载

(3)用户体验相对较差

8.v-model该如何实现?

v-model本质上是v-on和v-bind的语法糖。v-model在内部为不同元素抛出不同的事件,如:

(1)text和textarea元素使用value属性和input事件

(2)checkbox和radio使用checked属性和change事件

(3)select字段将value作为prop并将change作为事件

(4)v-model作用在普通表单上

<input v-model="myvalue" />
//等同于
<input 
       v-bind:value="myvalue"
       v-on:input="myvalue=$event.target.value"
/>

(5)v-model作用在组件上

//html
<mycom v-model="myvalue"/>
//等同于
<mycom :value="myvalue" @input="(e)=>{myvalue=e}"/>

//mycom
<template>
<div>
    <input :value="value" @input="$emit('input',$event.target.value)"/>
</div>
</template>
<script>
export default {
    props:['value'],
}
</script>

9.mixin和mixis区别?

mixin用于全局混入,会影响到每个组件实例,通常插件都是这样做初始化的。比如:可以全局混入封装好的ajax或者一些工具函数等。

mixins用于单组件,是最常使用的扩展组件的方式。如果多个组件中有相同的业务逻辑,就可以将这些逻辑剥离出来,通过mixins混入代码。比如上拉下拉加载数据这种逻辑等。

mixin的问题?

(1)来源不清晰问题

(2)命名冲突问题

Vue3中不需要mixin,Vue3类似函数式编程,compostion api可以很好解决复用问题

10.Vue2中为什么检测不到数组的变化,如何解决?

由于JavaScript的限制,Vue不能检测数组变动。Vue2中采用Object.defineProperty来实现数据响应式,Object.definePropery虽然可以监听到数组的变化,但是由于在性能和体验的性价比上考虑,Vue2放弃了这个特性。

在Vue2中想实现数组的响应式可以通过全局Vue.set或者实例方法vm.$set来修改,使得数据变得响应式,也可以通过数组的变异方法来实现(push、pop、shift、unshift、splice、sort、reverse)

欢迎各位大哥投稿PR。

转载请注明出处或者链接地址:https://www.qianduange.cn//article/16450.html
标签
评论
发布的文章

HTML5入门基础

2024-06-16 09:06:50

大家推荐的文章
会员中心 联系我 留言建议 回顶部
复制成功!