1.react组件通信
父子 子父 兄弟 父后代 非关系
5种通信情况
前三种主要逻辑是state和setState传入, 都以父组件为基础修改
第四种context声明变量 createContext useContext
第五种 redux
都可以用redux
useMemo React.memo 优化性能
2.React.forwardRef(props, ref)
用于传递ref,可以在父元素控制子元素ref
a = useRef React.createRef元素对象
a.current获取
3.HOC高阶组件
函数调用,传递一个组件,返回一个新的组件,在高阶组件中做逻辑处理
按我理解等同于vue mixin,提高复用性,但是会带来一些隐藏的问题
4.setState异步更新,如需要同步更新,setTimeout, dom原生事件中
5.类组件中setState会触发子组件更新,函数组件不一定会触发,所以需要性能优化
6.虚拟dom减少页面重绘重排,首次渲染由于多了一层虚拟dom速度比正常稍微慢点
jsx会被babel转换为React.createElement形式
首字母小写为原生标签,首字母为大写会作为组件,编译成对象
追踪都会变成ReactDom.render
8.fiber算法面试如何解答
javaScript引擎和ui引擎两个线程是互斥的 react15渲染一气呵成无法中断,如果组件太大会导致阻塞页面渲染
链表结构将渲染拆分多个可中断任务,配合优先级调度和时间切片
child sibling
底层通过双缓冲技术避免页面闪烁,链表遍历替代递归,实现可中断的深度优先搜索
- Fiber 如何与浏览器渲染机制协同?
- 利用
requestAnimationFrame在浏览器重绘前提交更新,保证动画流畅。
- 利用
- Fiber 的优先级如何映射到浏览器事件?
- 高优先级任务(如用户输入)绑定
requestAnimationFrame,低优先级任务(渲染)绑定requestIdleCallback
- 高优先级任务(如用户输入)绑定
9.react list key的作用,diff算法
react引入virtrual dom概念,使用diff算法对比节点信息,传统事件复杂度O(n^3),react优化过后减少至O(n),速度差距明显
diff算法三个层级比较
tree、componen、element
tree:只会相同层级比较,只有删除、创建操作,没有移动操作
component:同一个类组件,会继续往下diff算法运算,不是直接删除新创建
element:同一层级节点比较,每个节点对应key,插入、移动、删除
注意事项:
对于简单列表渲染不一定加了key值性能就要好,比如说简单文本遍历展示
10.react hook
react 16.8引入的新特性,
1.可以让函数组件变成有状态的组件
2.类组件this的学习成本
11.react 生命周期
在类组件中 componentDidMount componentDidUpdate componentDidUpdate
react 16.8以后 hook
useEffect
12.react渲染效率,性能优化
类组件中,父组件setState,子组件一定会改变
加入shouldComponentUpdate pureComponent React.memo(高阶组件)
1.避免使用内联函数
onClick={(e) => {this.setState(e.xx)}} 不好
声明函数,绑定到onClick上
onClick={this.func}
2. react Fragments避免额外标记 <></>
3. 事件绑定方式
函数组件事件绑定方式
- 直接绑定(推荐)onClilk(func) 挂载时定义,后续渲染复用;
- 剪头函数包裹 (慎用 onClick={(e) => this.func(e, id)})可以传递额外参数
- ref 手动绑定 addEventListener
- 如果需要传递参数,可以使用useCallback优化函数;但是最佳方法是使用数据属性,e.currentTarget.dataset.id
- 避免render中箭头函数