1. vue最大的优势是什么
- 渐进式框架,按需引入
- 双向数据绑定,用数据驱动视图
- 组件式开发
- 入门教程很多, 容易上手
2. v-show和v-if的区别
- 相同点, 都可以显示隐藏元素
- 不同点, 原理不同, v-show是通过display属性控制显示隐藏,而v-if是直接删除和创建DOM元素
- v-if还可以配合v-else v-else-if 做多分支判断
- 频繁操作DOM会影响性能,所以需要频繁显示隐藏的时候 用v-show
3. 计算属性和函数的区别
- 计算属性会把第一次的结果存储到缓存中,只要涉及到的数据没有变化,多次使用只会在缓存中取
- 而函数每次使用都会重新执行一遍
- 所以计算属性的执行效率比函数高
4. key有什么用
- 可以提高性能,主要用在vue的虚拟DOM算法,更好的更新虚拟DOM
- 使用key会基于key的变化重新排列元素顺序
- 不使用key会尽可能的尝试就地复用相同类型元素
5. scoped作用
- 让组件内的style样式只对当前组件生效
- 原理是: 给组件内的标签加上自定义属性, data-v-hash值, 用属性选择器找标签
6. 什么是组件 有什么用
- 将重复使用的结构样式行为 封装成一个vue实例
- 作用:组件可以重复调用,方便开发和维护,每个组价都是各自独立的 互不影响
7. 父子组件如何通信
父向子:
- 通过属性绑定的方式传递数据, 子组件用props接收,接收后当做变量使用
- provide
- ref属性获取组件的实例,通过实例直接更新子组件的变量或调用方法来更新值
- 全局状态管理
子向父:
- 通过this.$emit(自定义父组件事件,传的值),然后在父组件中 子组件的标签上使用这个事件,接收子组件向组件传递的值
- inject
- 作用域插槽 slot标签
- 全局状态管理
- attrs可以接收props没有接收的 父组件属性绑定的值
8. 组件的生命周期
- 分为4个阶段 8个函数
- 初始化阶段: beforeCreate created , beforeCreate很少用, created 可以获取data里面的变量 和 methods里面的函数
- 挂载阶段: befroreMount mounted , 在它们中间会做一件事 创建虚拟DOM替换成真实的DOM, 所以在mounted函数中可以获取到真实DOM的信息
- 更新阶段: beforeUpdate updated, 在数据发生改变时触发, DOM更新是异步的, 先更新虚拟DOM,再更新真实DOM
- 销毁阶段: beforeDestroy destroyed, destroyed是组件的最后一个阶段, 可以用来清除定时器
9. 作用域插槽
- 简单的说就是子组件向父组件传值,具体方式↓
- 子组件slot标签通过属性绑定的方式将子组件的数据传到父组件,
- 父组件创建template标签, 用v-slot设置个自定义变量,变量点子组件的slot自定义属性,就可以获取到子组件传递给父组件的值
10. vuex的5个核心模块
- state: 定义存储状态数据
- mutation: 更新状态数据的同步函数
- action: 执行异步的操作, 如果要更新状态数据,不能直接更新, 需要通过mutation里的函数更新
- getter: 计算属性
- module: 模块化,让不同模块能够使用独属于自己的状态数据
11. 父子组件生命周期执行顺序
规律: 父组件开头,子组件执行完,最后父组件收尾
- 挂载阶段:父beforeCreate -> 父Created -> 父beforeMount -> 子beforeCreate -> 子created -> beforeMount -> 子mounted -> 父mounted
- 更新阶段:父beforeUpdate -> 子beforeUpdate -> 子updated -> 父updated
- 销毁阶段:父beforeDestroy -> 子beforeDestroy - 子destroyed -> 父destroyed
12. hash路由和history路由有什么区别, 以及原理
- 表现形式不同: hash路由会让地址栏显示一个#
- 特点: history需要后端配合做映射
- 原理: hash路由是通过监听 hashChange 事件来实现的, history路由是通过 pushState方法 和 监听 popstate事件实现的
13. 说说你对BFC的理解
- 叫块级格式化上下文
- 是一个独立的布局环境, 内部元素的布局不会影响到外部, 同时也不会被外部影响
14. js延迟加载的方式
- 给js文件添加async属性
- js文件放到文档的底部
- 文档加载完成后 动态添加script标签 引入js脚本
15. 如何减少重绘和回流
- 减少DOM操作
- 元素脱离文档流
- 避免对css进行单个修改
16.你知道和 Vue 相关的性能优化有哪些?
- 路由懒加载
- 图片懒加载
- 组件缓存
- 大体积文件用CDN服务
- v-for和v-if避免一起使用
- 大数据长列表滚动加载
17. v-model和.sync的区别
- v-model 是通过绑定value属性来获取数据, 通过绑定input事件来修改数据
- .sync 是通过绑定 自定义属性.sync 来获取数据 , 通过绑定update:自定义属性来 修改数据
18. vue2中如何自定义指令
- 在main.js中,通过Vue.directive进行全局注册
- 在Vue实例的选项对象中 使用directives选项进行局部注册
19. http1和http2的区别
- 多路复用: http1同时只能发送一个请求,请求一个发送一个TCP请求, http2可以同时处理多个请求,单一长链接,只创建一个TCP链接,同时发送多个请求和响应,不需要按顺序, 避免阻塞
- 二级制传输: http1明文传输,http2将传输的信息分割成一个个二进制帧
- 报头压缩: http2客户端和服务器维护同一张表,传输报头索引即可
- 服务端主动推送: http2主动推送该请求后续可能用到的资源
20. 什么是虚拟DOM
本质上是一个js对象,用来模拟真实的DOM结构, 因为它不是真实的DOM,所以称之为虚拟DOM
21. ES6有什么新特性
- let const
- 解构赋值
- 展开运算符
- 箭头函数
- 模板字符串
- 新增bind /baɪnd/ 方法
- Object.keys() Object.values()
- 可选链 ?.
- promise对象 async await
- Set集合 Map字典
- Proxy
22. 检测数据类型有哪些方式
- typeof 只能检测基本数据类型
- instanceof 检测右边的构造函数是否在左边实例对象的原型链当中,返回bool值
- Object.prototype.tostring.call() 是最好用的,任何类型都能检测,返回固定格式的类型字符串
23. 开发项目优化了哪些东西
前端的优化:
- 路由懒加载,优化了首屏加载速度
- 大体积图片用CDN服务,把文件都上传到腾讯云对象存储,公司服务器只存储文件地址
- 给高频率使用且变化不大的组件设置keep-alive,配合路由可以缓存指定的页面
后端的优化:大量数据批量导入的效率!
- 接手公司一个老项目,数据表中已经有100万条数据,页面功能需要用excel批量导入5万条, 并且还要检测去重。
- 在没有做任何优化的情况下 需要近3小时, 尝试给where条件后面的字段建立索引后,效率大增, 只需要不到10分钟。
- 过了段时间对这个速度还是不满意,又找到SqlBulkCopy工具类,利用它先将数据放到内存中, 然后链接数据库映射好对应字段,一次性导入进去,效率提高一大截,只需要5秒左右。
- 但是这个写法没有检测去重,然后又查资料找到sql server 的merge方法,合并两个表并去重, 先创建个临时表存储导入的数据,再用merge合并两个表,最后删临时表, 此时性能优化到了最佳,并兼顾了去重。
24. 开发中遇到的哪些难点
一个录入表单页面,动态新增多个组件。 勾选框+输入框+图片上传 三个组件在一起, 点下按钮新增同样的三个组件。 想了很久才想到要用对象数组来做,用这个数据遍历生成组件。 这三个组件一起视为一个对象, 每个组件对应对象里的属性值, 只需要新增一个对象就能做到新增同样的三个组件
25. 对uni-app了解吗
- 了解一些,它可以一次开发,多个平台发布
- 大概原理是uni-app有相当于loader的效果,将uni-app代码转化成对应平台的代码
26. vue2的响应式原理
- 使用Object.defineProperty() 它有两个钩子函数 get和set 通过get监听读取数据,通过set监听修改数据
27. vue3有哪些优点
- 性能更高:双向绑定的原理改成了proxy; 虚拟DOM的算法得到优化
- 体积更小:删除了不常用的Api,比如过滤器、.native、EventBus; 代码支持按需引入
- 对TS支持更好:因为源码使用TS重写的
- Composition Api: 组合Api 能够更好的封装复用代码,有利于大型项目开发维护
- 新特性:虚拟根节点Fragment、传送Teleport、
28.有哪些数组Api会更改原数组的值
push / pop / shift / unshift / reverse / sort / splice
29. vue3的v-model原理
- 通过:modelValue获取数据,通过@update:modelValue更新数据
- 结和vue2 v-model和.sync特点,可以同时写多个v-model,通过:属性名来区分 。 v-model:userName
30. Interface和type的区别(TS语法)
相同点:
- 都可以类型注解和继承
不同点:
- Interface只能针对对象和函数,type可以针对任何类型
- Interface相同属性继承后覆盖 ,type相同属性继承会报错
- Interface用得最多的是描述对象,type一般用于描述类型之间的关系, 比如联合类型
31. 函数重载
- 由函数签名和函数定义组成
- 函数签名 有对参数和返回值的类型注解, 没有函数体
- 函数实现 参数和返回值包含函数签名的, 有函数体