【发布时间】:2015-01-31 01:25:45
【问题描述】:
Flux 模型要求在视图中发起的任何状态更改都会触发通过调度程序工作的操作,并将商店向下传播回监听视图。
这一切都很好,花花公子。但是如果我需要在特定的状态更改之后执行一些 DOM 操作 怎么办?在现实世界的应用程序中,我们有时必须使用 relic 称为 jQuery 插件(还记得吗?)
例如,我需要初始化一个 jQuery 视频播放器,就像 $('#videoContainer').initPlayer(streamURL),在 Ajax 请求后检索 streamURL。 在继续阅读之前,请花点时间了解您将如何使用 Flux/React 做到这一点)。
在视图部分,我可能会使用componentWillReceiveProps:
var jsVideoPlayer = React.createClass({
componentWillReceiveProps: function(nextProps) {
$(this.refs.videoContainer.getDOMNode()).initPlayer(nextProps.streamURL);
},
render: function() {
return (
<div ref="videoContainer">
</div>
);
}
});
但是在这里,每次状态更新时播放器都会被初始化。那肯定会破坏我们的视频播放器。因此,让我们在实际执行任何操作之前检查 URL 是否已更改:
componentWillReceiveProps: function(nextProps) {
if (nextProps.streamURL && nextProps.streamURL !== this.streamURL) {
this.streamURL = nextProps.streamURL;
$(this.refs.videoContainer.getDOMNode()).initPlayer(nextProps.streamURL);
}
},
很简单,对吧?但是更大的图景呢?如果我们在添加更多功能和 UI 元素时扩大规模并扩大规模,这可能会导致更多自定义验证代码在视图中,以了解商店中的内容。即使在一个完美的应用程序中,每家商店都有自己的领域,并且所有东西都以设计模式一尘不染,值得虔诚的追随者,随着应用程序的扩展,我们仍然必须在视图中使用越来越多的逻辑.
在我们的团队中,我认为这个逻辑应该真正进入符合 Flux 模型的 ControllerView 中 - 但其他人都认为这是框架应该处理的事情。我们是 Flux/React 的新手,想不出更好的主意来让框架为我们做到这一点。
【问题讨论】:
-
为什么不把它放在componentDidMount或componentDidUpdate中?
-
@zackify 因为它依赖于仅在用户单击按钮时发生的 ajax 请求
-
为什么不直接使用诸如 VIDEO_URL_RETRIEVED 之类的操作来更新商店中的状态?如果 props streamUrl 不为空,您的控制器视图组件将接收更新的状态并在您的 jsVideoPlayer 中,那么您可以初始化您的 jQuery 插件。如果你的组件有一个纯渲染方法,它只会更新一次:当 VIDEO_URL_RETRIEVED 动作被触发时。
标签: jquery jquery-plugins reactjs reactjs-flux