Redux是一阶FRP,就像Elm一样。
但是,似乎高阶FRP并没有真正与react一起使用。
为什么一阶FRP对React没用,而高阶没那么有用呢?
也许React不需要更高阶的主义?因此,作为回报,可以保留时间流逝的调试器吗?
换一种说法:
React是一种具有状态并返回视图的函数。
FRP是声明和执行状态机的一种方式。
这些是正交的关注点,为什么不将它们组合起来呢?
编辑:
如果我比较这个https://github.com/ochrons/diode/tree/master/examples/todomvc/src/main/scala/example
与此https://github.com/lihaoyi/workbench-example-app/blob/todomvc/src/main/scala/example/ScalaJSExample.scala
然后看来,使用scala.rx的同一应用程序的代码行数是Diode的一半(使用Redux,如单向数据流库)。
编辑2:
我的猜测-为什么不会发生-是大多数高阶frp人士(他们希望在Web开发中使用高阶FRP)使用reflex-frp,而他们使用reflex-dom而不是react。可能反射性使反应变得不必要。
最佳答案
编辑:我认为,React和高阶FRP概念特别面临的一大挑战是,在React组件内部处理状态会使用户接触到不是HO FRP所关注的语言概念,我认为这是还有更广泛的ES6 JS问题。我不是这个主题的专家,但是我在FRP之旅中分享了自己的想法和经验。
React的许多组件功能和组成都依赖于JS class
语法。对我来说,这是一个挑战,因为您要混淆术语和概念。对于许多前端开发人员(包括我自己)来说,React是他们首次接触FRP范例。当您一直使用classes
和constructors
来查看OOP继承术语时,很难理解功能组合的重要性。我认为这可以解释为什么我们在React库中看到了这种爆炸式增长,而没有看到太多的底层范式-因为存在各种对比术语。与FRP Read this tidy little post相反,它更多地涉及组件和以DOM为中心的视图。
React隐藏了很多基本概念,对于许多使用FRP范式的程序员来说,他们不喜欢这种感觉有多神奇,这意味着新来的人很容易只使用class
接口来制作其组件和组件。没有接触到很多潜在的FRP范例。
我认为,在处理状态时,React本质上应该是只读的。这样处理后,React和Redux成为正交。 Redux更偏向于FRP概念,实际上,当以这种方式使用Redux时,它将变得更具声明性。
const mapStateToProps = (state, ownProps) => {
return {
id: ownProps.id,
someData: state.projects.someData,
}
}
const mapDispatchToProps = (dispatch) => {
return {
onSubmitForm(data) { //our callback
dispatch( //redux dispatch function
someAction(data) //our Redux Action Creator
)
}
}
}
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()
,它可以使用仅将状态和方法作为参数的纯功能组件。这些方法本质上可以返回任何东西。当然,这传达了更纯净的高级/一阶和FRP概念。尽管我相信我们会在应用程序和库开发中看到越来越多的FRP,但继续前进,但我认为,不要将婴儿扔掉洗澡水也很重要。
在丹·阿布拉莫夫(Dan Abramov)务实的post about Redux中,他提醒我们,我们不必总是只坚持一种工具并挂在一个范式上,这并不是说我是反OOP的,而是在生产中定期使用工厂和面向对象的概念,我只是觉得使用OOP中的术语会有些混乱,然后开始谈论FRP。
东西看
如评论中所述,cycle.js绝对值得一看。这是React的声明式和可重用的组件结构与RxJS中的数据流和可观察对象之类的概念的好处之间的良好平衡。
那是我的两分钱,我想听听是否还有其他输入?
关于reactjs - 使用React的高阶FRP-为什么不发生?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39665845/