React 篇
1、组件通信方式
- 父传子:通过Props属性进行接收
- 子传父:父级传送一个函数,来修改父组件的数据
- 跨组件通信:通过使用context API,可以在组件内部向子孙级组件通信
context.js
1 | import { createContext } from 'react' |
父亲组件
1 | import{ Provider } from './context' |
子组件
1 | import { Consumer } from '../context' |
2、如何实现路由懒加载
React16新增lazy方法实现组件懒加载。
1 | import { Router } from "react-router-dom" |
3、生命周期有哪些
- constructor:初始化组件state等
- static getDerivedStateFromProps():用于将props的信息映射到state中
- render:生成虚拟DOM
- componentDidMount:通常在这里进行副作用的处理(更新阶段)
- static getDerivedStateFromProps()
- shouldComponentUpdate():判断是否进行组件更新
- render():生成虚拟DOM
- getSnapshotBeforeUpdate():完成diff,即将更新虚拟DOM,用户获取上一次DOM快照。PS:必须配合componentDidUpdate一起使用,返回值变成componentDidUpdate 第三个参数
- componentDidUpdate():组件更新完成,进行副作用处理
- componentWillUnmount:组件即将卸载,删除组件添加的全局数据或事件

4、Hooks注意的问题和原因?
4.1 注意事项
- 只能在函数组件使用
- 只能在外层调用,不能再if、for语句中
- useState是引用类型的数据,修改state时,要返回新的引用
4.2 原因
- hooks为函数组件逻辑复用而设计
- hooks调用是要确保调用顺序,顺序错误会导致整个程序的混乱
- useState更新时不更新引用地址,会导致React认为没有更新数据,则不进行组件更新。
5、setState是异步还是同步?
在React的方法中或者事件中是异步的。
在原生事件或异步程序中是同步的。
可以了解一下batchedUpdates
6、如何实现逻辑复用
- HOC(高阶组件)
一个函数接收一个组件,返回一个组件
Acmp本身不具有路由信息,通过withRouter加工使其获得路由信息
1 | function Acmp(props){ |
withRouter大致实现
1 | const withRouter = (Cmp) => { |
- render props
组件的一个属性,接收一个组件 - hooks
因为高阶组件返回的是一个集合的信息。hooks可以返回某个功能的信息。
1 | function Acmp(props){ |
Class 组件中函数调用的 this 问题
- 在构造函数中提前 bind this, 后续直接调用
- 在声明函数的时候, 使用箭头函数的方式
- 在每次传参调用的时候, 手动 bind this
React 事件
- react 的事件是属于合成事件, 模拟了原生事件的属性
- 在 17 之前, 绑定在 document 上面, 17 开始绑定在 root 组件上, 有利于多个版本的 react 存在, 如微前端
React 和 vue 的区别
- 都支持组件化
- 都是数据驱动
- 都使用 vdom
- react 偏向 jsx 使用, vue 偏模板
- react 是函数式, vue 是声明式
- react 把大部分性能优化交给自己, vue 内部做了大部分优化
Webpack
loader 从后往前的加载顺序
图片资源
dev 模式直接 file-loader 引用
prod 模式使用 url-loader
打包的文件带上 hash 值
需要分离 css 文件, extract css
压缩文件 terser optimizeCSS
分割代码, 抽离公共代码和大的第三方模块采用 cdn 加载