一.基础回顾
事件
bind this
关于event参数
event是SyntheticEvent,模拟出来DOM事件所有能力
event.nativeEvent是原生事件对象
所有的事件都被挂载document上
和DOM事件不一样,和Vue事件也不一样
传递自定义参数
表单
受控组件 类似于VUE 双向绑定 但不是
组件使用
- props传递数据
- props传递函数
- props类型检查
setState
不可变值***
可能是异步更新
- setState直接用累加器 setState是异步的
- 在在setTimeout里面setState却是同步的
- 在自定义DOM事件,setState是同步的
可能会被合并
- 对象会被合并
- 函数不会合并
组件生命周期
React高级特性
函数组件
- 纯函数,输入props,输出JSX
- 没有实例,没有生命周期,没有state
- 不能扩展其他方法
非受控组件
-
ref
-
defaultValue defaultChecked
-
手动操作DOM元素
-
比如:通过创建ref绑定 input元素 再通过事件拿到input元素的里面的值进行操作
使用场景 必须手动操作DOM元素,setState实现不了 文件上传<input type=file> 某些富文本编辑器,需要传入DOM元素 受控组件和非受控组件 优先使用受控组件,符合React设计原则 必须操作DOM时,再使用非受控组件
Portals
使用场景:
- overflow:hidden
- 父组件z-index值太小
- fixed需要放在body第一层级
异步组件
异步加载组件:
- import()
- React.lazy
- React.Suspense
性能优化
shouldComponentUpdate
React默认:父组件有更新,子组件无条件更新
性能优化对于React更加重要
SCU一定要每次都用吗?——需要的时候才优化
使用总结:
- SCU默认返回true,即React默认重新渲染所有子组件
- 必须配"不可变值"一起使用
- 可先不用SCU,有性能问题时再考虑使用
pureComponent(纯组件)和React.memo
- pureComponent,SCU中实现了浅比较
- memo,函数组件中的PureComponent
- 浅比较已经使用大部分情况(尽量不要做深度比较)
不可变值immutabel.js
- 彻底拥抱"不可变质"
- 基于共享数据(不是深拷贝)
- 有一定学习和迁移成本,按需使用
高阶组件(公共组件抽离)
高阶组件(HOC)是接受一个组件并返回一个新组件的函数,基本上这是一个模式是从 React 的组合特性中衍生出来的,称其为纯组件,因为它们可以接受任何动态提供的子组件,但不会修改或复制输入组件中的任何行为。
Render Props
HOC vs Render Props
- HOC:模式简单,但会增加组件层级
- Render Props:代码简洁,学习成本高
- 按需使用
二.Redux
基本概念
- store state
- action
- reducer 自我理解:创建store来存放状态 然后发布订阅 dispatch派发action 到reducer 然后里面进行判断
单项数据流
- 单项数据流概述
- dispatch(action)
- reducer->newState
- subscribe触发通知
react-redux
- Provider
- connect
- mapStateToprops mapDispatchToProps
异步action
- thunk
- promise
- saga
中间键
三.React原理
函数式编程
- 一种编程范式,概念比较多
- 纯函数
- 不可变值
vdom和diff
- h函数
- vdom数据结构
- patch函数
回顾:
- 只比较同一层级,不跨级比较
- tag不相同,则直接删除掉重建
- tag和key,两者都相同,则认为是相同节点,不再深度比较
jsx本质
- JSX等同于Vue模板
- Vue模板不是html
- JSX也不是JS
合成事件
所有事件挂载到document上
event不是原生的,是SyntheticEvent合成事件对象
和Vue事件不同,和DOM事件也不同
为何要合成事件机制?
- 1.更好的兼容性和跨平台
- 2.挂载到document,减少内存泄漏,避免频繁解绑
- 3.方便事件的统一管理(如事务机制)
setState batchUpdate:
setState是异步还是同步的?
看是否能命中batchUpdate机制
(哪些能命中 1.生命周期(和它调用的函数) 2.React中注册的事件(和它调用的函数) 3.React可以“管理”的入口 )
(不能命中:1.setTimeout setInterval等 2.自定义的DOM事件 3.React“管不到”的入口) 判断isBatchingUpdates
组件渲染和更新过程:
- props state
- render()解析JSX的结构生成vnode
- patch(elem,vnode)
性能优化解决方案fiber(涉及底层)
- 将reconciliation阶段进行任务拆分(commit无法拆分)
- DOM需要渲染时暂停,空闲时恢复
- window.requestIdleCallback
四.真题演练
组件之间如何通讯?
父子组件props
自定义事件
Redux和Context
JSX本质是什么?
createElement
执行返回vnode
Context是什么,如何应用?
父组件,向直下所有子孙组件传递信息
如一些简单的公共信息:主题色、语言等
复炸的公共信息,请用redux
shouldComponentUpdate用途?
性能优化
配合不可变值一起使用,否则会出错
redux单项数据流?
什么是纯函数?
返回一个新值、没有副作用(不会“偷偷”修改其他值)
重点:不可变值
React发起ajax应该再哪个生命周期?
componentDidMount
渲染列表,为何使用key?
diff算法中通过tag和key来判断,是否是sameNode
减少渲染次数,提高渲染性能
函数组件和class组件区别?
纯函数,输入props,输出JSX
没有实例,没有生命周期,没有state
不能扩展其他方法
什么是受控组件?
表单的值,受state控制
需要自行监听onChange,更新state
何时使用异步组件?
加载大组件
路由懒加载
多个组件有公共逻辑,如何抽离?
高阶组件
Render Props
redux如何进行异步请求?
使用异步action
redux-thunk
PureComponent有何区别?
实现了浅比较的shouldComponentUpdate
性能优化
但要结合不可变值使用
React事件和DOM事件的区别?
所有事件挂载到document上
event不是原生的,是SyntheticEvent合成事件对象
里面还有dispatchEvent机制
React性能优化?
渲染列表时加KEY
自定义事件、DOM事件及时销毁
合理使用异步组件
减少bind this的次数
合理使用SCU PureComponent和memo
合理使用Immutable.js
React和Vue的区别?
都支持组件化
都是数据驱动视图
都使用VDOM操作DOM
不同点:
React使用JSX拥抱JS, VUE使用模板拥抱html
React函数式编程, Vue声明式编程