自React 16.8支持hook以来,RN也在0.59版本支持了hook,而且官方给出的组件实例也分为了class和hook两个版本,可以遇见hook是未来的趋势。恰巧最近重构RN项目,把最近遇到的问题和思考记录一下。
[[423277]]
自React 16.8支持hook以来,RN也在0.59版本支持了hook,而且官方给出的组件实例也分为了class和hook两个版本,可以遇见hook是未来的趋势。恰巧最近重构RN项目,把最近遇到的问题和思考记录一下。
今天是总结课。
重构
重构,我想这个词可能没有多少人愿意做,在业务迭代频繁的今天,重构意味着资源的消耗,而且承担着未知的风险,那么为什么还要重构?
主要有以下思考:
- 代码沉郁,不敢删除旧代码,旧有的代码逻辑不熟,关联关系不清,随着业务的迭代,代码越来越多。
- 模块化不清晰,文件混乱。
- 规范不统一,注释不明确,代码杂乱。文件查找困难。
- 工程化不完善,请求不统一,如遇到接口参数变更,需要修改多处。
- 组件化不完善,公共组件不统一。
hook化
hook化一个很重要的就是class逻辑的复用,比如:
- // class
- this.setState({
- count:0
- },()=>{
- // 修改数据成功之后 处理的逻辑
- })
-
- // hook
- useEffect(()=>{
- // 监控count值的变更 处理逻辑
- },[count])
如果我们需要监控的值很多,是否需要写很多useEffect呢?这里会用到另一个概念,细粒度组件。写hook写多了,会把一些需要处理的业务组件都抽离出来,每个组件只管自己的状态。这样就会极大减少了父组件的业务堆积和state堆积。
组件多了就会涉及到组件传值,这里有三种场景:
- context包裹子组件
- memo + context + reducer 组件传值
- ref + useImperativeHandle + forwardRef 暴露状态给父组件
- props 组件传值
props传值,通过标签属性传递。
- // props 通过标签传值
- <CenterMenu style={style} list={list} />
-
- //
- export default CenterMenu(props){
- const { style, list } = props;
- //. ...
- }
context包裹的话,就会把所有状态都放在了父组件,就会造成context很臃肿。
- <PerfectInfoContext.Provider
- value={{
- serviceBill,
- patientInfo,
- batchList,
- navigation,
- ...params
- }}>
- // ...View
- <Footer />
- </PerfectInfoContext.Provider>
-
- //
- const Footer = () => {
- const data = useContext(PerfectInfoContext);
- // ...
- }
- export default Footer;