Controller View 模式
参考:https://blog.andrewray.me/the-reactjs-controller-view-pattern/
Flux参考:http://www.cnblogs.com/hellohello/p/8024263.html
创造一个顶层组件来管理所有的state,并把这些state通过props传递给子组件。如
class HomePageController extends React.Component {
componentDidMount() {
Store1.on('change', this.onStoreChange);
Store2.on('change', this.onStoreChange);
}
onStoreChange() {
this.setState({
data1: Store1.getData(),
data2: Store2.getData()
});
}
render() {
// <HomePage /> has no internal state!
return <HomePage
data1={this.state.data1}
data2={this.state.data2} />;
}
}
以上是store的更新事件处理方式,不理解的可以查看以上flux链接。
像上面这样提取一个顶层的controller有什么好处?
有了controller,可以更加灵活地组合使用组件。
一般情况下,一个页面有一个 <ShoppingCartView /> ,里面直接监听了 ShoppingCartStore。但以后如果需要一个页面有多个 <ShoppingCartView />,分别监听不同的 ShoppingCartStore,那就只能抽取一个ShoppingCartController出来,如下:
class ShoppingCartController extends React.Component {
...
// You get component portability for free!
render() {
return <div>
<ShoppingCart data={store1Data} />
<ShoppingCart data={store2Data} />
</div>;
}
在以上的controller中就可以很简单的组合多个组件来使用了。对比原来的用法,抽取controller之前,每个组件的状态都是与这个组件要用的store是相互关联的,抽取之后,实际上是把组件中的状态(store)都抽取出来,对store的监听都放到controller中,controller中的子组件变为无状态组件,需要controller通过props传入数据,以及回调函数。在回调函数中修改对应的已经被抽取出来的store数据(这个过程应该通过dispatcher发送action来实现,而不是直接修改store),store发生变化,触发controller中的回调,调用setState,重新渲染界面。
如果子组件可能在多个页面有使用,则应该把这个组件做成无状态组件,通过外部的contaoller 通过 props传递数据和回调,这样使用起来更加方便。
这种方式下,假如子组件要发送Action了,怎么处理?可以在controller中写一个函数调用dispatcher来发送Action,然后把这个函数传递子组件来调用,或者直接在controller中引入action creator,把action creator的方法传递给子组件。子组件调用这些方法就可以发送action了。
子组件其实也不一定要是无状态组件,它也可以有自己的状态(仅仅在组件内部用到)
Controller View 模式的更多相关文章
- 组件开发中的Controller View模式
“Controller View”模式: 组件嵌套中,最顶层的组件只管理State 子组件为纯组件 顶层组件分配State给子组件,作为子组件的props 子组件接受顶层组件发来的State作为自身的 ...
- Reactjs的Controller View模式
摘要:做一个可以利用props来控制和传递所有状态给其子组件的顶级组件是一件非常酷的事情 不要和“MVC”混淆了,只有能够控制和传递所有的“state”的顶层组件,我们才叫它"view co ...
- (转)Qt Model/View 学习笔记 (一)——Qt Model/View模式简介
Qt Model/View模式简介 Qt 4推出了一组新的item view类,它们使用model/view结构来管理数据与表示层的关系.这种结构带来的 功能上的分离给了开发人员更大的弹性来定制数据项 ...
- (转)Qt Model/View 学习笔记 (二)——Qt Model/View模式举例
Qt Model/View模式举例 Qt提供了两个标准的models:QStandardItemModel和QDirModel.QStandardItemModel是一个多用途的model,可用于表示 ...
- open Session In View模式
首先看图说话: ****Open Session In View模式的主要思想是:在用户的每一次请求过程始终保持一个Session对象打开着*** 接下来就是代码: +++++++++++++++++ ...
- Materialized View模式
Materialized-View模式是在要求数据格式不利于查询操作的情况下,根据多个数据仓库的数据生成预生成的视图的一种模式.这种模式可以帮助支持高效的查询和数据提取,提高应用程序的性能. 问题 在 ...
- MVC - Model - Controller - View
一. Model 1.1 在ASP.NET MVC 中 model 负责的是所有与 "数据“ 相关的的任务. 也可以把Model 看成是 ASP.NET 中三层模式的 BLL层 加 DA ...
- Hibernate Open Session In View模式【转】
来源:http://www.yybean.com/opensessioninviewfilter-role-and-configuration 一.作用 Spring为我们解决Hibernate的Se ...
- Controller异步模式
转载: https://blog.csdn.net/yingxiake/article/details/51193319 因为服务器请求处理线程的总数是有限的,如果类似的请求多了,所有的处理线程处于阻 ...
随机推荐
- SecureCRT 退格键等不好用
1.MongoDB Shell中退格键使用的问题. 利用SecureCRT工具访问linux的时候,在使用MongoDB的交互式shell的时候,退格键(Backspace)无法使用,导致无法修改输入 ...
- VLAN-6-VLAN Trunk协议(VTP)
VTP能够将VLAN配置信息通告给邻居交换机,这样做可以使工程师只在一台交换机上配置VLAN,同一个VTP域中的所有其他交换机动态学习这些VLAN信息.VTP通告VLAN ID.VLAN 名称和 VL ...
- Java EE学习笔记(四)
Spring的数据库开发 1.Spring JDBC 1).Spring JDBC模块的作用:Spring的JDBC模块负责数据库资源管理和错误处理,大大简化了开发人员对数据库的操作,使得开发人员可以 ...
- 在自己的linux服务器上面部署ShowDoc
ShowDoc就是一个非常适合IT团队的在线文档分享工具,使用的是一款非常轻量级的关系数据库系统SQLite,支持多数SQL92标准.它可以加快团队之间沟通的效率. 但是把所有的接口文档写在第三方的服 ...
- [转]Hibernate对象的三种状态
在Hibernate中,对象有三种状态:临 时状态(Transient).持久状态(Persistent)和游离状态(Detached). 处于持久态的对象也称为 PO(PersistenceObje ...
- 事件冒泡之cancelBubble和stoppropagation的区别
事实上stoppropagation和cancelBubble的作用是一样的,都是用来阻止浏览器默认的事件冒泡行为. 不同之处在于stoppropagation属于W3C标准,试用于Firefox等浏 ...
- 【读书笔记】构建之法(CH4~CH6)
从chapter4至chapter6,围绕着构建过程的合作讨论构建之法,而合作与个人工作的区别却以一个微妙的问题为开端:阅读别人的代码有多难? 两人合作:(驾驶员与领航员) 合作要注意代码风格规范与设 ...
- sqlserver中drop、truncate和delete语句的用法
虽然小编不建议大家去用命令删除数据库表中的东西,但是这些删除命令总有用的着的地方. 说到删除表数据的关键字,大家记得最多的可能就是delete了 然而我们做数据库开发,读取数据库数据.对另外的两兄弟用 ...
- Hyperledger Fabric on SAP Cloud Platform
今天的文章来自Wen Aviva, 坐Jerry面对面的程序媛. Jerry在之前的公众号文章<在SAP UI中使用纯JavaScript显示产品主数据的3D模型视图>已经介绍过Aviva ...
- 数学题 HDOJ——2086 简单归纳
哎 真的是懒得动脑子还是怎么滴... 题目如下 Problem Description 有如下方程:Ai = (Ai-1 + Ai+1)/2 - Ci (i = 1, 2, 3, .... n).若给 ...