vue面试

775 阅读5分钟

vue的生命周期

vue2

创建前后:beforeCreate、created

挂载前后:beforMount、mounted

更新前后:beforeUpdate、updated

销毁前后:beforeDestroy、destroyed(后改为beforUnmount,unmount)

vue3

-setup相对于是整合了beforeCreate和created

-其余的生命周期在setup函数中执行

onBeforeMount() 、onMounted()

onBeforeupdate()、onUdated()

onBeforeUnmount()、onUnmounted()

数据请求在created和mouted这两个生命周期执行的区别

created是在组件实例创建完成后立即调用,这时候页面的dom节点并未生成;

mouted是在dom节点渲染完毕后立即执行;

所以放在mounted中请求可能会导致页面闪动,所以建议将页面内容的改动放在created生命周期中。

vue组件间的通信方式

父子组件之间的通信

-使用props从父组件参数给传递子组件

-使用emit触发自定义事件从子组件传递参数给父组件 (in mi t)

-parent获取父组件的实例(pai run si)

-使用ref获取子组件的实例

-通过attrs进行父孙组件的通信(使用在子组件使用bind绑定attrs)

兄弟组件之间的通信

-使用parent在父级建立通信

-使用EventBus创建一个中央事件总线(实质就是一个发布订阅函数)

非关系组件间之间的通信

-vuex

-localstorage...

????

废弃

-children:获取子组件实例

-listeners(li sen ner si):父孙组件传递方法(使用on绑定listeners,废弃后继承到了attrs里面)

常用的指令有哪些

-条件渲染指令 v-if v-show

-列表渲染指令 v-for

-属性绑定指令 v-bind

-事件绑定指令 v-on

-双向数据绑定指令 v-model

v-if和 v-show的区别

v-if直接操作dom节点的添加或者删除,而v-show只是在样式上做修改

v-if在初始条件为false时是不会渲染的,但v-show总是会渲染

v-if有着更高的切换开销,v-show有着更高的初始渲染开销

使用场景:v-if适合做初始模块渲染判断,v-show适合做切换判断

v-if和v-for的优先级

-在vue的源码中v-for的判断要比v-if早(else if ... ),所以v-for的优先级要高于v-if

-所以不要将v-if和v-for写在同一个标签中,可以在将v-for的循环包裹在v-if的标签中,这样可以优化性能。

 

vue数据更新,但视图不更新问题

-vue2是通过Object.defindPropety(D fan de pro po t)来实现数据响应式,当修改对象中的值时能够触发setter和getter方法,而给对象添加或者删除新属性时吗,却无法触发。

-所以当给对象添加或删除新属性时,视图就不会更新。

解决办法

-通过vue.set解决

-通过forceUpdate方法强制刷新(fo ser update)

-通过深拷贝的方式,创建一个新对象,合并原对象和需要插入的属性

vue 中内置的指令有哪些

-条件渲染指令  v-if v-show

-列表渲染指令  v-for

-属性绑定指令  v-bind

-事件绑定指令  v-on

-双向数据绑定指令  v-model

 

可以绑定属性的内置指令

v-bind v-model v-html

 

v-model 的理解

-v-model指令主要用于在表单元素上实现双向数据绑定,使得表单元素的值可以根据vue实例的数据属性实现实时的交互

-v-model实际是v-bind和v-on的语法糖,是它们两个指令的结合

<input v-model="message" />
<input v-bind:value="message" v-on:input="message = $event.target.value" />

数据双向绑定的理解

双向数据绑定原理是通过数据劫持来监听数据变化,利用发布-订阅模式来广播和处理这些变化,而 v-model 指令则提供了一种方便的语法来应用和管理这种双向绑定

 

Vuex

-vuex是一个公共的状态管理工具,通常用于管理一些公共的状态,也可以用来进行组件之间的通信

五个核心

-state:用于存储公共状态

-getters:用于处理state之后得到的一些结果,类似于computed

-mutations:用来改变state

-actions:用来处理一些异步任务

-modules:当项目过大,每个模块需要自己独立的公共状态

页面刷新后vuex状态会丢失吗

-会,vuex存储数据只是存储在内存中,刷新必然会丢失状态,需要持久化就要存起来

-locastorage就很适合,在提交mutation的时候同时存入到locastorage中,或者存储到数据库

-但是并不是所有的数据都需要做持久化尺寸,我们可以通过vue-persist(per 赛 s t)这种第三方库去做一个判断,根据我们配置的数据进行存储。

action 和 mutation 区别

  • 在vuex中,actions和mutations(new tei shen)分别用于处理同步操作和异步操作

NextTick

是什么

-NextTick是等待下一次Dom更新的工具方法

-在修改数据之后立即使用这个方法,可以获取更新后的Dom

-当数据被修改后,vue会开启一个异步的更新队列,视图需要等队列中全部的数据变化后才会更新,所以当我们修改数据后,立刻去获取对应的dom节点的数据,获取到的还是更新前的数据,是用nextTick方法后,在获取对应的dom节点,即可获取到更新后的dom

使用方法

1.直接使用 2.在回调函数中使用

this.message = '修改后的值'
console.log(this.$el.textContent) // => '原始的值'
// 方法二
this.$nextTick(function () {
    console.log(this.$el.textContent) // => '修改后的值'
})
// 方法一
await this.$nextTick()
console.log(this.$el.textContent) // => '修改后的值'

使用场景

-在created生命周期阶段需要获取到dom时

-响应式数据变化后获取到Dom更新后的状态,例如希望获取列表更新后的高度

keep-alive

是什么

-keep-alive是vue的内置组件,可以在开发中缓存组件

-使用keep-alive包裹动态组件component时,会缓存组件实例,而不是销毁它,这样在组件切换的过程中可以将状态保留在内存中,防止重复渲染Dom。

使用方法

可以设置以下三个props属性

-include:只有名称匹配的组件会被缓存

-exclude:任何名称匹配的组件都不会被缓存

-max:最多可以缓存多少组件实例

特性

使用keep-alive的组件,会多出两个生命周期

-activated (阿 ke t v d),可以在组件被激活时调用这个钩子

-deactivated (di 阿 ke t v d),相当于销毁阶段

vue中路由管理用什么

-在vue中通常使用Vue Router进行路由管理。它是vue.js官方的路由管理器,提供了用于创建单页应用页面的路由功能

-使用Vue Router可以轻松的创建路由配置,定制不同路由路径和对应的组件,实现页面之间的导航。

-安装Vue Router后,可以在Vue入口文件中引入并使用,并可以设置它的三个路由模式

三种模式

-哈希模式(hash mode): 它使用url井号(#)后面的部分进行路由匹配,不需要服务器端的渲染。通过javaScript的window.onhashchange事件来检测路由的变化,并相应的更新页面内容,

-历史记录模式(history mode):利用html5的History API来实现路由,这种模式没有url更加美观没有井号。历史记录模式需要服务端的配置,已确保用户直接访问特定url时,服务器能够正确的响应对应资源。

-抽象模式(Abstract Mode):抽象模式主要用于没有实际 URL 的环境,例如在服务器端渲染(SSR)的应用中,或者在原生应用内使用 WebView 时。这种模式通过 JavaScript 中的 window.history.pushState 和 window.history.replaceState 方法来模拟 URL 的变更

Vue的路由钩子函数有哪些