编辑:我认为React和Higher Order FRP概念的一个大挑战是,在React组件内处理状态会让用户接触到与HO FRP无关的语言概念。在我看来,这也是更广泛的ES6 JS问题。我不是这个主题的专家,但我想分享一下我的FRP之旅的思考和经验。
很多React组件的功能和组合都依赖于JS class
语法。对我来说,这是一个挑战,因为你混淆了术语和概念。对于很多前端开发人员(包括我自己),React是他们第一次接触FRP范例的经历。当你一直看着classes
和constructors
的OOP继承术语时,很难理解函数组合的重要性。我认为这就解释了为什么我们看到了React库的爆炸式增长,而没有看到底层的范例,因为有一整套相互对比的术语。它变成了更多的组件和基于DOM的视图,而不是FRP 阅读这篇简洁的文章。
React隐藏了许多基础概念,对于许多奉行FRP范例的程序员来说,他们不喜欢这种神奇感觉,这意味着新手很容易只使用“class”接口来创建他们的组件,并且不会接触到许多基础FRP范例。
在我看来,当处理状态时,React本质上应该是只读的。将其视为只读,React和Redux就变得正交了。Redux更倾向于FRP概念,实际上当以这种方式使用时,它变得更具声明性。
const mapStateToProps = (state, ownProps) => {
return {
id: ownProps.id,
someData: state.projects.someData,
}
}
const mapDispatchToProps = (dispatch) => {
return {
onSubmitForm(data) {
dispatch(
someAction(data)
)
}
}
}
export default connect(mapStateToProps,mapDispatchToProps)(PresentationComponent)
在我们的展示组件中
const PresentationComponent = ({onSubmitForm, id}) => {
return <form id="someForm" onSubmit={(e) => {
e.preventDefault()
onSubmitForm(getFormData(id))
}}>
}
通过使用 Redux 的 HO 函数
connect()
,
mapStateToProps()
和
mapDispatchToProps()
,它允许使用纯函数组件,这些组件只需要将状态和方法作为参数传入。这些方法本质上可以返回任何内容。这无疑传达了更加纯粹的 Higher/First Order 和 FRP 概念。
然而,我认为未来我们会看到越来越多的 FRP 应用和库开发,但我认为重要的是我们不要舍弃过去所学。
在 Dan Abramov 关于 Redux 的实用 文章 中,他提醒我们不必总是坚持一种工具并固执于一种范式,我并不反对 OOP,在生产中我经常使用工厂和面向对象的概念,我只是认为在同一呼吸中使用 OOP 的术语然后开始谈论 FRP 会有点令人困惑。
值得关注的东西
正如评论中所提到的,cycle.js 绝对值得一看。它在 React 的声明式和可重用组件结构之间取得了良好的平衡,并混合了 RxJS 中数据流和可观察对象等概念的优点。
这是我的个人意见,我很想听听其他人是否有其他建议?
<ChildComponent prop1={val}/>
。老派的MVC更好。Redux的开发者们让所有的FP热潮变得更加复杂。我们需要架构而不是框架。 - Brian Cannard