常见问题及回答

97 阅读8分钟

html

行内元素和块级元素有哪些?行内元素怎么转成块级元素?

块级元素:div ul ol li h1 h2 h3 h4…p

行内元素:a b span img input select strong

行内元素转块级元素:diaplay:block | inline-block

css

css水平垂直居中

常用的方法:

子元素宽高已知

1.absolute top 50% left 50% margin-top 子元素高的一半 margin-left 子元素宽的一半

2.absolute top calc(50% - 子元素高的一半) left calc(50% - 子元素宽的一半)

3.absolute top、bottom、left、right均为0 margin:auto

子元素宽高未知

4.flex justify-content: center align-items: center

5.absolute top 50% left 50% transform: translate(-50%, -50%);

6.行内元素 text-align:center;line-height = height

隐藏元素的方法

1.opacity:0

2.display:none

3.visibility:hidden

4.transform: translateX 或者 translateY 足够大的值

5.transform: scale(0,0)

6.position:relative 或 absolute 或者fixed z-index足够小

7.overflow:hidden;

跨端开发h5和pc兼容怎么做

viewport和innerHeight

viewport:视口

vh:浏览器一屏的高度 innerHeight:页面内部高度,包括横向滚动条

如何减少重绘回流

前置信息:

浏览器的渲染过程:

1.解析HTML,生成DOM树,解析CSS,生成CSSOM树

2.将DOM树和CSSOM树结合,生成渲染树(Render Tree)

3.Layout(回流):根据生成的渲染树,进行回流(Layout),得到节点的几何信息(位置,大小)

4.Painting(重绘):根据渲染树以及回流得到的几何信息,得到节点的绝对像素

5.Display:将像素发送给GPU,展示在页面上

重绘:repainting

回流:relayout

js

数据类型

7个基本数据类型:undefined、null、number、string、boolean、symbol、bigint

1个复杂数据类型:object

原型、原型链

深拷贝浅拷贝

基本数据类型存储在栈中,拷贝的时候拷贝的是数据本身

复杂数据类型存储在堆中,地址存在栈中,所以有深拷贝和浅拷贝的区别,深拷贝拷贝的是堆中的数据,完全复制一份,存储到新的地址中,修改拷贝后的数据对之前的数据没影响,浅拷贝拷贝的是栈中的地址,最终拷贝的数据和之前的数据指向的是同一个地址,共用堆中的数据,任意一方改变数据都会影响另一方。

闭包

防抖节流

防抖:多次连续操作,只执行最后一次(input监听输入并提交请求/监听用户1分钟内无输入提交请求)

节流:高频操作,只执行一次(scroll分页请求,resize)

如何阻止用户多次点击按钮发送请求

加开关,发请求钱打开开关,发请求后关闭开关,请求回来之后打开开关

promise

promise的出现是处理回调地狱的问题,多数情况下用于发送请求,方法有then、catch、all、race,then方法返回的还是一个promise,因此可以链式调用

除了promise.all还能用别的方法等待两个请求回来之后做一些操作吗?

1.请求嵌套

2.computed:依赖两个请求返回的数据

vue

mvvm

MVVM 是 Model-View-ViewModel 的缩写。

Model 代表数据,业务逻辑

View 代表页面展现

ViewModel 连接model和view,model改变驱动view改变,view改变驱动model改变,无需人为参与这个过程,使得开发者只关注业务逻辑,不需要关心操作dom,同步状态等问题。

vue的生命周期

beforeCreate、created、beforeMount、mounted、beforeDestroy、destroyed

created可以发请求吗?为什么?会有什么问题

可以,created的时候已经有data和methods了,可以直接调用方法,发送请求,但是注意不要操作dom,必须要操作dom的话就移动到mounted中或者加nexttick异步操作

data为什么是一个函数

根组件的data是一个对象,其他的组件中定义data是一个函数。 这是因为每个组件内部维护自己的data作用域,如果是一个对象,会互相产生影响,造成变量污染

v-if v-show

v-if用于变化频率不高的显隐状态控制,v-if从隐藏到显示要重新渲染dom

v-show用于变化频率高的显隐状态控制,v-show只是样式控制,不会重新渲染dom

如果为了FCP优化,就用v-if,因为不会渲染false的dom,可以节省时间

如果v-if用在子组件上,那么从隐藏到显示,子组件会经历什么,生命周期会经历哪些?

重新渲染子组件,经历的是完整的生命周期,从beforeCreate开始

v-if v-for为什么不能同时使用?优先级比较

vue2中v-if优先级高于v-for,如果同时使用,每次循环的时候都会判断一次v-if的条件,浪费时间和资源 vue3中v-for优先级高于v-if

v-for为什么用key

性能优化,vue底层在diff时如果有key,就使用key进行对比,这也是不推荐用index作为key的原因 不加key:就地更新 加key:唯一标识

vue diff原理

比较顺序:旧头新头、旧头新尾、旧尾新头、旧尾新尾、查找

vue响应式原理

vue2中用的是Object.defineProperty()

具体来说:数据劫持(Object.defineProperty)+发布订阅模式

Observer,Compile 和 Watcher:

Observer —— 监听 model 的数据变化,

Compile —— 解析编译模板

Watcher 连接 Observer 和 Compile ,达到通信的目的,数据变化驱动视图更新,视图变化驱动数据更新

vue3中用的是proxy和reflect

vue双向数据绑定

依赖的是vue的响应式原理,v-model、.sync都是双向数据绑定

组件通信方式

vue的数据流是单向的,子组件不能直接改变父组件中的变量值

1.props和emit(由于vue的数据是单向的,官方推荐这种方式进行显示改变数据)

2.ref和parent

3.provide和inject

4.eventbus

5.storage

6.vuex

vue为什么是异步更新的

数据是同步更新的,试图是异步更新的。

如果视图更新是同步的,短时间多次修改数据导致多次渲染,浪费资源

参考:v2.cn.vuejs.org/v2/guide/re…

vue官网解释: vue更新 DOM 时是异步执行的。只要侦听到数据变化,Vue 将开启一个队列,并缓冲在同一事件循环中发生的所有数据变更。如果同一个 watcher 被多次触发,只会被推入到队列中一次。这种在缓冲时去除重复数据对于避免不必要的计算和 DOM 操作是非常重要的。然后,在下一个的事件循环“tick”中,Vue 刷新队列并执行实际 (已去重的) 工作。Vue 在内部对异步队列尝试使用原生的 Promise.then、MutationObserver 和 setImmediate,如果执行环境不支持,则会采用 setTimeout(fn, 0) 代替。

vue2和vue3有哪方面的区别

生命周期、函数式编程、响应式原理

vue中的map文件

用于记录文件在运行时的报错信息,在上线时可以打包去掉map文件,但是保留map文件可以做前端监控

有没有封装过自定义指令,遇到的问题

vuex

基本概念

5个点:status、getters、mutation、action、modules

能改变status的只有mutation,action可以有异步操作,最后提交mutation来改变status

vuex刷新数据丢失,为什么会丢失,如何处理

vuex本身就不是持久化存储的方案,可以将vuex换成localStorage或者sessionStorage,cookie(少用),或者有vuex持久化存储插件,但是这些插件的原理也是本地化存储,同上三个方法

webpack

热更新原理,怎么通知到浏览器进行局部更新

参考 juejin.cn/post/684490…

Hot Module Replacement,简称HMR,是webpack内置的功能 过程如下:

1.启动webpack,生成compiler实例。编译文件,监听本地文件变化。

2.使用express框架启动本地server,让浏览器可以请求本地的静态资源

3.本地server启动之后,再去启动websocket服务,可以建立本地服务和浏览器的双向通信。浏览器就可以知道本地文件变化自动局部刷新页面

vite和webpack在打包和热更新的时候有什么区别

上线的时候所有的文件都会更新吗?第三方依赖会如何变化

其他

跨域

前端性能优化

代码层面: 防抖和节流、减少回流(重排)和重绘、减少 DOM 操作、按需加载、vif、vshow合理使用,vifvelse添加key、路由懒加载、图片懒加载、减少data中的数据直接用this.xx在全局中使用

构建方面:压缩代码文件、开启 gzip 压缩、使用CDN、tree shaking、sourceMap优化

其它:使用 http2、SSR、图片压缩、http 缓存、SSR、骨架屏、前端本地存储

前端存储

cookie、localstorage、session storage

SEO细说

SSR

对低代码的了解

组件封装,怎么修改elementui原本的样式,基于它怎么封装自己的组件