摘要:做一个可以利用props来控制和传递所有状态给其子组件的顶级组件是一件非常酷的事情

不要和“MVC”混淆了,只有能够控制和传递所有的“state”的顶层组件,我们才叫它"view controller"或者"controller view"。

对于任何的顶层组件,例如<HomePage />,我们创造一个<HomePageController/>,这个组件是在render方法里面利用props方法来传递所有我们需要的信息的。

例子

// Controller views are very simple
class HomePageController extends React.Component {
// Normal Flux store listening
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} />;
}
}

Controller Views模式的好处

组件更加的便捷

假设你有一个叫<ShoppingCartView/>的组件和一个叫<ShoppingCartStore/>的组件,我们需要一个组件来直接监听store组件的状态,这个很明显的。但是后来再次假设你有两份<ShoppingCartView/>要同时从不同的stroe里面直接读取数据,这时候要怎么办,假设你有一个叫<ShoppingCartController />的组件的话,你就可以监听多个store然后利用props来渲染每一个子组件。

如下例子

class ShoppingCartController extends React.Component {
...
// You get component portability for free!
render() {
return <div>
<ShoppingCart data={store1Data} />
<ShoppingCart data={store2Data} />
</div>;
}

react router配合的天衣无缝

React Router有一个指向每一个页面的<RouteHandler />,如果你有一个view controller的话,你就已经有一个 route handler了

<Route name="home" path="/" handler={ HomePageController } /> 

如果你的组件需要读取URL里面的参数的话,这个就显得更为重要了。

例如context.router.getCurrentQuery(),你利用props来传递URL的参数渲染,而不是把你的渲染方法里面弄的连七八糟。现在你的子组件在props的帮助下得到最简介的渲染,而不是子组件来获取URL的参数然后在此渲染。

你也可以把willTransition当做controller view的一个钩子,这个钩子用来让你的子组件更加的便捷,因为他们从来不用担心直接处理路由请求的问题。

减少开销

状态控制在计算机系统里面是不被推荐的,因为一个方法很难在看一眼之后就被理解,你需要拨开细节去查看内容。

假如你嵌套组件,并且每一个组件都自己处理他们的状态,那你的应用将会很难被人理解。

但一个组件只需要纯粹只根据props获取的数据来渲染时,我们就会对这个组件的输出更容易理解。因为组建有这明确的输入。

更容易测试

如果想测试一个子组件,只想测试这个组件的特定的props和明确的渲染输入结果,你将不用编造测试场景和请求动作。

问答

如果嵌套多个“View Controllers”会怎么样?

Controller views并不是总是顶层组件,例如<HomePageController />可以渲染他的子组件<SignupLightbox />,从代码结构上说的话,lightbox 被嵌套在Controller views里面,<HomePageController />必须来检测所有的状态来渲染lightbox吗?

答案是否定的。如果lightbox组件在多个页面都有展示的话,这样由<HomePageController />来控制lightbox是一个不错的办法,但是lightbox从概念来来说的话,它也是一个顶层组件,尽管从代码结构上看它被嵌套在了其他的组件里面。

一个子组件可以呀有任何的内部状态吗?

可以有的。实际上,在controller view中,使用内部状态会更加明显。例如你有一个组件叫<SearchForm />,那么它可以有一个存储你子组件需要的数据叫this.state.unsubmittedSearch,

关注

这个controller view主要是解决的问题是组件的嵌套问题。controller view需要很小很简单,如果你有很深层次的组件嵌套的话,你的controller view也会变得很大很笨拙,因为你需要传递好多的props和更改好多的状态。

像这种特定的情景的解决方案,但是这种通常是代码直觉,你需要评估你的组件树,从而来自己判断被嵌套的组件是有意义的。

例如你有一个20多页的多步骤表单,那你就需要船度很多的props,但是如果每一步都有一个针对特定的url的controller view,这样你的组件就会变得很小很简单。

Reactjs的Controller View模式的更多相关文章

  1. 组件开发中的Controller View模式

    “Controller View”模式: 组件嵌套中,最顶层的组件只管理State 子组件为纯组件 顶层组件分配State给子组件,作为子组件的props 子组件接受顶层组件发来的State作为自身的 ...

  2. Controller View 模式

    参考:https://blog.andrewray.me/the-reactjs-controller-view-pattern/ Flux参考:http://www.cnblogs.com/hell ...

  3. (转)Qt Model/View 学习笔记 (一)——Qt Model/View模式简介

    Qt Model/View模式简介 Qt 4推出了一组新的item view类,它们使用model/view结构来管理数据与表示层的关系.这种结构带来的 功能上的分离给了开发人员更大的弹性来定制数据项 ...

  4. (转)Qt Model/View 学习笔记 (二)——Qt Model/View模式举例

    Qt Model/View模式举例 Qt提供了两个标准的models:QStandardItemModel和QDirModel.QStandardItemModel是一个多用途的model,可用于表示 ...

  5. open Session In View模式

    首先看图说话: ****Open Session In View模式的主要思想是:在用户的每一次请求过程始终保持一个Session对象打开着*** 接下来就是代码: +++++++++++++++++ ...

  6. Materialized View模式

    Materialized-View模式是在要求数据格式不利于查询操作的情况下,根据多个数据仓库的数据生成预生成的视图的一种模式.这种模式可以帮助支持高效的查询和数据提取,提高应用程序的性能. 问题 在 ...

  7. MVC - Model - Controller - View

    一. Model 1.1 在ASP.NET MVC 中 model 负责的是所有与 "数据“  相关的的任务. 也可以把Model 看成是 ASP.NET  中三层模式的 BLL层 加 DA ...

  8. Hibernate Open Session In View模式【转】

    来源:http://www.yybean.com/opensessioninviewfilter-role-and-configuration 一.作用 Spring为我们解决Hibernate的Se ...

  9. Controller异步模式

    转载: https://blog.csdn.net/yingxiake/article/details/51193319 因为服务器请求处理线程的总数是有限的,如果类似的请求多了,所有的处理线程处于阻 ...

随机推荐

  1. Session与Cookie概念

    摘:一.Session机制session是一种服务器端的状态管理技术,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息.当程序需要为某个客户端的请求创建一个session的时候,服务 ...

  2. android获取textview的行数

    最近项目需求,需要获取Textview的行数,通过行数与TextView的maxLines进行比较来确定是否显示TextView下方的展开按钮是否显示,废话少说直接上代码,mTextView.getL ...

  3. python pip安装问题

    scipy-0.18.1-cp34-cp34m-win32.whl is not a supported wheel on this platform. 遇到该问题需要更新pip版本 1.更新pip: ...

  4. C# 与数据库中字段类型 Int16(short), Int32(int), Int64(long)的取值范围、区别 。string长度

    一开始看到Int16, Int32, Int64这三种类型就觉得有点怪, 为什么要整个数字结尾的, 挺怪的. 昨天互相想到, ms这么干就是想让大家一眼就知道这个数据类型占多大空间吧. Int8, 等 ...

  5. Socket与Http通信

    HTTP(超文本传输协议): HTTP是应用层协议,主要用于解决数据包装的问题. HTTP协议是建立在TCP协议之上的一种应用. HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在 ...

  6. springmvc之格式化要显示的小数或者日期。

    把保存的小数或者日期按照想要的格式显示. 首先导入jar包joda-time-2.3.jar,下载地址http://pan.baidu.com/s/1gfNuUfp 这里使用注解的方式进行格式化. 创 ...

  7. TortoiseGit状态图标不能正常显示的解决办法

    1:确认是不是64bit 系统上装了 32bit 的 TortoiseGit,如果是的话,这个只要再安装 64bit 的 TortoiseGit就可以 了,如果不是,请往下看.   2:在开始菜单的搜 ...

  8. Android Bitmap转换WebPng图片导致损坏的分析及解决方案

    出现问题的code!!! private void saveImage(String uri, String savePath) throws IOException { // 创建连接 HttpUR ...

  9. WebSocket///////////////////////z

    作者:Ovear链接:http://www.zhihu.com/question/20215561/answer/40316953来源:知乎著作权归作者所有,转载请联系作者获得授权. 一.WebSoc ...

  10. 索尼Sony ATI显卡驱动 Win7 Win8 Win8.1 视频黑屏 解决方法

    索尼ATI显卡驱动 Win7  Win8  Win8.1 视频 黑屏 完美解决方法: 下载这个补丁 安装 即可 解决  ! baidu pan:  http://pan.baidu.com/s/1gd ...