vue面试题2023

1.$route和$router的区别?

  • routes : 数组。 路由匹配规则

  • router : 对象。 路由对象

  • $router : 对象。 用于跳转路由 和 传递参数

  • $route :对象。 用于接收路由跳转参数

1.Vue的生命周期方法有哪些?

- beforeCreate 初始化实例前(在当前阶段 data、methods、computed 以及 watch 上的数据和方法都不能被访问。)

- created 实例创建完成之后被调用

- beforeMount 挂载开始之前被调用(相关的 render 函数首次被调用)

- mounted 挂载之后 (在当前阶段真实的DOM挂载完毕,数据完成双向绑定,可以访问DOM节点)

- beforeUpdate 数据更新前调用 (不会触发重新渲染过程)

- updated 更新完成之后

- beforeDestory 实例销毁之前调用

- destroyed 实例销毁之后调用 (Vue实例指示的东西都会解绑,所有事件监听移除)

- activated keep-alive专属,组件被激活时调用

- deactivated keep-alive专属,组件被销毁是调用

异步请求在哪一步发起?

可以在钩子函数 created、beforeMount、mounted 中进行异步请求,因为在这三个钩子函数中,data已经创建,可以将服务器端返回的数据进行赋值。

如果异步请求不需要依赖 DOM 推荐加载 created 钩子函数中调用异步请求,因为在 created 钩子函数中调用异步请求有以下优点:

能更快获取到服务端数据,减少页面loading时间


如果依赖DOM元素:需要再mounted里面进行请求
 

2.与 2.x 版本生命周期相对应的组合式 API

- beforeCreate -> 使用 setup()

- created -> 使用 setup()

- beforeMount -> onBeforeMount

- mounted -> onMounted

- beforeUpdate -> onBeforeUpdate

- updated -> onUpdated

- beforeDestroy -> onBeforeUnmount

- destroyed -> onUnmounted

- errorCaptured -> onErrorCaptured

3.为什么data是一个函数

组件的data写成一个函数,数据以函数返回值形式定义

这样每复用一次组件,就会返回一分新的data,类似于给每个组件实例创建一个私有的数据空间,让各个组件实例维护各自的数据

而单纯的写成对象形式,就使得所有组件实例共用了一份data,就会造成一个变了全都会变的结果。
 

- 避免组件被复用时,数据存在引用关系
- vue组件可能存在多个实例,如果使用对象形式,会导致多个组件共用一个data,从而使一个组件影响其他组件。
- 如果用函数定义,会返回一个全新的对象,避免了组件间之间data的相互影响。

4.【几乎必问】vue组件传值

- props 和 $emit。

        父组件向子组件传递数据是通过props传递的,

        子组件传递给父组件是通过$emit触发事件来做到的。

- $parent 和 $children 获取单签组件的父组件和当前组件的子组件。

- $refs 获取组件实例

- 父传子孙:provide 和 inject

- vuex 状态管理(实现不同组件之前的数据共享)

--------------------------------------------

父传子

1.子组件props定义变量
2.父组件在使用子组件时通过行内属性给props变量传值

特点:单向数据流

子传父

1.子组件:$emit触发父的事件

2.父在使用组件用@自定义事件名=父的方法 (子把值带出来)

特点:事件监听

非父子组件

vuex

4.Vue 的单项数据流

- 数据总是从父组件传递到子组件,子组件没有权利修改从父组件传过来的数据,只能请求父组件对原始数据进行修改。

5.computed 和 watch 的区别和运用的场景。

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

- watch 监听到值得变化就会调用。

计算属性一般用在模板渲染中,某个值是依赖其它响应对象甚至是计算属性而来;

而侦听属性适用于观测某个值的变化去完成一段复杂的业务逻辑。

6.Vuex

- vuex可以实现不同组件之间的状态共享

- vuex可以实现组件内数据的持久化

为什么需要 vuex
由于组件只维护自身的状态(data),组件创建时或者路由切换时,组件会被初始化,从而导致 data 也 随之销毁。
使用方法
在 main.js 引入 store,注入。只用来读取的状态集中放在 store 中, 改变状态的方式是提交
mutations,这是个同步的事物,异步逻辑应该封装在 action 中。

什么场景下会使用到 vuex

如果是 vue 的小型应用,那么没有必要使用 vuex,这个时候使用 vuex 反而会带来负担。组件之间的 状态传递使用 props、自定义事件来传递即可。 但是如果 涉及到 vue 的大型应用 ,那么就需要类似于 vuex 这样的集中管理状态的状态机来管理所有 组件的状态。例如登录状态、加入购物车、音乐播放等,总之只要是开发 vue 的大型应用,都推荐使 用 vuex 来管理所有组件状态
 

- vuex的核心概念

(1)、state:设置初始值

(2)、getter:允许组件从state中获取数据

(3)、Mutation:修改state中状态的方法,且必须是同步函数

(4)、Action:用于提交mutation,可以包含任何异步请求

(5)、Module

- vuex流程

在vue组件里面,通过dispatch来触发actions提交修改数据的操作,

然后通过actions的commit触发mutations来修改数据,mutations接收到commit的请求,就会

自动通过mutate来修改state,最后由store触发每一个调用它的组件的更新。

7.Vue 的性能优化

- 不需要响应式的数据不要放在 data 中

- v-if 和 v-show 区分使用场景

- computed 和 watch 区分场景使用

- v-for 遍历必须加 key,key最好是id值,且避免同时使用 v-if

- 长列表滚动到可视区域加载

- 防止内部泄露,组件销毁后把全局变量和时间销毁

- 图片懒加载

- 路由懒加载

- SPA 页面采用keep-alive缓存组件

- key保证唯一

- 第三方模块的按需加载

- 适当采用 keep-alive 缓存组件

- 防抖、节流

- 增加loading用户体验

- 骨架屏

----

- 预渲染

- 服务端渲染SSR

----

- 压缩代码

- 使用cdn加载第三方模块

8.vue首屏加载慢的原因,解决方案,怎么解决白屏问题

- 首屏加载慢原因:第一次加载页面有很多组件数据需要渲染

- 解决方案:

(1)路由懒加载

(2)UI组件按需加载

(3)gzip按需加载

- 解决白屏:

(1)使用v-text渲染数据

(2)使用{{}}语法渲染数据,同时使用v-cloak指令

9.SPA首屏加载速度慢的怎么解决?

- 加载慢的原因

1、网络延时问题

2、资源文件体积是否过大

3、资源是否重复发送请求去加载了

4、加载脚本的时候,渲染内容堵塞了

- 常见的几种SPA首屏优化方式

1、减小入口文件积

2、静态资源本地缓存

3、UI框架按需加载

4、图片资源的压缩

5、组件重复打包

6、开启GZip压缩

7、使用SSR

10.说说你对spa单页面的理解

- spa仅在web页面初始化的时候加载html、js、css

- 页面一旦加载完成就不会因为用户的操作而进行页面的重新加载和渲染

- 页面的变化是利用路由机制实现html内容的变换,避免页面的重新加载

11.为什么vue采用异步渲染

- vue是组件级更新,当前组件里的数据变了,它就会去更新这个组件。

当数据更改一次组件就要重新渲染一次,性能不高,为了防止数据一更新就更新组件,所以做了个异步更新渲染。

-(核心的方法就是nextTick)

12.第一次页面加载会触发哪几个钩子?

- 第一次页面加载时会触发 beforeCreate, created, beforeMount, mounted 这几个钩子

13.Vue的父子组件生命周期钩子函数执行顺序

加载渲染过程
父 beforeCreate -> 父 created -> 父 beforeMount -> 子 beforeCreate -> 子 created
-> 子 beforeMount -> 子 mounted -> 父 mounted
子组件更新过程
父 beforeUpdate -> 子 beforeUpdate -> 子 updated -> 父 updated
父组件更新过程
父 beforeUpdate -> 父 updated
销毁过程 父 beforeDestroy -> 子 beforeDestroy -> 子 destroyed -> 父 destroyed
总结父组件先开始 子组件先结束
 

14.vue-router 动态路由是什么?有什么问题。

我们经常需要把某种模式匹配到的所有路由,全都映射到同个组件。例如,我们有一个
User 组件,对于所有 ID 各不相同的用户,都要使用这个组件来渲染。那么,我们可以在 vue-router 的路由路径中使用 “ 动态路径参数 ” ( dynamic segment )来达到这个效果:
 

 const User = {
   template: "User", 
 };
 const router = new VueRouter({
   routes: [
      // 动态路径参数 以冒号开头
      { path: "/user/:id", component: User },
   ],

问题 : vue-router 组件复用导致路由参数失效怎么办?

解决方案 :

1 、通 过 watch 监听 路由参数再发请求

 watch:{
   "router":function(){
      this.getData(this.$router.params.xxx)
    }
  }

2 、用 :key 来阻止复用

router-view   :key="$route.fullPath"

15.Vuex 页面刷新数据丢失怎么解决?

需要做 vuex 数据持久化 ,一般使用本地储存的方案来保存数据,

16.路由传参

-使用router-link时
    query传参:<router-link :to="/xxx/xxx?id=xx&name=xxx"></router-link>
    <router-link :to="{
        path:'/xxx/xx',
        query:{
            id:xxx,
            name:xxx
        }
    }">跳转</router-link>
    使用this.$route.query.id获取
    params传参
    <router-link :to="/xxx/xxx/001/sddf"></router-link>
    <router-link :to="{
        name:'asd',
        params:{
            id:xxx,
            name:xxx
        }
    }"></router-link>
    -router.js
    {
        name:'asd',
        path:'xxxx/:id/:name',
        component:Detail
    }
    接收参数this.$route.params.id
-使用params传参时,若是对象写法,需要在router.js中配置响应的name属性,并且需要占位。
-使用编程式路由导航
    this.$router.push({
        name:'xxx',
        params:{
            id:xxx,
            title:xxx
        }
    })

17.路由守卫

对路由进行权限控制
router.beforeEach:全局前置路由守卫,to:目标路由,from:来源路由,next():放行;自定义参数需要配置在路由元信息(meta)里配置,用来控制权限。
router.afterEach():全局后置路由守卫,可用于动态更改页面标题。
beforeEnter():单个路由配置,路由独享守卫,对某一个路由进行权限设置。
beforeRouteEnter():组件内置守卫,通过路由规则,进入组件之前调用。
beforeRouteLeave():组件内置守卫,通过路由规则,离开组件之前调用。

18.vue3的优点

-性能提升
    打包大小减少41%
    初次渲染快55%,更新渲染快133%
    内存减少54%
-源码升级
    使用proxy代替defineproperty实现响应式
    重写虚拟dom的实现和剔除多余代码(tree-shaking)
-vue3可以更好的支持typescript
-新特性
    composition API(组合api)
        setup配置
        ref与reactive
    新的内置组件
        fragment
        teleport
    新的生命周期钩子
    移除keycode支持作为v-on的修饰符
    data始终是一个函数

19.watchEffect函数和computed的区别

  1. -computed:是计算函数,注重计算出来的值,所以必须写返回值

  2. -watchEffect:是监视函数,注重过程,不用写返回值

20.【几乎必问】Vue中key值作用

1.vue在渲染的时候,会 先把 新DOM 与 旧DOM 进行对比, 如果dom结构一致,则vue会复用旧的dom。 (此时可能造成数据渲染异常)

2.使用key可以给dom添加一个 唯一标识符,让vue强制更新dom

[vue中key值作用逐字稿]

       面试官你好,我是这么理解key值的,key值的主要作用是给元素添加一个唯一标识符,用于提高vue渲染性能,当data发生变化的时候,vue会使用diff算法来对比新旧虚拟DOM.如果key值相同,才会考虑复用元素.如果key值不同,则会强制更新元素.一般通过给元素key设置为id,来保证vue更新数据的时候可以最大限度复用相同的key值的元素.
 

v-for 循环为什么一定要绑定key ?

给每个dom元素加上key作为唯一标识 ,diff算法可以正确的识别这个节点,使页面渲染更加迅速!


21.数组常用的方法?哪些方法会改变原数组,哪些不会

会改变原数组:

pop (删除数组的最后一个元素并返回删除的元素)

push(向数组的末尾添加一个或更多元素,并返回新的长度)

shift(删除并返回数组的第一个元素)

unshift(向数组的开头添加一个或更多元素,并返回新的长度)

reverse(反转数组的元素顺序)

sort(对数组的元素进行排序)

splice(用于插入、删除或替换数组的元素)

不会改变原数组:

concat---连接两个或更多的数组,并返回结果。

every---检测数组元素的每个元素是否都符合条件。

some---检测数组元素中是否有元素符合指定条件。

filter---检测数组元素,并返回符合条件所有元素的数组。

indexOf---搜索数组中的元素,并返回它所在的位置。

join---把数组的所有元素放入一个字符串。

toString---把数组转换为字符串,并返回结果。

lastIndexOf---返回一个指定的字符串值最后出现的位置,在一个字符串中的指定位置从后向前搜索。

map---通过指定函数处理数组的每个元素,并返回处理后的数组。

slice---选取数组的的一部分,并返回一个新数组。

valueOf---返回数组对象的原始值
 

22.什么是原型链?

每一个实例对象上有一个proto属性,指向的构造函数的原型对象,构造函数的原型对象也是一个对象,也有proto属性,这样一层一层往上找的过程就形成了原型链。

23.什么是闭包?闭包有哪些优缺点?

  •  概念:函数嵌套函数,内部变量能访问外部变量,这个变量称为自由变量
  •  解决的问题:保存变量
  •  带来的问题:会造成内存泄漏问题
  •  闭包的应用:防抖节流

24.es6有哪些新特性?

  • 模板字符串
  • 箭头函数
  • for-of(用来遍历数据—例如数组中的值。)
  • ES6 将 Promise 对象纳入规范,提供了原生的 Promise 对象。
  • 增加了 let 和 const 命令,用来声明变量
  • 还有就是引入 module 模块的概念

25.常见的盒子垂直居中的方法有哪些请举例3种?

利用子绝父相定位方式来实现

    <style>
        .container{
            width: 300px;
            height: 300px;
            position: relative;
        }
        .conter{
            width: 100px;
            height: 100px;
            position: absolute;
            top: 50%;
            left: 50%;
            margin-top: -50px;
            margin-left: -50px;
        }
    </style>

利用Css3的transform,可以轻松的在未知元素的高宽的情况下实现元素的垂直居中。

   <style>
        .container{
            position: relative;
        }
        .conter{
            position: absolute;
            top: 50%;
            left: 50%;
            transform: translate(-50%,-50%);
        }
    </style>

flex

   <style>
        .container{
         display: flex;
         justify-content: center;
         align-items: center;
        }
        .conter{
            
        }
    </style>

26.js数据类型有哪些,区别是什么

  • 基本类型:string,number,boolean,null,undefined,symbol,bigInt
  • 引用类型: object,array
  • 基本类型存储在中,空间小,操作频繁
  • 引用数据类型存放在中,它的地址在栈中,一般我们访问就是它的地址

27.什么是同源策略

所谓同源策略就是浏览器的一种安全机制,来限制不同源的网站不能通信(域名、协议、端口号相同)

28.promise是什么,有什么作用

  • promise 是一个对象, 可以从改变对象获取异步操作信息
  • 他可以解决回调地狱的问题,也就是异步深层嵌套问题

29.let和const 的区别是什么

  • let 命令不存在变量提升,如果在 let 前使用,会导致报错
  • 如果块区中存在 let 和 const 命令,就会形成封闭作用域
  • 不允许重复声明
  • const定义的是常量,不能修改,但是如果定义的是对象,可以修改对象内部的数据

30.== 和 ===的区别

  • ==是非严格意义上的相等
    • 值相等就相等
  • ===是严格意义上的相等,会比较两边的数据类型和值大小
    • 值和引用地址都相等才相等

31.什么是防抖和节流,js 如何处理防抖和节流

  • 首先 防抖就是触发下一个事件时停掉上一个事件

  • 节流是 触发当前事件需要在上一个事件结束以后

  • 通过设置节流阀(定时器)

32.跨域

跨域原因:浏览器出于安全考虑保护资源,同源策略。(协议、域名、端口号)
解决跨域:
jsonP 但只能使用get 原理-将请求的接口设置给script标签的src属性传递一个函数给后台实现跨域。后台响应的是一个函数调用
cors:最常用。
反向代理:本地前端发送到本地后端,不会跨域,(同源)本地后端接收请求后转发到其他服务器(服务器和服务器之间不会跨域)代理是需要路径中的特殊标志。
 

33.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/11693.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【产品应用】一体化步进伺服电机在高速异形插件机的应用

随着科技的不断发展&#xff0c;自动化生产设备在各个行业中得到了广泛的应用。高速异形插件机作为自动化生产设备中的一种&#xff0c;其核心部件之一就是一体化步进伺服电机。本文将详细介绍一体化步进伺服电机在高速异形插件机中的应用。 01.设备简介 高速异形插件机是一种…

用智能手机拍的模糊照片怎么办?学会这个技巧让它变得清晰

智能手机的相机功能越来越强大&#xff0c;但有时候我们还是会拍出一些模糊的照片。这可能是因为手抖或者光线不足等原因导致的。但不要担心&#xff0c;有一些简单的技巧可以帮助您将模糊的照片变得更加清晰。 1.稳定手机 拍摄清晰照片的第一步是确保相机保持稳定。拍照时最…

【CSS】课程网站 Banner 制作 ② ( Banner 栏版心盒子测量 | Banner 版心盒子模型左侧导航栏代码示例 )

文章目录一、Banner 栏版心盒子测量1、测量版心元素尺寸2、课程表测量二、Banner 版心盒子模型左侧导航栏代码示例1、HTML 标签结构2、CSS 样式3、展示效果一、Banner 栏版心盒子测量 1、测量版心元素尺寸 拉四条辅助线 , 将版心包起来 , 可以测量 Banner 条版心的尺寸为 1200 …

Cacti监控远程linux机器配置(被监控端)

一、被监控机安装snmp yum -y install snmp二、被监控机的配置 vi /etc/snmp/snmpd.conf做以下更改&#xff1a; 1、找到com2sec notConfigUser default public 改为&#xff1a;com2sec notConfigUser 192.168.1.1(改成监控服务器的ip) public 2、找到acce…

Pandas入门实践3 -数据可视化

人类大脑擅长于在数据的视觉表现中寻找模式;因此在这一节中&#xff0c;我们将学习如何使用pandas沿着Matplotlib和Seaborn库来可视化数据&#xff0c;以获得更多的特性。我们将创建各种可视化&#xff0c;帮助我们更好地理解数据。 使用pandas绘图 我们可以使用plot()方法创…

【linux】Ubuntu aarch64编译安装RXTX进行串口通信

目录1.下载RXTX2.源码下载方式一&#xff1a;方式二&#xff1a;3. 编译源码4.编译源码时遇到的问题问题1&#xff1a;./configure command not found问题2&#xff1a;error: UTS_RELEASE undeclared问题3&#xff1a;libtool: install: armv6l-unknown-linux-gnu/librxtxRS48…

【ZUUL2踩坑】题一:Ribbon集成动态properties存在的原生风险

目录 一、问题背景 二、问题分析 1、配置文件空档期的问题 一、问题背景 JAVA的Properties工具有两种写配置文件的方式&#xff0c;一种是覆盖&#xff0c;一种是追加。 但是动态配置文件一般需要进行创建或更新&#xff0c;不会选择追加内容&#xff0c;所以只能选择进行配…

docker目录映射

docker 常用命令 docker ps // 查看所有正在运行容器 docker stop containerId // containerId 是容器的ID docker ps -a // 查看所有容器 $ docker ps -a -q // 查看所有容器ID docker stop $(docker ps -a -q) // stop停止所有容器 docker rm $(docker ps -a -q) // remove删…

replugin宿主与插件通信小结

近来replugin开发中遇到宿主和插件间需要通信的情形&#xff0c;思来只有进程间通信(IPC)才是比较好的宿主与插件的通信方式。而Android进程间通信主要有2种方式&#xff1a;Messenger和AIDL。 AIDL&#xff08;Android Interface Definition Language&#xff09;是Android接…

ChatGPT团队中,3个清华学霸,1个北大学霸,共9位华人

众所周知&#xff0c;美国硅谷其实有着众多的华人&#xff0c;哪怕是芯片领域&#xff0c;华为也有着一席之地&#xff0c;比如AMD 的 CEO 苏姿丰、Nvidia 的 CEO 黄仁勋 都是华人。 还有更多的美国著名的科技企业中&#xff0c;都有着华人的身影&#xff0c;这些华人&#xff…

Java入坑之类的派生与继承

一、继承 1.1继承的概念 Java中的继承&#xff1a;子类就是享有父类的属性和方法&#xff0c;并且还存在一定的属性和方法的扩展。 Subclass&#xff0c;从另一个类派生出的类&#xff0c;称为子类(派生类&#xff0c;扩展类等) Superclass&#xff0c;派生子类的类&#xff…

3.5 函数的极值与最大值和最小值

学习目标&#xff1a; 我要学习函数的极值、最大值和最小值&#xff0c;我会采取以下几个步骤&#xff1a; 理解基本概念&#xff1a;首先&#xff0c;我会理解函数的极值、最大值和最小值的概念。例如&#xff0c;我会学习函数在特定区间内的最高点和最低点&#xff0c;并且理…

( “树” 之 DFS) 104. 二叉树的最大深度 ——【Leetcode每日一题】

104. 二叉树的最大深度 给定一个二叉树&#xff0c;找出其最大深度。 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。 说明: 叶子节点是指没有子节点的节点。 示例&#xff1a; 给定二叉树 [3,9,20,null,null,15,7]&#xff0c; 返回它的最大深度 3 。 思路&am…

激光和相机的标定

一、手动标定 代码工程&#xff1a;GitHub - Livox-SDK/livox_camera_lidar_calibration: Calibrate the extrinsic parameters between Livox LiDAR and camera 这是Livox提供的手动校准Livox雷达和相机之间外参的方法&#xff0c;并在Mid-40&#xff0c;Horizon和Tele-15上进…

ReactNative入门

React基本用法&#xff1a; react与js不同的点在于 react使用的是虚拟DOM js是真实DOM 作用&#xff1a;当有新的数据填充 可以复用之前的&#xff0c;而js需要整体重新渲染 创建虚拟DOM还可以使用jsx语法直接声明&#xff1a; 注意要用babel标签将jsx转化为js 但是建议采用j…

图解并用 C 语言实现非比较排序(计数排序、桶排序和基数排序)

目录 一、计数排序 二、桶排序 三、基数排序 一、计数排序 算法步骤&#xff1a; 找出待排序数组 arr 中的最小值和最大值&#xff08;分别用 min 和 max 表示&#xff09;。 创建一个长度为 max - min 1、元素初始值全为 0 的计数器数组 count。 扫描一遍原始数组&…

2023 年嵌入式世界的3 大趋势分析

目录 大家好&#xff0c;本文讲解了嵌入式发展的3个大趋势&#xff0c;分享给大家。 趋势#1 – Visual Studio Code Integration 趋势#2 –支持“现代”软件流程 趋势 #3 – 在设计中利用 AI 和 ML 结论 大家好&#xff0c;本文讲解了嵌入式发展的3个大趋势&#xff0c;分享…

Python圈的普罗米修斯——一套近乎完善的监控系统

文章目录前言一、怎么采集监控数据&#xff1f;二、采集的数据结构与指标类型2.1 数据结构2.2 指标类型2.3 实例概念2.4.数据可视化2.5.应用前景总结前言 普罗米修斯(Prometheus)是一个SoundCloud公司开源的监控系统。当年&#xff0c;由于SoundCloud公司生产了太多的服务&…

网络安全实战之植入后门程序

在 VMware 上建立两个虚拟机&#xff1a;win7 和 kali。 Kali&#xff1a;它是 Linux 发行版的操作系统&#xff0c;它拥有超过 300 个渗透测试工具&#xff0c;就不用自己再去找安装包&#xff0c;去安装到我们自己的电脑上了&#xff0c;毕竟自己从网上找到&#xff0c;也不…

如何把数据库中的数据显示到页面

主要内容&#xff1a;使用JDBC访问数据库中数据&#xff08;Java Web数据可视化案例&#xff09; 文章目录前期准备&#xff1a;案例&#xff1a;第一步&#xff1a;创建数据库及数据第二步&#xff1a;编写实体类第三步&#xff1a;编写Dao类第四步&#xff1a;编写Servlet代码…