React+Redux的MVC分层理解

React+Redux 这种开发模式在公司跌跌撞撞的使用已经有五个月了。对这种开发模式进行一个MVC的总结算也是跟以前的知识结构做一个对接。
本文会按照当前项目中碰到的问题以及想澄清的一些概念来整理。

  1. 什么是MVC?为什么要MVC?
  2. React中的几个概念是干什么的?
  3. Redux中的几个概念是干什么的?
  4. React+Redux的MVC分层是什么样的?

1. 什么是MVC?我们为什么要MVC?

  • Model(模型)是应用程序中用于处理应用程序数据和逻辑的部分。“模型”不依赖“视图”和“控制器”,也就是说,模型不关心它会被如何显示或是如何被操作。
    Model层主要有两个部分:1. DBObj定义数据库中对应的数据模型;2. 是逻辑的处理包括直接对数据库和网络数据的访问处理;
    在我们的程序里面把这层也叫做业务层处理层。跟React和Redux的代码没有任何关系的一层。

  • View(视图)是应用程序中处理数据显示的部分。视图层主要包括二个部分:1.视图层显示及交互逻辑;2.视图层的数据结构ViewObj, 包括React中的props和stats;

  • Controller(控制器)是响应视图层的事件和被动调用的事件(WebSocket发出的事件),根据不同的事件来组织不同业务逻辑处理,然后把处理结果反馈。而反馈的结果包括更新界面,更新数据模型。比如:视图层的数据更新,即Redux中的reducers。

为什么要用MVC?主要有三点:

  1. 使程序更简单更直观更容易理解;
  2. 在视图层的开发,是通过组件搭积木;
  3. 在控制层的开发,是用业务层的API搭积木。

2. React中的几个概念是干什么的?

  • component
    React.createClass方法就用于生成一个component ,然后像插入普通 HTML 标签一样,在网页中插入这个组件。组件的用法与原生的 HTML 标签完全一致。
  • props
    组件可以任意加入属性的,比如 <HelloWord name="Scott"> ,就是 HelloWord 组件加入一个 name 属性,值为 Scott。组件的属性可以在组件类的 this.props 对象上获取,比如 name 属性就可以通过 this.props.name 读取。
    this.props 表示那些一旦定义,当前组件就不再改变的特性,但是父组件是可以去修改的。Redux是通过connect把数据绑定到React的props来更新界面数据的。
  • state
    用于用户互动时当this.state数据变化,自动调用 this.render 方法,从而触发重新渲染组件。this.state 是会随着用户互动而产生变化的特性。
    用的了Redux后目前我们只用于存放界面显示控制及状态的数据。

讨论:

  1. props和state在组件定义和容器定义时使用区别?
  2. component的生命周期中的几个方法的使用包括:

Mounting(插入到 DOM中)
These methods are called when an instance of a component is being created and inserted into the DOM:
constructor()
componentWillMount()
render()
componentDidMount()
Updating(正在被重新渲染)
An update can be caused by changes to props or state. These methods are called when a component is being re-rendered:
componentWillReceiveProps()
shouldComponentUpdate()
componentWillUpdate()
render()
componentDidUpdate()
Unmounting(已移出真实 DOM)
This method is called when a component is being removed from the DOM:
componentWillUnmount()

3. Redux中的几个概念是干什么的?

Store 就是保存数据的地方,你可以把它看成一个容器。整个应用只能有一个 Store。Store对象包含所有数据

state 就是某个时间点的数据,就要对 Store的快照。

store.dispatch()是 View通过Redux connect中mapDispatchToProps方法发出 Action 以及被动调用事件时发出比如WebSocketServer。

Action函数是修改state的唯一入口,比如通过connect的mapDispatchToProps方法绑定到视图层的一个操作,或者是来自WebSocket的一个消息事件;Action函数最后通过store.dispatch() 发出的Action对象,表示 State 应该要发生变化了。
通常的做法是在Container层mapDispatchToProps方法中调用。

Action对象其中的type属性是必须的,表示 Action 的名称。其他属性可以自由设置。

Reducer 是个纯函数,它接受 Action对象 和当前 State 作为参数,返回一个新的 State。

纯函数是函数式编程的概念,必须遵守以下一些约束。
不得改写参数
不能调用系统 I/O 的API
不能调用Date.now()或者Math.random()等不纯的方法,因为每次会得到不一样的结果

4. React+Redux的MVC分层是什么样的?

React-Redux英文/React-Redux中文参考

1.React-Redux库的组件

React-Redux 库将所有组件分成两大类:UI 组件(presentational component)和容器组件(container component)。

  • UI 组件(presentational component)因为不含有状态,UI 组件又称为"纯组件",即它纯函数一样,纯粹由参数决定它的值。
    UI 组件有以下几个特征。

只负责 UI 的呈现,不带有任何业务逻辑
没有状态(即不使用this.state这个变量)
所有数据都由参数(this.props)提供
不使用任何 Redux 的 API

  • 容器组件(container component)使用connect生成的

负责管理数据和业务逻辑,不负责 UI 的呈现
带有内部状态
使用 Redux 的 API

React-Redux 规定,所有的 UI 组件都由用户提供,容器组件则是由 React-Redux 自动生成。也就是说,用户负责视觉层,状态管理则是全部交给它。

2.React-Redux库的connect

React-Redux 提供connect方法,用于从 UI 组件生成容器组件。connect的意思,就是将这两种组件连起来。
connect方法的完整 API 如下

import { connect } from 'react-redux'
const VisibleTodoList = connect( mapStateToProps, mapDispatchToProps)(TodoList)

connect方法接受两个参数:mapStateToProps和mapDispatchToProps。

  • mapStateToProps负责输入逻辑即将state映射到 UI 组件的参数(props);
  • mapDispatchToProps负责输出逻辑,即将用户对 UI 组件的操作映射成 Action。

3.React+Redux的MVC分层

** 视图层 ** React(component 、props(包括ViewObj)、state) (不能调用Redux的API)


** 控制层 ** Redux connect(输入逻辑输出逻辑=> Action函数)(Page(由多个组件组成的页面))->Container
Redux Action函数(Call->Manager ->DBObj->store.dispatch()) (视图层和Server都可以调用Action函数)
Redux Reducer(DBObj->ViewObj->state) (控制显示数据更改)


** 模型层 ** Mangaer层 ->ManagerService -> ORM(DBObj) (不能调用React和Redux的API)


** 工具包 ** DBOper NetOper

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容