在 React JS 中,什么时候应该使用存储而不是直接操作视图的状态
In React JS, when should you use a store vs directly manipulating the view's state?
现在我理解了商店的概念是 React 应用程序的事实来源,但有时使用商店似乎有点矫枉过正,尤其是在仅限 UI 的情况下。
例如,假设我正在制作一个包含电影列表的应用程序。该应用程序包含一个搜索栏,可让您根据标题过滤这些电影。这个搜索栏的值(我们称之为searchTerm
)应该包含在商店中吗?它唯一的影响是显示的电影列表,这纯粹是一个 UI 功能。它不会发送到服务器或保存到本地存储。因此,在我的handleTextChange
函数中,我应该提醒商店,还是简单地设置组件的状态:
应该是这个(使用商店):
var Actions = Reflux.createActions([
"searchChanged"
]);
var Store = Reflux.createStore({
listenables: [Actions],
getInitialState: function () {
return data;
},
onSearchChanged: function (searchTerm) {
this.trigger(data.filter(function (el) {
return el.name.toLowerCase().indexOf(searchTerm.toLowerCase()) != -1;
}));
}
});
var View = React.createClass({
mixins: [Reflux.connect(Store, "movies")],
handleTextChange: function (e) {
Actions.searchChanged(e.target.value);
},
render: function(){
//Render here. Somewhere there is this input element:
<input onChange={this.handleTextChange} type="text"/>
}
)};
或者这个(不使用商店):
var Store = Reflux.createStore({
getInitialState: function () {
return data;
},
});
var View = React.createClass({
mixins: [Reflux.connect(Store, "movies")],
handleTextChange: function (e) {
this.setState({searchTerm: e.target.value});
},
render: function(){
var filtered = this.movies.filter(function (el) {
return el.name.toLowerCase().indexOf(this.state.searchTerm.toLowerCase()) != -1;
});
//Render here using the filtered variable. Somewhere there is this input element:
<input onChange={this.handleTextChange} type="text"/>
}
}
后一个例子显然更简单。是否有充分的理由使用存储来筛选数据?还是视图应该有一个searchTerm
变量并在render()
函数中执行过滤?
正如您的示例所示,不使用商店更简单,在这种情况下可以说是正确的。
要回答的一个弱问题是:
是否有任何其他组件需要了解搜索结果?
一个更好的问题是:
其他组件是否需要了解搜索结果?
请考虑一下,如果您添加对结果的分页,甚至是"找到 12 个结果"的简单标头,则这些组件需要知道结果,并且需要从存储中获取结果。或者,您可能希望添加路由器并让搜索更新 url 并更改 url 以驱动应用程序。
如果你可以肯定地说只有子组件会关心一个值,那么状态是可以的。
这两种方法都是正确的!但对于您的情况,在组件中过滤会更好。因为搜索结果是可计算的。存储应仅保留原始数据。"开发 React 边缘"一书有一个 filterableForm 的例子,将搜索关键字保留在视图组件中是完全可以的。
相关文章:
- 在Redux中链接async和sync操作以计算初始状态
- AngularJS-检测到n分钟内没有任何操作并进入默认状态
- 在 React JS 中,什么时候应该使用存储而不是直接操作视图的状态
- 如何根据各种复选框状态执行操作
- React/Redux 状态在第二次操作调用时为空
- 状态更改时会不必要地触发Redux操作
- 如何在程序或网站处于活动状态时禁用剪贴板和任务切换操作
- 如何在不使用主题或命令式操作的情况下管理状态 在一个简单的 RxJS 示例中
- 如何在 AngularJS 中同时处理 DOM 操作和状态更改
- 如何捕获页面上的所有请求和响应,并根据每个响应状态的需要执行操作
- 具有新状态的 Redux 调度操作和化简器
- 从一种特定状态转换到另一种特定状态时执行操作
- FAB 操作是否可以在点击后保持打开状态
- jQuery在Bootstrap切换按钮类处于活动状态时执行某些操作
- 如何检测没有't触发操作状态
- AngularJS捕获$http操作的所有状态代码
- 如何确保链接'的默认操作始终处于禁用状态
- 在Rails中,如何在视图中显示控制器操作成功或失败的JSON状态消息
- web应用程序- Javascript:操作状态栏来显示日期
- 操作状态上的javascript历史记录