我已经阅读了这个答案,减少了样板,看了几个GitHub示例,甚至尝试了redux(todo apps).
据我了解,官方redux doc动机提供了与传统MVC架构相比的优点.但它没有提供问题的答案:
为什么你应该使用Redux而不是Facebook Flux?
这只是编程风格的问题:功能与非功能?或者问题是在redux方法中遵循的能力/开发工具?也许缩放?还是测试?
如果我说redux对于来自函数式语言的人来说是一种变化,我是对的吗?
要回答这个问题,您可以比较实施redux在flux和redux上的动机点的复杂性.
以下是官方redux doc动机的动机点:
我刚刚发现了Redux.一切看起来都不错.使用Redux over Flux是否有任何缺点,陷阱或妥协?谢谢
我正在使用flux体系结构创建一个react.js应用程序,我正在尝试弄清楚应该在何时何地从服务器请求数据.这有什么例子吗?(不是TODO app!)
我正在阅读关于Flux但是示例Todo应用程序太简单了,我无法理解一些关键点.
想象一下像Facebook这样的单页应用程序,它具有用户个人资料页面.在每个用户个人资料页面上,我们希望显示一些用户信息及其最后的帖子,并带有无限滚动.我们可以从一个用户档案导航到另一个用户档案.
在Flux架构中,这将如何与商店和调度员相对应?
我们会为PostStore每个用户使用一个,还是会有某种全球商店?那么调度员呢,我们会为每个"用户页面"创建一个新的Dispatcher,还是我们会使用单例?最后,该架构的哪个部分负责管理"特定于页面"的商店的生命周期以响应路由变化?
此外,单个伪页面可以具有多个相同类型的数据列表.例如,个人资料页上,我想同时显示关注和跟随.UserStore在这种情况下,单身人士如何工作?将UserPageStore管理followedBy: UserStore和follows: UserStore?
我来自角度世界,在那里我可以将逻辑提取到服务/工厂并在我的控制器中使用它们.
我试图了解如何在React应用程序中实现相同的功能.
假设我有一个验证用户密码输入的组件(它的强度).它的逻辑非常复杂,因此我不想在它自己的组件中编写它.
我应该在哪里写这个逻辑?在商店里,如果我使用助焊剂?或者有更好的选择吗?
如果商店保持自己的状态并且能够在这样做时调用网络和数据存储服务......在这种情况下,操作只是愚蠢的消息传递者,
-要么-
...存储是否应该是来自操作的不可变数据的愚蠢接收者(并且操作是在外部源之间获取/发送数据的操作?此实例中的存储将充当视图模型并且能够聚合/过滤它们在根据动作提供的不可变数据设置自己的状态之前的数据.
在我看来,它应该是一个或另一个(而不是两者的混合).如果是这样,为什么一个首选/推荐优于另一个?
我是reactJS和UI的新手,我想知道如何从reactJS代码中进行简单的基于休息的POST调用.
如果有任何示例,那将非常有帮助.
谢谢.
React.js的一大优势应该是服务器端渲染.问题是密钥功能React.renderComponentToString()是同步的,这使得在服务器上呈现组件层次结构时无法加载任何异步数据.
假设我有一个用于评论的通用组件,我可以在页面的任何位置删除它.它只有一个属性,某种标识符(例如文章的id在其下面放置注释),其他所有内容都由组件本身处理(加载,添加,管理注释).
我非常喜欢Flux架构,因为它使很多东西变得更容易,而且它的商店非常适合在服务器和客户端之间共享状态.一旦我的包含注释的商店被初始化,我就可以将其序列化并将其从服务器发送到客户端,在那里可以轻松恢复.
问题是填充我的商店的最佳方式是什么.在过去的几天里,我一直在谷歌搜索,我遇到了一些策略,考虑到React的这个功能被"提升"多少,这些策略看起来都不是很好.
在我看来,最简单的方法是在实际渲染开始之前填充我的所有商店.这意味着在组件层次结构之外的某个地方(例如,挂钩到我的路由器).这种方法的问题是我必须两次定义页面结构.考虑一个更复杂的页面,例如一个包含许多不同组件的博客页面(实际的博客帖子,评论,相关帖子,最新帖子,推特流......).我必须使用React组件设计页面结构,然后在其他地方我必须定义为当前页面填充每个所需存储的过程.这似乎不是一个很好的解决方案.不幸的是,大多数同构教程都是以这种方式设计的(例如,这个伟大的通量教程).
React-async.这种方法很完美.它让我只需在每个组件的特殊函数中定义如何初始化状态(无论是同步还是异步),并在层次结构呈现为HTML时调用这些函数.它的工作方式是在状态完全初始化之前不会呈现组件.问题是它需要Fibers,据我所知,这是一个改变标准JavaScript行为的Node.js扩展.虽然我非常喜欢这个结果,但在我看来,我们并没有找到解决方案,而是改变了游戏规则.而且我认为我们不应该被迫这样做来使用React.js的这个核心功能.我也不确定这个解决方案的一般支持.是否可以在标准Node.js虚拟主机上使用Fiber?
我自己在思考一点.我没有真正想过通过实现细节,但一般的想法是我会以类似于React-async的方式扩展组件,然后我会在根组件上重复调用React.renderComponentToString().在每次传递过程中,我会收集扩展回调,然后在传递和传递中调用它们来填充商店.我将重复此步骤,直到填充当前组件层次结构所需的所有存储.有很多事情需要解决,我对性能特别不确定.
我错过了什么?还有其他方法/解决方案吗?现在我正在考虑采用react-async/fiber方式,但我并不完全确定它,如第二点所述.
关于GitHub的相关讨论.显然,没有官方方法甚至解决方案.也许真正的问题是如何使用React组件.像简单的视图层(几乎是我的建议第一)或像真正的独立和独立组件?
我正在重写我的应用程序以使用Flux,我在从商店检索数据时遇到问题.我有很多组件,它们很多.其中一些是大(Article),一些是小而简单(UserAvatar,UserLink).
我一直在努力应对组件层次结构中应该从Stores读取数据的地方.
我尝试了两种极端的方法,我都不喜欢这两种方法:
需要来自Store的某些数据的每个组件只接收实体ID并自行检索实体.
例如,Article传递articleId,UserAvatar并UserLink传递userId.
这种方法有几个明显的缺点(在代码示例下讨论).
var Article = React.createClass({
mixins: [createStoreMixin(ArticleStore)],
propTypes: {
articleId: PropTypes.number.isRequired
},
getStateFromStores() {
return {
article: ArticleStore.get(this.props.articleId);
}
},
render() {
var article = this.state.article,
userId = article.userId;
return (
<div>
<UserLink userId={userId}>
<UserAvatar userId={userId} />
</UserLink>
<h1>{article.title}</h1>
<p>{article.text}</p>
<p>Read more by <UserLink userId={userId} />.</p>
</div>
)
}
});
var UserAvatar = React.createClass({
mixins: [createStoreMixin(UserStore)],
propTypes: { …Run Code Online (Sandbox Code Playgroud) 这是我的表单和onClick方法.我想在按下键盘的Enter按钮时执行此方法.怎么样 ?
注意:没有赞赏jquery.
comment: function (e) {
e.preventDefault();
this.props.comment({comment: this.refs.text.getDOMNode().value, userPostId:this.refs.userPostId.getDOMNode().value})
},
<form className="commentForm">
<textarea rows="2" cols="110" placeholder="****Comment Here****" ref="text" /><br />
<input type="text" placeholder="userPostId" ref="userPostId" /> <br />
<button type="button" className="btn btn-success" onClick={this.comment}>Comment</button>
</form>
Run Code Online (Sandbox Code Playgroud) reactjs ×10
reactjs-flux ×10
javascript ×4
flux ×3
redux ×2
architecture ×1
facebook ×1
node.js ×1