Skip to main content

[小题目] 框架

Vue 中 computed 和 watch 区别​

computed 用于计算产生新数据

watch 用于监听现有数据

watch

Vuex 中 mutation actiion 区别​

mutation: 原子操作, 必须同步代码

action: 可包含多个 mutation; 可包含异步代码

Vue 各个生命周期​

beforeCreate​

创建一个空白的 Vue 实例

data method 尚未被初始化, 不可使用

created​

Vue 实例(或者说 Vue js 对象)初始化完成,完成响应式绑定

data method 初始化完成, 可以调用

尚未开始渲染模板

该生命周期可以做一些与页面, dom 无关的操作

beforeMount​

编译模板, 调用 render 生成 vdom

但是还没有开始渲染 DOM, 也就是说此时 vdom 还是 js 级别, 不是 dom 级别

Mounted​

完成 dom 渲染

组件创建完成

开始由创建阶段进入运行阶段

beforeUpdate​

data 发生变化之后

准备更新 dom (尚未更新)

updated​

data 发生变化, 且 dom 更新完成

不要在 updated 中修改 data, 可能会导致死循环

beforeUnmount​

组件进入销毁阶段(尚未销毁, 可正常使用) 可移除, 解绑一些全局事件, 定时器, 自定义事件等

unmounted​

组件个子组件被销毁了

keep-alive 组件​

onActivated 缓存组件被激活

onDeactivated 缓存组件被隐藏

Vue 什么时候操作 dom 比较合适​

mounted 和 updated 都不能保证子组件全部挂载完成

应使用$nextTick 渲染 DOM

nexttick

Vue3 Composition API 生命周期有何区别?​

  • 用 setup 代替了 beforeCreate 和 created
  • 使用 Hooks 函数的形式, 如 mounted 改为 onMounted()

Vue2 Vue3 React 三者 diff 算法有何区别?​

react 仅右移

vue 双端比较

vue3 最长递增子序列

Vue React 为何循环时必须使用 key?​

vdom diff 算法会根据 key 判断元素是否要删除

未匹配 key, 则删除重建 - 性能较差

匹配了 key, 则只移动元素 - 性能好

移动端 H5 click 有 300ms 延迟, 如何解决?​

背景: double tap to zoom

为了让双击功能实现

解决方案:

fastclick

原理:

click

进化:

shuxing 有这个属性手机就认为已经对网页做了响应式布局, 已经不需要 300 毫秒的延迟了

HTTP 无状态, 每次请求都要带 cookie, 以帮助识别身份

服务端也可以向客户端 set-cookie

默认有跨域限制: 不可跨域共享, 传递 cookie. 如果要跨域共享, 需要设置 withCredentials

现代浏览器开始禁止第三方 cookie, 和跨域限制不同. 这里是禁止网页引入的第三方 js 设置 cookie. 比如说做了个个人网站, 在上面挂了广告, 这个广告是通过第三方 js 引入的, 这个第三方 js 是可以设置 cookie 的. 这个 cookie 就可以记录下当前用户访问的一些信息, 比如说这个个人网站的文章是关于手机的, cookie 记录下这个用户有买手机的倾向 .那么为了打击第三方广告, 保护隐私. 不过这个禁止可以通过 SameSite: Strict / Lax / None;来选择禁止程度, None 就是不禁止

cookie 用于登录验证, 存储用户标识(如 userid)

session 在服务端, 存储用户详细信息, 和 cookie 信息一一对应

cookie + session 是常见登录验证解决方案

session

对 Vue 做过哪些优化​

  • v-if 和 v-show

  • v-for 用 key

  • 使用 computed 缓存

computed

  • keep-alive 缓存组件

  • 异步组件

使用 Vue 中遇到过哪些坑​

  • 内存泄露

    • 原因: 一些全局变量, 全局事件, 全局定时器, 自定义事件没有及时销毁
  • Vue2 响应式的缺陷 (Vue3 不再有)

    • 原因: data 新增属性用 Vue.set, data 删除属性用 Vue.delete. 无法直接修改数组 arr[index] = value
  • 路由切换时 scroll 到顶部

    • 原因: spa 通病, 不仅是 vue. 如, 列表页, 滚动到第二屏, 点击进入详情页. 再返回到列表页(此时组件重新渲染)就 scroll 到顶部

    • 解决: 在列表页缓存数据和 scrollTop 值

    • 终极解决方案: MPA + App WebView. 因为触发 new Webview , 相当于一个新页面放在第一个页面的上面

做过哪些 react 优化​

  • 使用 CSS 模拟 v-show

css

  • 循环使用 key

key

  • 使用 Fragment

  • JSX 中不定义函数

    • 原因: 因为 react 中的 jsx 会被频繁执行, state 更改一次, jsx 就被执行一次, 因为 jsx 本质是一个函数, 这个函数执行生成虚拟 dom 节点, 所以避免执行的时候就新建函数

jsx

  • 要在构造函数中 bind this

    • 原因: 跟上面一样, 总之避免在 jsx 中频繁新建函数

bind

  • 使用 SCU, 或者直接使用 PureComponent, 函数组件使用 React.memo

    • 原因: 使用 setState 的时候要使用不可变数据, 不能修改当前 state 的值. 所以要使用不影响原数据的方法比如 concat. 同时 react 默认会让所有的子组件都更新, 无论涉及的数据是否变化. 而实际上无需更新, 所以用 SCU 比较新老 props. 使用 immer 第三方库保证写法
  • Hooks 缓存数据和函数

    • 使用 useMemo, useCallback

usecall

  • setState 是异步更新的

setState

如何统一监听 Vue 组件报错​

方式一: window.onerror​

全局监听所有 JS 错误, 但它是 JS 级别的, 识别不了 Vue 组件信息, 捕捉一些 Vue 监听不到的错误

window

注意 try...catch... 捕获的 error, 无法被 window.onerror 监听到

方式二: errorCaptured 生命周期​

监听所有下级组件的错误

返回 false 会阻止向上传播

// App.js

errorCaptured: (err, vm, info) => {
console.info("errorCaptured---", err, vm, info);
return false;
};

方式三: errorHandler 配置​

Vue 全局错误监听, 所有组件错误都会汇总到这里, 但 errorCaptured 返回 false, 不会传播到这里

异步回调里的错误, errorHandler 监听不到, 需要使用 window.onerror

jianting

如何统一监听 React 组件报错​

ErrorBoundary 组件​

  • 监听所有下级组件报错, 可降级展示 UI

  • 只监听组件渲染时报错, 不监听DOM事件(Vue可以监听dom事件错误), 异步错误

  • 只在 production 环境生效, dev 会直接抛出错误

如果一个 H5 很慢, 如何排查性能问题​

前端性能指标​

Chrome devTools - Performance

  • First Paint(FP) 第一次渲染

  • First Contentful Paint(FCP) 第一次有内容渲染

  • LCP 第一次有意义的渲染

  • DCL

....