美文网首页热更新Web前端之路让前端飞
使用Mobx来简化React项目中的状态管理

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

作者: jamie_Ye | 来源:发表于2017-04-13 09:36 被阅读2844次

前言
最近打算在真实项目中推行一下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

相关文章

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

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

  • Mobx 使用

    为什么使用mobx? 最近项目中,使用了一种新的状态管理工具—Mobx,Mobx相较于redux之类的数据管理状态...

  • Mobx 基本入门

    Mobx, 一个简单、可扩展的状态管理插件, 可结合React, 小程序使用。 这篇文章主要讲一下mobx的基本使...

  • React MobX 开始

    MobX[https://mobx.js.org/] 用于状态管理,简单高效。本文将于 React 上介绍如何开始...

  • react native 集成 mobx

    使用的版本: "mobx": "^4.2.1""mobx-react": "^5.1.2""react": "16...

  • 使用umi+dva做一个demo

    最初只是使用react 进行开发项目,发现项目过大状态管理起来就相当困难,虽然有redux, mobx,但是使用起...

  • React mobx 状态管理

    记录开发中关于mobx使用 问题1: mobx不更新视图,状态更改数据后不触发render发现是版本问题,在mob...

  • 初识 MobX + React-Native + React R

    MobX 简单、可扩展的状态管理(可观察的数据) 使用: 安装: npm install mobx --save。...

  • mobx入门及基本实例

    React 和 Mobx 关系 React 和 MobX 相辅相成,相互合作。React 通过提供机制把应用状态转...

  • 前端框架

    MobX:MobX 和 React 十分钟快速入门 MobX 是一种简单的、可扩展的、久经考验的状态管理解决方案。...

网友评论

    本文标题:使用Mobx来简化React项目中的状态管理

    本文链接:https://www.haomeiwen.com/subject/rblsattx.html