使用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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

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