Open yaofly2012 opened 5 years ago
Render Props
也是解决横切关注点问题的一种编程方式,并且是作为HOC的替代品。
Render Props
是一种模式children
属性传递渲染函数(即Function as Child Component)。React官方推荐使用Render Props
代替HOC,好些库(如Formik)也在使用。
Render Props
作为HOC的替代品解决了HOC存在的缺点。
props
,而不是像HOC那样由高阶组件的开发转发props
;render props
,因为每次render
都是一个新函数这会带来性能问题。re-purposing children goes against one of the most basic things we’re taught in Computer Science; that is, “Choose meaningful names for your variables.”
“There are only two hard things in Computer Science: cache invalidation and naming things.”
– Popularly attributed to Phil Karlton
FaCC会导致函数命名不够语义化。
公共逻辑部分抽离成组件,特例组件的渲染逻辑(函数)通过props
(一般取名为render
)传给公共逻辑组件,由公共逻辑组件调用渲染函数属性渲染具体的UI。
HOC
和Render Props
对比HOC
和Render Props
都是为了解决Reactjs代码复用问题的编程模式。
使用HOC
时,都要针对每个特例组件定义一个新组件,这是一种静态组合(static compostition)。但有时特例组件的是无限个(即具体特例组件无法确定),此时使用Render Props
方式(动态组合, dynamic composiiton)更合适。
ReactDOM.render(
<Router>
<Route path="/home" render={() => <div>Home</div>} />
</Router>,
node
);
Use a Render Prop!做了总结:
Mixins | HOCs | Render Props | |
---|---|---|---|
ES6 class语法是否支持 | No | Yes | Yes |
直观性 | 不直观 | 不直观 | 直观 |
命名冲突问题 | Yes | Yes | No |
总结下来:建议使用Render Props 代替HOCs。
HOC
一、概述
是React的一种编程模式,解决横切关注点问题(复用代码逻辑)。
WrappedComponent
增加额外对功能,而这些额外的功能具有公用性(即需要复用对逻辑部分);WrappedComponent
增强后产生个新组件。二、使用
2.1 参数化的HOC
HOC只是个模式,可以有不同的写法,有种场景是通过一个配置参数控制HOC的行为,即参数化的HOC。
genHOC
函数根据返回个HOC,并且根据传入的option
参数来定制返回的HOC。2.2 习惯
EnhancedComponent
的属性都传给WrappedComponent
;withXXX
命名;WrappedConponent
和EnhancedComponent
行为类似;三、进阶
3.1 如何解决横切关注点问题
把公共逻辑写在父组件里(即高阶组件),利用组件组合构建新的组件。
3.2 缺点
增加组件的深度,存在命名冲突问题; 即传给
EnhancedComponent
组件的属性有些是HOC
处理的,有些则[再传给WrappedComponent
](Convention: Pass Unrelated Props Through to the Wrapped Component),难免两者存在同名的属性。静态组合 HOC是一种静态组合模式(即一般都需要提前定义好
EnhancedComponent
),并且不适合动态组合。 当然了如果能保证EnhancedComponent
只会被创建一次,HOC也可以实现动态组合。规范的HOC实现遵循的规则挺多的,比如:
跟
ref
的结合也不友好。3.3 注意:
render
方法中使用HOC;参考