Vue
-
组件之间的通信方式
| 常用(推荐) | 不常用 | |
|---|---|---|
| 父子组件 | $emit / props | attrs / ref |
| 兄弟组件 | vuex | $parent / eventbus |
| 跨层级 | vuex / provide + inject / event bus | |
-
v-for和v-if的加载顺序
| vue2 | v-for优先级高。每次先渲染出来dom再删除,会造成资源浪费 |
|---|---|
| vue3 | v-if优先级高。v-if时,变量还不存在,会报错 |
-
说一下生命周期
| vue2 | vue3 | 描述 |
|---|---|---|
| beforeCreate | beforeCreate | 组件实例被创建之初 |
| created | created | 组件实例被创建完成 |
| beforeMount | beforeMount | 组件实例被挂载之前 |
| mounted | mounted | 组件实例被挂载之后 |
| beforeUpdate | beforeUpdate | 组件实例更新之前 |
| updated | updated | 组件实例更新之后 |
| beforeDesdroy | beforeUnmount | 组件实例被销毁之前 |
| desdroyed | ummounted | 组件实例被销毁之后 |
| activated | activated | keep-alive组件被激活时 |
| deactivated | deactivated | keep-alive组件被停用时 |
| errorCaptured | errorCaptured | 捕获子孙组件的错误时 |
| - | renderTracked | 调试钩子,响应式依赖被收集时 |
| - | renderTrigered | 调试钩子,响应式依赖被触发时 |
| - | severPrefetch | ssr only,组件实例在服务器上被渲染前 |
-
setup和created谁先执行?
-
setup中没有beforeCreated和created钩子。因为setup的时候组件实例已经被创建了。vue会先执行setup的内容再执行optoins API
-
-
说一下对响应式的理解
- 概念:是指能够使数据变化,并能够对变化做出响应的机制
- 延伸:MVVM框架要解决的核心问题就是连接数据层和视图层,通过数据驱动,响应数据的变化和视图的更新
- Vue2是使用Object.defineProperty()实现的,该方法有一些天生的缺陷,不能监听数组方法,不能监听后新增的属性,需要对对象中的每个属性都进行监听。Vue3是使用Proxy实现,天生支持Vue2中的问题
-
vue如何做权限管理
-
概述:权限分为页面权限管理和按钮权限管理
-
方案:
- 前端方案通常会设置路由守卫,让用户先登录,获取到用户信息,前端再配置一个所有路由信息的数组,然后根据不同的角色来过滤出路由表,最后再添加动态路由
- 后端方案通常会把所有的路由信息存储到数据库中,等用户登陆以后,根据用户角色过滤出路由表返回给前端,前端再来动态添加路由
- 按钮权限的控制通常会实现一个指令,例如'v-permission',在其mounted钩子中判断当前用户角色是否需要展示按钮
-
比较:
- 纯前端的方案优点是简单,不需要做管理的页面,缺点是维护成本大,每次新增页面或者新增角色,都需要修改前端代码并重新打包部署。
- 后端方案需要做单独的权限管理页面,配置页面权限和按钮权限并存储到数据库中,维护起来方便
-
vue3的新特性
- Composition api
- Script setup
- Teleport
- Fragment
-
说一下nextTick
- 概述:nextTick是等待下一次DOM更新的方法
- 为什么需要:vue中有异步更新策略,如果数据变化,DOM不会立刻更新,而是开启一个队列,将组建更新函数保存在队列中,放到更新函数(flushSchedulerQueue)的后面,等到本次事件循环所有更新全部完成,再批量执行更新函数。
-
如何处理vue中的错误
- 错误通常分为接口请求错误和代码逻辑错误
- 接口请求错误:可以通过封装axios收集错误
- 代码逻辑错误:可以通过全局错误处理函数app.config.errorHandler收集错误
- 收集到错误之后我们可以统一做一些错误的处理,例如错误提示语等
-
长列表优化
- 尽量避免大数据量,可以采用分页来处理
- 使用vue-virtual-scroller来做虚拟滚动,只渲染视窗内的元素
- 使用v-memo尽可能重用数据,减少不必要的更新
-
vue实例挂载过程发生了什么
- 整体上是初始化和建立更新机制
- 初始化会创建组件实例,初始化组件状态,创建响应数据
- 建立更新机制这一步会执行一次组建更新函数,这会首次执行渲染函数,并执行patch函数将vnode转化为dom,同时首次执行渲染函数会将组件更新函数和响应数据建立依赖,使得以后的数据变化会触发组件的更新
-
为什么vue中data必须是个函数
主要是为了保证数据的私有性。因为组件会被用来创建多个实例,如果data是一个对象的话,那么所有的实例引用同一个对象,那么就会导致数据的混乱。如果是一个函数的话,每次创建一个实例都会返回一个全新的对象。
-
Vue-Router中有哪些钩子,作用是什么?
-
按照触发顺序
| 名称 | 触发时机 | 作用 |
|---|---|---|
| beforeRouterLeave | 在导航离开渲染该组件的路由时触发 | this可用,不支持回调,即没有next参数 |
| beforeEach | 全局守卫,在进入路由之前触发 | 身份权限验证 |
| beforeRouterUpdate | 1. 在当前路由改变,但是组件被复用时触发 |
-
对于一个带有动态参数的路径,如/user/:id,在user/1和user/2之间跳转
-
当渲染同样的组件userDetails时 | this可用,不支持回调,即没有next参数 | | beforeEnter | 在进入路由之前被触发(只有从不同的路由进入时) | | | beforeRouterEnter | 在渲染在组件的路有被验证前调用 | 组件实例还没创建,不能获取this | | beforeResolve | 在每次导航时都会触发 | 1. 确保在导航被确认之前,同时在所有组件内守卫和异步路由组件被解析之后,解析守卫就被正确调用。
-
获取数据或执行其他操作(如用户无法进入页面时你希望避免执行的操作)时调用 | | afterEach | 全局后置钩子,进入路由之后触发 | 1. 对于分析、更改页面标题、声明页面等辅助功能以及许多其他事情都很有用。
-
第三个参数failure,反应路由的一些错误 |
-
完整的解析流程
- 导航被触发。
- 在失活的组件里调用
beforeRouteLeave守卫。 - 调用全局的
beforeEach守卫。 - 在重用的组件里调用
beforeRouteUpdate守卫(2.2+)。 - 在路由配置里调用
beforeEnter。 - 解析异步路由组件。
- 在被激活的组件里调用
beforeRouteEnter。 - 调用全局的
beforeResolve守卫(2.5+)。 - 导航被确认。
- 调用全局的
afterEach钩子。 - 触发 DOM 更新。
- 调用
beforeRouteEnter守卫中传给next的回调函数,创建好的组件实例会作为回调函数的参数传入。
-
说一下keep-alive和actived
- keep-alive功能是在多个组件间来回切换时缓存组件实例
- 当一个组件实例从dom上移除,如果它使用了keep-alive缓存,那么组件不会被卸载,而是会失活。当组件被重新插入到dom中时,组件会被重新激活。
| actived | 1. 首次挂载
-
缓存被激活时 | | --------- | --------------------- | | deactived | 1. 从dom上移除
-
组件被卸载 |
-
说一下vue-router的hash和history
| history | hash | |
|---|---|---|
| 原理 | 利用window.history的pushState、popState API来实现url跳转而无须重载页面 | 利用window.onhashchange监听hash的变化,来控制页面显示哪一部分的DOM |
| 兼容性 | 依赖H5的history | 无 |
| 区别 | 1.路由是正常的显示方式 \n2.需要后端做配置,因为要向后端发起请求,请求页面数据。如果是前端处理的嵌套路由,后端取不到页面数据,会返回404,因此后端要匹配一下,如果路由无法识别,则返回index.html。 |
// nginx配置案例
server{
listen 80
server_name xxx.com
location /admin{
root /user/aaa/bbb/admin
index index.html
// 就是这句话,尝试获取页面数据,取不到返回index.html
try_files $url $url/ /admin/index.html
}
}
/** 服务器只会解析/admin这个路径,如果是/admin/xxx/...,
服务端不会解析,如果刷新页面,前端重新向服务端请求页面数据,
服务端无法处理,会返回404。因此服务端需要对这种情况进行处理,
重定向到index.html
*/
-
说一下vuex和redux的区别
-
相同点:
- 都是基于flux实现的,单向数据流
- 流程一致,定义全局state,触发,修改state
-
不同点:
- Redux中数据是不可变的,每次执行都会返回一个新的值;vuex中数据是突变的,每次执行都是给变量重新赋值
- Redux在检测数据变化时,是通过diff的方式比较差异的;vuex在检测数据变化时,是通过getter/setting来比较的
- vuex定义了state、getter、mutation、action四个对象;Redux定义了state、reducer、action
写在最后
往期文章