React 弹窗组件设计难题

2022-04-20

今天的工作也依旧在重构 SA 项目的组件,有一个特别犯难的地方来了。部分页面有大量的弹窗组件,而原先的代码上,这个弹窗组件的触发显示均是在表格组件里面进行的。

关于弹窗本身,我看过一些别人的方法,例如使用 ref 把弹窗组件内的状态放在父组件里管理,但这本质上也是让父组件管理弹窗状态,和上述问题无关。

// 我想象的预期效果
页面
 - 表格组件 (onShowModal 传给页面)
   - 触发按钮
 - 弹窗组件 (展示内容需要寄托在页面组件上,可能为空,组件内需要判断)

// 待重构项目的实现(如果组件拆分后,按函数作用域表示)
页面
 - 表格组件 (<Table /> 这种)
   - 行组件 (每列一个按钮,实际上是一个弹窗组件)
     - 弹窗组件 (展示内容直接从行里面传入,不会出现传参数据为空的情况)
       - 触发按钮 (在弹窗里面)

// 待重构项目的实现(实际实现,按函数作用域表示)
页面
 - 表格组件 (代码完全和弹窗处于一个层级,用 const 声明的函数,而不是写在 jsx 的组件)
 - 行组件 (同相同层级,函数返回,一行一个弹窗组件)
 - 弹窗组件 (展示内容直接从行里面传入,不会出现传参数据为空的情况)
   - 触发按钮 (在弹窗里面)

我想象的这种方式看起来是挺合理的,功能组件完全扁平化,逻辑清晰了不少,组件嵌套的情况减少了,但是有个问题,如果弹窗数据依赖现有表格内容,要怎么办?传入的 data 参数总会有空的情况,组件里面里面写判断逻辑又感觉很不优雅。

老代码现有实现的这种情况,会造成多个组件的内容充俗在了一个组件上,会产生“一个组件上千行代码”的盛状,后期可读性和可维护性特别低。而如果直接按照这种方式去拆分组件又有个弊端,一旦弹窗里面的内容保存后需要让页面重新请求一次数据该怎么办?总不能一层又一层的采用参数 onXXXX 往上传给页面组件吧。

晚上的话主要和测试同学会议,熟悉了一下我这个重构项目里面最复杂页面的业务逻辑,基本用途都明白了,最后搞到了差不多十点半(测试真卷,还不提加班),而且还没有完全讲完,明天继续。

都卷成这样子了,哪还有心思继续搞自家项目啊!不过昨天「保罗 API Next」的 Redis 问题还是凑合搞定了,明天晚上再直播写接口吧!

配乐 多云 疲惫
概览页 时间轴
奇趣音乐盒 技术源于 Kico Player
Emmm,这里是歌词君