vue 面试题
vue 3 的优点 或 不同
- 响应式方式不同,使用 Proxy 替代 Object.defineProperty
- 可以直接监听数组变化
- 使用 Proxy 直接监听对象,不用像 Object.defineProperty 每个对象遍历一遍
- 可以直接实现对象属性的新增或删除
- 新增 Composition Api, 代码逻辑更加清晰
- 生命周期变化,去除了 beforeCreate 和created,新增 setup 生命周期钩子
- 更好的支持 ts
vue 3 ref 和 reactive 的区别
ref:
1.ref 用于创建响应式数据,返回一个 ref 对象,通过 .value 访问和更改,一般用于创建响应式基本数据类型,例如:数字,字符串等。也可以处理复杂数据类型,转变为 reactive 对象
reactive:
- 参数必须是对象或数组
- reactive 返回的是一个响应式对象
vue-router 的作用
vue是单页面应用,通过 vue-ruoter 管理页面, vue-router 构建单页面应用,通过改变 url,在页面不跳转的情况下,更新页面视图,进行页面跳转,传递数据参数
vue-router 的两种模式区别
hash模式:
- hash 后面有 # 号
- hash 模式中修改的是 # 中的信息,不会向服务器发送请求
2.history模式:
- history模式 可以在 url 里面传递参数。还可以把数据放入特定对象中
- history模式 会向服务器发送请求,刷新时,会报错 404,需要后端做处理,匹配不到页面时,重定向
路由守卫
- 全局路由守卫 (包含三个参数:to,from,next) to: 要去的路由信息 from: 离开的路由信息 next:执行下一步
- beforeEach: 路由前置守卫
- beforeResolve
- afterEach:路由后置守卫 没有 next 执行函数
- 路由独享守卫
- beforeEnter:路由配置上面定义,只会在进入定义的路由才会触发
- 组件内守卫
- beforeRouteEnter: 只在访问组件时调用,访问不到 this ,组件实例还未创建
- beforeRouteUpdate:路由更新时触发,一个父路由下的字路由跳转时触发
- beforeRouteLeave:在离开该组件的路由时触发,可以访问组件实例
双向数据绑定原理
vue 采用数据劫持 和 发布订阅者 模式,通过 Object.definePropert来劫持各个属性的 setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调。数据驱动视图,数据发生变化时,触发视图更改
v-if 和 v-show 的区别
v-if
- v-if 是直接对 dom 元素进行操作
- v-if 是动态添加,如果返回 false ,不会对页面 dom 进行操作
v-show
- v-show 会渲染到 dom ,通过 dispaly 进行操作
- 频繁切换元素使用 v-show
vue 的优点
- 轻量化,大小只有几十 kb
- 双向数据绑定,数据驱动视图
- 组件化开发
- 虚拟 Dom,利用算法实现虚拟 Dom,减少性能损耗
循环时 Key 的作用
循环时需要 key 做一个唯一的标识,diff 算法识别此节点,在更新 Dom时,效率更高
computed 和 watch 的区别以及使用场景
computed
- computed 是计算属性,watch 是监听,监听 data 中的数据变化
- computed 支持缓存,当依赖的数据发生变化时,computed 会重新计算,不发生数据变化时,使用缓存中的值
- computed 不支持异步,watch 可以监听异步操作
- 如果一个属性由其他属性计算而来的,多对一 或者 一对一,一般使用 computed
watch
- watch 是监听 data 中的数据的回调,当依赖的 data 中的数据发生变化时,会执行回调
- watch 有属性 deep,支持深度监听
- immediate 组件加载后立即执行 watch 回调
- 会接受两个参数,newVal 和 oldVal,最新的值和之前的值
- 当一个属性发生变化时,执行操作,一对多
axios 的作用以及特点
- 支持 Promise Api。可以 使用promise 回调做一些 catch 后的操作
- 支持拦截请求和响应
- 支持取消请求
- 可以在 node.js 中发送 http 请求
生命周期
什么是生命周期?
vue 的生命周期就是 vue 实例从创建到销毁的过程
生命周期的作用?
生命周期可以使我们在 vue 从实例从创建到销毁做一些操作。类似回调函数,执行到某处,进行操作
vue 的生命周期有几个阶段
- beforeCreate 组件实例刚刚被创建 (el和data并未初始化)
- created:在组件实例创建后执行,可以对数据进行一些操作,一般用来进行数据请求
- beforeMount: 挂载阶段
- mounted:Dom 已经挂载完,可以对 dom 进行操作
- beforeUpdate:在 虚拟 dom 重新更新前渲染
- updated:在 虚拟 dom 重新更新后渲染
- beforeDestroy:组件实例销毁前执行,可以对事件清楚,比如定时器
- destroyed:发生在实例销毁之后,组件已被拆解,数据绑定被卸除,监听被移出,子实例也被销毁。
vue 组件首次加载会触发:beforeCreate、created、beforeMount、mounted
vue 中的 data 为什么是一个函数?
组件中的 data 写成一个函数形式,数据以函数形式返回,这样每次调用一次组件,就会返回一个新的 data,类似于给每个组件数据创建一个私有空间,这样各个组件维护各自的数据。以对象的形式返回,所有的组件共用一份 data,造成数据不好维护
keep-alive
用于缓存组件内部的实例,keep-alive 会缓存组件的实例,在切换组件时,会缓存组件的实例,减少重新创建组件实例的消耗,还可以保存组件的状态
两个属性,两个生命周期钩子
include:可以设置缓存组件
enclude:设置非缓存组件
activated:组件重新渲染时触发
deactivated:组件销毁时触发
Vuex
什么是 vuex?
项目总体的状态管理,组件状态数据共享,每个组件中可以获取,更改,操作存储在 vuex 中的数据,例如登陆状态(在未登陆状态下打开其他页面,需要获取登陆状态,跳转登陆页面)
vuex 的属性
- state:存放数据的地方,state 中的数据是响应式的,数据发生改变时,依赖数据的组件页面也会更新, 类似组件中的 data
- getters:计算属性,对 state 中存储的数据进行操作,类似 computed
- mutations:提交更改数据的方法
- actions:派发数据,更改异步方法
vuex 的好处?
- 使用多层嵌套的组件,使用 vueX 进行状态管理更好的维护,不用组件之间来回传值
- 对于大型项目,使用 vueX,数据更好的操作和维护
- 缓存数据,存储到 vuex 中,减少 Http 请求
vue 组件之间的通讯
- props: 使用 props 父组件向子组件进行传值
- $emit: 子组件 通过派发事件方式给 父组件 ,通过 父组件 更改数据
- parent 通过 parent 可以获取父组件中的数据和方法
- provide / inject 父组件使用 provide 注册数据,子组件使用 inject 接受数据,provide 中的数据并不是响应式的
- slot:通过插槽的方式进行数据传值
- EventBus:父子组件,跨组件都可使用
slot 插槽
什么是插槽
插槽类似于一个占位符,父组件中占位,在子组件中进行内容填充
插槽分为 默认插槽 剧名插槽 作用域插槽
默认插槽: 在父组件中使用 slot ,在子组件中直接写入 dom 内容 具名插槽:父组件中加上 slot 属性,子组件中使用 name 插槽名字。插入制定位置
js 面试题
es6 新增特性
- let 与 const
- let 声明的变量只在 let 命令所在的代码块内有效
- let 不能重复声明
- let 不存在变量提升,var 声明的变量会存在变量提升
- const 声明一个只读的常量,一旦声明,常量的值就不能改变
- 结构赋值
- 模版字符串