You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
This repository has been archived by the owner on Aug 7, 2024. It is now read-only.
在 深入react 技术栈 一书中,提到了基于 Decorator 的 HOC。而不是直接通过父组件来逐层传递 props,因为当业务逻辑越来越复杂的时候,props 的传递和维护也将变得困难且冗余。
书里对基于 Decorator 的 HOC 没有给出完整的实现,在这里实现并记录一下实现的思路。
整个实现的代码放到了 我的Github 上,是用来获取豆瓣的电影列表的,
npm start
即可。整体思路
书里描述的整体思路,先将整个组件,按照 view 抽象为互不重叠的最小的原子组件,使组件间组合更自由。在这里最小的组件就是
SearchInput
、SelectInput
、List
。原子组件一定是纯粹的、木偶式的组件,如果他们自身带有复杂的交互/业务逻辑,那么在组合起来以后可想需要修改多少个原子组件,也就失去了相对配置式的优势。组件实现
原子组件
这是对原书代码稍加修改的 SearchInput 原子组件,因为没加 Icon,所以改了一下(逃),整体思路不变。原子组件没什么可说的,木偶组件就是接收 props 来实现功能,是对 view 的抽象。
需要一提的是
displayName
,是用来确定组件的『身份』的,会被包裹它的组合组件用到,后面会提到组合组件。Decorator组件
先放代码
Decorator 的作用就是将业务/交互逻辑抽象出来进行了处理,view 还是交由原子组件来实现,可以看到最后的
render
渲染的还是wrappedComponent
,只不过是在经过 Decorator 之后多了几个 props,这些 props 的中有钩子函数,有要传递给原子组件的参数。这样,视图逻辑就由原子组件组成,交互/业务逻辑由 Decorator 来抽象。
组合组件
先上代码。
组合组件的 children 为根据不同业务需要包裹起来的原子组件,组合组件的逻辑处理功能来自于 Decorator,各种 Decorator 的钩子函数或者参数作为 props 传递给了 Selector,Selector 再用它们去完成原子组件之间的交互。组合组件通过之前提到的
displayName
为不同的原子组件分配 props 并根据业务需要进行组件间逻辑交互的调整。当我们业务逻辑变得复杂的时候,不要去增加 Decorator 的复杂度,而是去拼接多个 Decorator 再通过组合组件去处理具体的业务逻辑,这样能保证 Decorator 的可复用性。
业务组件
通过
compose
赋予组合组件不同的逻辑处理功能,然后根据业务需要让compose
后的组合组件包含原子组件,最后给从最外层传递参数就完成了。tips
在实际的场景中也不能滥用 HOC,基于 Decorator 的 HOC 一般是用来处理偏数据逻辑的部分,而 DOM 相关的东西就直接简单粗暴的用父组件就好了。
参考资料
The text was updated successfully, but these errors were encountered: