使用Mobx来简化React项目中的状态管理

前言
最近打算在真实项目中推行一下mobx,所以打算整理一下自己的思想。
于是就有了下面这篇文章。

基于面向对象,使用更直观的方式来管理React的状态(state)。

下面会使用一个简单的例子来说明。

这是存储数据的一个模型

class ActivityList {
  // state为实例变量,可参考ruby,java
 // 活动列表的数据存在data数组里,分页信息在meta里
  state = {
    meta: {},
    data:[]
 }

  // 请求后端Api的方法
  fetchActivities() {
    const response = cfetch('/activities')
    // 在这里我们已经获取了Api返回的数据
  }
}
通过fetchActivities,我们已经拿到服务器返回的数据了。现在我们该怎么去把数据存储到react中,并引起view的更新呢?
  1. 如果上面这个类是一个ReactComponent,那么我们可以这样去更新数据。

    fetchActivities() {
      const response = cfetch('/activities')
      this.setState({ state: response.jsonResult })
    

}
```
不过在react组件里,state只能传给子组件,不利于复用。
而且组件被拆除的话数据也会消失。

  1. 通过redux的话我们可以把数据存到一个可共用的store中,便于复用和管理。

    // 因为redux是基于函数式的,所以不能使用上面的面向对象模型。
    // 这里简单的说明一下redux
    
    // 我们先定义一个reducer
    const state = {
      meta: {},
      data:[]
    }
    
    function activityList(state = state, action) {
        //.....
        return newState
    }
    // reducer是一个纯函数,它会传入当前的state,然后你把一个新的state返回给它,
    // 它就会去更新数据和view
    
虽然reducer是一个函数,但我们并不能直接去使用它,它由redux自身来调用,我们只能通过指派的形式去触发reducer。
// 之后我们需要建立一个action,通过dispatch来触发reducer
function fetchActivities() {
  const response = cfetch('/activities')
  store.dispatch({
    payload: response
  })
}
  1. 通过1,2的方法我们了解到在react项目中更新state是怎么做的。现在我们回到主题

    使用更直观的方式来管理React的状态

    而最直观的方法莫过于这样

     fetchActivities() {
       const response = cfetch('/activities')
       this.state = response.jsonResult
    

}

看起来是不是有点不可思议,因为这种做法只是改变了变量的值,但在react中我们不仅要改变state,而且还需要让它更新到view。只是赋值的话是不可能引起view的变化的。
但是es5,就有一种特性可以延伸赋值行为的功能

Object.defineProperty(this, 'state', {
get() {
return this._state
},
set(state) {
this._state = state
// 在这里更新view
}
})
//这样子的话在this.state = response.jsonResult 时候所发生的再不只是单纯赋值

4. 现在我们看看怎么使用Mobx去管理状态

import { observable } from ''mobx"
import { observer } from "mobx-react"
// 还是这个类
class ActivityList {
// state为实例变量,可参考ruby,java
// 活动列表的数据存在data数组里,分页信息在meta里
// observable是一个装饰器,可以参考python,java的语法。
// 这个装饰器把state添加get和set访问器属性
@observable state = {
meta: {},
data:[]
}

 fetchActivities() {
   const response = cfetch('/activities')
   this.state = response.jsonResult
 }

}
const activityList = new ActivityList()

// 这是一个react组件
@observer
class ActivitiesPage extends Component {
componentDidMount () {
activityList.fetchActivities()
}

 render () {
   <ul>
     {activityList.state.data.map(v => <li>{v.id}</li>)}
   </ul>
 }

}

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

推荐阅读更多精彩内容

  • 做React需要会什么? react的功能其实很单一,主要负责渲染的功能,现有的框架,比如angular是一个大而...
    苍都阅读 14,740评论 1 139
  • 一、什么情况需要redux? 1、用户的使用方式复杂 2、不同身份的用户有不同的使用方式(比如普通用户和管...
    初晨的笔记阅读 2,013评论 0 11
  • 学习必备要点: 首先弄明白,Redux在使用React开发应用时,起到什么作用——状态集中管理 弄清楚Redux是...
    贺贺v5阅读 8,877评论 10 58
  • 前言 本文 有配套视频,可以酌情观看。 文中内容因各人理解不同,可能会有所偏差,欢迎朋友们联系我讨论。 文中所有内...
    珍此良辰阅读 11,894评论 23 111
  • 相比过去重男轻女的岁月,如今已然是改朝换代,女儿不再是泼出去的水,而是父母宝贵的心尖儿,她们的喜怒哀乐影响着父母的...
    Yang沐汐阅读 1,303评论 1 4