React.js + Flux -- 在视图中将回调作为道具传递

Posted

技术标签:

【中文标题】React.js + Flux -- 在视图中将回调作为道具传递【英文标题】:React.js + Flux -- Passing callback as a prop in view 【发布时间】:2015-11-04 03:57:59 【问题描述】:

官方React.js tutorial 有一个有趣的做法,就是将回调作为道具传递给子组件。在他们的示例中,它们有一个名为 CommentBox 的父组件和一个名为 CommentForm 的子组件。父 (CommentBox) 将回调方法 handleCommentSubmit 传递给子 (CommentForm)。当表单提交时,子组件触发回调通知父组件表单已提交。

然而,这个 React 教程不是Flux architecture 上的教程。从我有限的通量的角度来看,我的第一直觉是子视图应该调用一个动作,它(通过全局调度系统)更新一个商店。然后,更新后的存储将触发任何想要知道的组件的更新,包括有问题的父组件CommentBox

换句话说,父组件不会关心,也不想知道它的子组件,CommentForm 正在做什么,或者何时提交表单。相反,它会在商店更新时重新呈现。这意味着触发商店更新的任何东西都会导致 CommentBox 被更新(在我看来这是一件好事;如果有多种提交评论的方式怎么办?)

这让我想到了我的主要问题:在 Flux 架构中是否存在适合将回调方法传递给子组件的情况,或者这通常是一种反模式?


注意:Flux + React.js - Callback in actions is good or bad? 不是同一个问题——我问的是视图中的回调,而不是操作中的回调。

【问题讨论】:

【参考方案1】:

如果你有一个纯 UI 组件,比如一个花哨的按钮,那么在 UI 中启用回调是有意义的;动作只能用于触发应用程序更改:

<MyFancyButton onClick=this.handleClick/>

显然,MyFancyButton 没有足够的信息来知道点击应该做什么;由使用它的父视图决定调度哪些操作。

【讨论】:

在 react 教程中,CommentForm 会被认为是一个纯 UI 组件吗?即你如何限定“纯 UI”组件? 我想这取决于组件是否拥有/影响应用程序状态,或者它是否仅具有与其交互性相关的状态。像评论表这样的东西可以用任何一种方式;它要么是一个不知道提交给什么的通用评论表单,要么是一个与特定应用目的相关的评论表单。

以上是关于React.js + Flux -- 在视图中将回调作为道具传递的主要内容,如果未能解决你的问题,请参考以下文章

React.js 有基本的 Flux 实现吗?

Flux+React.js - 缓存 API 请求响应

React.js + Flux - 正确初始化存储中的数据对象

React.js & Flux - 在哪里注册 Websocket 事件(接收数据)的最佳位置

React Js - Flux 中的状态管理

Flux 和 React JS 中的依赖动作