摘要:做一个可以利用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. 快速创建一个springboot项目

    创建一个maven项目(springboot.mybatis-plus) 目标:可以访问ftl页面.对象(json字符串),可以进行单元测试 1.新建一个maven项目,选择模板maven-arche ...

  2. Java语言程序设计(基础篇) 第四章 数学函数、字符和字符串

    第四章 数学函数.字符和字符串 4.2 常用数学函数 方法分三类:三角函数方法(trigonometric method).指数函数方法(exponent method)和服务方法(service m ...

  3. Open Close Principle 开闭合原则

  4. C++ 中的sort排序用法

    STL中就自带了排序函数sortsort 对给定区间所有元素进行排序 要使用此函数只需用#include <algorithm> sort即可使用,语法描述为:sort(begin,end ...

  5. 《量化投资:以MATLAB为工具》连载(1)基础篇-N分钟学会MATLAB(上)

    http://blog.sina.com.cn/s/blog_4cf8aad30102uylf.html <量化投资:以MATLAB为工具>连载(1)基础篇-N分钟学会MATLAB(上) ...

  6. HDU 5063 Operation the Sequence(仔细审题)

    http://acm.hdu.edu.cn/showproblem.php?pid=5063 题目大意: 题目意思还是比较简单.所以就不多少了.注意这句话,对解题有帮助. Type4: Q i que ...

  7. Keras学习~第一个例子~跑MNIST

    import numpy as npimport gzip import struct import keras as ks import logging from keras.layers impo ...

  8. 自定义 JSON 对象

    针对 IE9 以下不支持 JSON 对象的处理方式,网上大部分自定义的方式无形之中都会将中文转码为 Unicode 编码格式的字符换,但是在浏览器中我们有无法察觉到(浏览器自己解析成 UTF8 了), ...

  9. mysql5.6.23免安装配置

    1.官网下载,并解压 2.环境变量,path下,追加mysql的bin路径D:\Program Files\mysql\bin; 3.mysql目录下的my-default.ini重命名为my.ini ...

  10. The constructor BASE64Encoder() is not accessible due to restriction on required library

    在Eclipse中编写Java代码时,用到了BASE64Decoder,import sun.misc.BASE64Decoder;可是Eclipse提示:Access restriction : T ...