【手撕面试题】Vue(高频知识点四)

作者 : admin 本文共6681个字,预计阅读时间需要17分钟 发布时间: 2024-06-4 共3人阅读

        每天10道题,100天后,搞定所有前端面试的高频知识点,加油!!!在看文章的同时,希望不要直接看答案,先思考一下自己会不会,如果会,自己的答案是什么?想过之后再与答案比对,是不是会更好一点,当然如果你有比我更好的答案,欢迎评论区留言,一起探讨技术之美。

目录

面试官:请简述一下keep-alive的使用场景和实现原理。

面试官:请简述一下vue组件的渲染流程。

面试官:vue首屏白屏情况你有什么方法解决。

面试官:请简述一下vue单页面和传统多页面的区别?

面试官:请简述一下vue中v-cloak的理解?

面试官:请问如何使用vue-router实现懒加载方式?

面试官:说明一下对于vue中 $emit、$on、$once、$off的理解?

面试官:请简述一下vue-loader是什么?使用它的用途有哪些?

面试官:请简述一下vue的普通Slot以及作用域Slot的区别?

面试官:请问在SPA首屏加载速度慢情况下,如何解决这个问题?


面试官:请简述一下keep-alive的使用场景和实现原理。

我,呃~,当客户端与服务器之间需要频繁通信的时候,这里使用keep-alive是可以减少每次通信所需的资源消耗的,这里对其使用场景和实现原理进行一个简单的概述:

使用场景

1)列表数据展示:当列表数据展示较为复杂,渲染速度可能较慢时,可以使用keep-alive组件缓存列表组件,避免重复渲染,提高性能。

2)路由切换:路由切换时需要缓存某些页面或组件的状态,以便在返回时能够迅速恢复。当然也可以配合router-view使用,缓存整个路由页面。

3)状态管理:在管理一些状态时避免重复渲染和减少组件的渲染次数的场景中也可以使用。

实现原理

1)组件缓存:用于缓存不活动的组件实例而不是进行销毁,会将状态保持在内存中,直到缓存的所有组件都被销毁。

2)内部缓存对象:通过一个内部的缓存对象来缓存组件实例,当组件被包裹keep-alive中会被添加到缓存对象中,当组件需要被重新激活时,keep-alive会从缓存中取出该组件的实例并重新挂在到视图上。

3)生命周期钩子:被包含在keep-alive中的组件会多出两个生命周期钩子:activated和deactivated。activated钩子在组件被激活时调用、deactivated钩子在组件被停用时调用。

4)include/exclude属性:通过include和exclude属性可以选择需要和不需要被缓存的组件,include属性用于指定需要被缓存的组件名称,exclude属性用于指定不需要被缓存的组件

5)LRU算法:在使用keep-alive时,可以通过key属性来区分不同的组件实例,当key值发生变化时,会触发组件的重新渲染。

6)key属性:在使用keep-alive时,可以使用key属性来区分不同的组件实例,当key值发生变化时会触发组件的重新渲染。

总之:keep-alive的作用是通过在客户端和服务器之间保持持久的连接,减少每次请求时的连接建立开销,从而提高性能和效率。

面试官:请简述一下vue组件的渲染流程。

我,呃~,vue组件的渲染流程可以分为以下几个步骤:

1)解析模板:vue组件通常包含一个模板(template),vue会首先解析一下模板将其转换为虚拟DOM(Virtual DOM)树。

2)创建虚拟DOM:在解析模板的过程中,vue会将模板转换为一个虚拟DOM树,它是以一个JS对象表示的抽象树,用于描述组件的结构和内容。

3)数据绑定:vue会将组件中的数据与虚拟DOM建立关联,通过数据绑定的方式实现动态更新,当数据发生变化时,vue会检测到变化并更新对应的虚拟DOM节点。

4)渲染虚拟DOM:一旦数据发生变化vue会根据新的虚拟DOM树重新渲染组件,将虚拟DOM转换为真实DOM节点。

5)更新DOM:vue会将新旧DOM树进行比较来找出需要更新的部分,并将其渲染到真实的DOM节点上,vue使用的是diff算法来高效地比较虚拟DOM树的差异,从而最小化DOM操作的次数。

6)完成渲染:一旦更新完成vue会触发生命周期钩子,通知组件已经渲染完成,并可以执行一些额外的操作。

总之:vue组件的渲染流程包括模板解析、虚拟DOM树的创建、数据绑定、虚拟DOM渲染、DOM更新等步骤,通过这些步骤,vue可以使用高效且灵活的组件渲染机制。

面试官:vue首屏白屏情况你有什么方法解决。

我,呃~,首页白屏是指在访问网页时,浏览器展示的是一个空白页面,而不是页面内容,这种情况通常由于页面加载速度较慢或者JS执行时间过长而导致,这里我给出一些解决办法:

1)懒加载和分割代码:使用vue提供的懒加载和代码分割功能,将页面中不必要的组件、路由或者资源延迟加载,优先加载首屏所需的核心内容,减少首屏加载时间。

2)异步加载资源:将一些不影响页面首次渲染的资源(如统计代码、广告等)使用异步方式加载,避免阻塞页面加载。

3)预渲染:对静态页面或者不需要实时数据的页面可以使用预渲染技术,将页面提前生成为静态HTML文件,直接返回给浏览器,从而快速展示页面内容。

4)优化代码和资源:检测并优化代码,减少不必要的网络请求和资源加载时间,可以压缩合并JS和CSS文件,减少文件体积,提高加载速度。

5)使用缓存策略:使用合适的缓存策略,利用浏览器缓存、CDN缓存等技术,较少资源重复加载,加载页面加载速度。

面试官:请简述一下vue单页面和传统多页面的区别?

我,呃~,单页面(SPA)和传统多页面(MPA)的区别大致如下:

1)页面加载速度:单页面应用只有一个HTML文件,所有页面切换和内容更新都是JS动态加载实现的,页面之间切换是无刷新的,通过路由控制,一旦页面加载完毕后续页面切换通常只需加载数据,不需要重新加载整个页面;传统多页面有多个HTML文件,每个页面对应一个HTML文件,页面之间通过超链接跳转实现,每次页面切换都会重新加载整个页面。

2)路由管理:单页面使用前端路由进行页面导航和管理,通过路由器来定义页面之间的跳转规则并在前端通过JS来控制页面切换;传统多页面应用路由通过后端来管理,页面之间跳转通过超链接来实现。

3)性能:单页面在初次加载可能会有较长的加载时间,因为要加载整个应用的JS和其它资源,一旦加载完成后续的页面切换通过会更快,因为只需要加载数据和部分资源;多页面在每次页面切换时都需要重新加载整个页面,可能会导致页面加载速度较慢。

4)开发模式:单页面应用通常采用前后端分离的开发模式,前端负责页面交互后端负责提供数据接口和业务逻辑;传统多页面通常采用传统的服务器渲染模式,前后端通常是紧密耦合的。

5)用户体验:单页面提供更流畅的用户体验,因为页面之间的切换是无刷新的,可以提高用户的满意度和留存率;传统多页面每次页面切换都需要重新加载页面,可能会导致页面闪烁或者加载速度过慢的情况。

面试官:请简述一下vue中v-cloak的理解?

我,呃~,v-cloak是vue提供的一个指令,用于解决在初始化渲染时,vue模板会闪烁出未编译的{{}}插值表达式的问题,当vue实例化时vue会先解析dom模板,然后再将数据进行双向绑定,如果数据过慢那么在vue尚未完成数据绑定之前,页面中的模板会显示出未编译的插值表达式,给用户带来不好的体验。

v-cloak作用:在vue实例化之前通过css将带有该指令的元素进行隐藏,等到vue完成实例化和数据绑定后,再将这些元素显示出来,从而避免页面出现未编译的插值表达式。使用方法很简单,在需要隐藏的元素上添加v-cloak属性,然后通过css设置该属性对应的样式,示例代码如下:


  {{ message }}


[v-cloak] {
  display: none;
}

这样在vue实例化之前,该div元素会被隐藏,直到vue完成实例化后,才会显示出来,避免了未编译的插值表达式闪烁出现的情况。

面试官:请问如何使用vue-router实现懒加载方式?

我,呃~,实现懒加载的方式很简单,这里通过将路由组件按需加载即可,以减少应用的初始加载时间和资源占用,这里给出vue3的懒加载方式:

import { createRouter, createWebHistory } from 'vue-router';

const Foo = () => import(/* webpackChunkName: "group-foo" */ './Foo.vue');
const Bar = () => import(/* webpackChunkName: "group-bar" */ './Bar.vue');

const routes = [
  { path: '/foo', component: Foo },
  { path: '/bar', component: Bar }
];

const router = createRouter({
  history: createWebHistory(),
  routes
});

export default router;

在v3中,使用了 createRouter 和 createWebHistory 来创建路由实例和路由模式,懒加载的语法仍然是使用动态导入,通过 import() 函数引入组件,webpack会将这些懒加载的组件单独打包成chunk文件。

面试官:说明一下对于vue中 $emit、$on、$once、$off的理解?

我,呃~,这些方法都是用于处理组件间通信的重要工具,它们允许组件之间发送和接收自定义事件。这里逐一对这些方法进行简单的解释一下:

$emit:用于触发自定义事件的方法,在vue组件中可以使用$emit方法触发自定义事件,并传递需要传递的参数,这里可以接收两个参数,第一个参数是事件名称,第二个参数是可选的事件参数,示例代码如下:

// 在子组件中触发一个名为 "update" 的自定义事件,并传递参数
this.$emit('update', newData);

$on:用于监听自定义事件的方法,在vue组件中可以使用$on方法监听另一个组件触发的自定义事件,并在事件发生时执行回调函数,方法接收两个参数,第一个是参数是事件名称,第二个参数是事件发生时要执行的回调函数,示例代码如下:

// 在父组件中监听子组件触发的 "update" 事件,并执行相应的处理函数
childComponent.$on('update', newData => {
  // 处理新数据
});

$once:$once 和 $on 类似,用于监听自定义事件,但是它只会在事件第一次触发时执行一次回调函数,之后会自动移除监听器,方法接受两个参数,第一个参数是事件名称(字符串),第二个参数是事件发生时要执行的回调函数,示例代码如下:

// 在父组件中只监听一次子组件触发的 "update" 事件,并执行相应的处理函数
childComponent.$once('update', newData => {
  // 处理新数据
});

$off:用于移除自定义事件的监听器,可以通过$off方法来手动移除已经设置的事件监听器,方法接收两个参数都是可选的,如果不传递参数则会移除所有事件监听器,如果只传递事件名称则会移除该事件名称的所有监听器,如果同时传递事件名称和回调函数则会移除指定事件的指定回调函数,示例代码如下:

// 移除所有事件监听器
childComponent.$off();

// 移除指定事件的所有监听器
childComponent.$off('update');

// 移除指定事件的指定回调函数
childComponent.$off('update', callback);

面试官:请简述一下vue-loader是什么?使用它的用途有哪些?

我,呃~,vue-loader是一个webpack的加载器,它专门用于将Vue组件的单文件(.vue文件)转换为JavaScript模块,以便在webpack打包过程中进行处理,这里简单叙述一下其用途:

1)解析.vue文件:vue-loader能够解析.vue文件中的模板、样式和脚本,并将它们分离出来进行单独的处理,这使得开发者能够以一种更加结构化和模块化的方式组织Vue组件的代码。

2)热重载:vue-loader支持热重载功能,即在开发过程中对.vue文件的修改会立即反映在浏览器中,无需手动刷新页面。这大大提高了开发效率,使得开发者能够快速看到代码修改的效果。

3)预处理器支持:vue-loader支持各种预处理器,如sass、less和stylus等,这意味着开发者可以在.vue文件中使用这些预处理器语言来编写样式,从而更加灵活地控制组件的外观和布局。

4)模块化开发:vue-loader支持es5语法,如导入和导出模块,使得在Vue组件中可以使用模块化开发的方式,这有助于减少全局命名空间的污染,提高代码的复用性和可维护性。

总之:vue-loader是vue开发中一个重要的工具,它简化了单文件组件的开发过程,提供了热重载和预处理器支持等功能,使得开发者能够更加高效、灵活地构建Vue.js应用。

面试官:请简述一下vue的普通Slot以及作用域Slot的区别?

我,呃~,在vue中普通 Slot 和作用域 Slot 是用于组件通信和复用的两种不同方式,这里简单的讲述一下:

普通Slot:普通 Slot 是最基本的插槽形式,在父组件中使用子组件时,可以将内容传递给子组件的指定插槽中,在父组件中,使用 元素来声明一个插槽,子组件中未命名的 将会匹配父组件中的任何未命名的插槽,父组件中的内容将会替换掉子组件中相应插槽的内容,示例代码如下:



  
    

This content will replace the default slot in ChildComponent

作用域Slot:作用域 Slot 允许父组件向子组件传递数据,并且子组件可以在插槽中使用这些数据,在父组件中,通过将数据传递给 标签的 v-slot 指令来声明一个作用域插槽,并在插槽中使用该数据,子组件中,使用 元素的 name 属性来声明插槽,并在插槽内使用数据,示例代码如下:



  
    
      

{{ slotProps.data }}

区别

1)普通 Slot 主要用于简单的内容分发,父组件的内容会替换子组件的默认插槽内容。

2)作用域 Slot 则允许父组件向子组件传递数据,并在子组件中使用这些数据,子组件可以在插槽中通过作用域插槽的参数来访问这些数据,从而实现更灵活的内容分发和交互。

面试官:请问在SPA首屏加载速度慢情况下,如何解决这个问题?

我,呃~,解决单页面应用(SPA)首屏加载速度慢的问题是关键,因为首屏加载速度直接影响用户体验和网站的整体性能。以下是一些可能的解决方案:

1)代码分割:将应用程序的代码分割成多个小块,并在需要时按需加载。可以使用 webpack 等工具来实现代码分割,这样可以减少首屏加载所需的代码量,加快页面加载速度。

2)懒加载:延迟加载页面中的非必要资源,如图片、视频、组件等。可以使用 Vue.js 或 React 等框架提供的懒加载功能,或者手动实现懒加载逻辑,以在用户需要时再加载这些资源。

3)优化图片:使用适当的图片格式和压缩技术来优化页面中的图片。可以使用工具将图片压缩到适当的大小,并尽量减少不必要的图片加载。

4)服务端渲染(SSR):将页面的渲染逻辑移到服务器端,在服务器端生成完整的 HTML 页面并发送给客户端,可以减少客户端首屏加载所需的时间。使用框架如 Nuxt.js(基于 Vue.js)或 Next.js(基于 React)可以简化 SSR 的实现。

5)CDN加速:使用内容分发网络(CDN)来加速静态资源的加载。将静态资源(如 JavaScript、CSS、图片等)部署到全球各地的 CDN 节点上,可以使用户从最近的节点获取资源,从而减少加载时间。

6)减少HTTP请求:尽量减少页面中的 HTTP 请求数量,可以合并和压缩 JavaScript 和 CSS 文件,以及将小的图标和样式表合并到 CSS Sprites 中,减少页面加载所需的请求次数。

7)使用缓存:合理利用浏览器缓存机制和服务端缓存,减少重复请求和数据传输。可以设置合适的缓存头部(Cache-Control、Expires 等)来告诉浏览器和服务器如何缓存资源。

8)性能优化:对页面中的关键路径进行性能优化,如减少 JavaScript 和 CSS 的执行时间、减少重排和重绘、优化 DOM 结构等,以提高页面的渲染速度和响应性能。

综合利用上述方法,可以有效地提高单页面应用首屏加载速度,提升用户体验和网站性能。

本站无任何商业行为
个人在线分享 » 【手撕面试题】Vue(高频知识点四)
E-->