6

本文信息

  • 本文创建于2018/03/07
  • 2018/03/20 更新 -- 统一管理store

mobx简介与使用

一直以来,redux是react事实上的状态管理工具,直到mobx横空出世。从此,多了一个选择。关于mobx与redux的异同,网上有很多文章介绍,本文中不再叙述了。本文主要介绍react与mobx搭配使用,当然,有时间我也许会写一个react与redux搭配使用的示例教程。

作为一个功能强大的状态管理工具,mobx上手确是十分简单。我们知道,redux强调单一数据来源,即单一store。然而,在大型应用时,单一store往往带来管理不便的问题。相对而言,mobx并不推崇单一store。我们可以对每一个路由组件构建一个store。当然,也可以构建一个全局的store,服务于所有组件。全局store与局部store是可以完全搭配使用的。

本文以局部store为例说明:

// Home/Store.tsx
import { observable, action } from 'mobx';

class Store {

  // 定义数据
  @observable title: string = '';

  // 改变数据
  @action loadTitle = () => {
    this.title = 'Welcome to home page !';
  }

  // 实例化
  static init() {
    return new Store();
  }
}

export default Store;
// Home/Home.tsx
import * as React from 'react';
import { observer } from 'mobx-react';
import Store from './Store';

@observer
class Home extends React.Component<{}, {}> {

  store: any;

  componentDidMount(): void {
    this.store = Store.init();
    const { loadTitle } = this.store;
    loadTitle();
  }

  render() {
    const { title } = this.store;
    return (<p>{title}</p >);
  }

}

export default Home;

统一管理store

随着应用的增大,如果在每个组件目录下建立对应的store,难免难以维护。因此,统一管理store是一个较好的选择。

在根目录下简历stores目录,作为存放store的仓库,所有的store都放在这里。

在入口文件index.tsx:

// index.tsx
...
import { Provider } from 'mobx-react';
import rootStore from './stores/RootStore';
import homeStore from './stores/HomeStore';
...

const stores = {
  rootStore,
  homeStore
};

ReactDOM.render(
  <Provider {...stores}>
    <Router basename={process.env.PUBLIC_URL}>
      <App />
    </Router>
  </Provider>,
  document.getElementById('root') as HTMLElement
);

在需要使用到store的组件:

// /Home/index.tsx
...
import { observer, inject } from 'mobx-react';
import { HomeStore } from '../stores/HomeStore';
import { RootStore } from '../stores/RootStore';
...

interface Props {
  homeStore: HomeStore;
  rootStore: RootStore;
}

@inject('rootStore')
@inject('homeStore')
@observer
class HomeComponent extends React.Component<Props, {}> {
  ...
  render() {
    return (
      <div>
        <h1 className={styles.title}>{this.props.homeStore.title}</h1>
        <p>{this.props.rootStore.title}</p>
      </div>
    );
  }
}

这样,就完成了mobx与react的搭配使用。当然,这只是最初级的用法。mobx还有更多强大功能,想进一步了解的,可以去mobx官网查看它的文档。本文旨在介绍mobx结合react的基本用法,不做过多深入。当然,如果服务端渲染时,如何再搭配mobx,则会复杂一些。这个,我会在后面的服务端渲染的文章中提到。

至此,状态管理(mobx)的内容完毕。


react扬帆启航专栏分享的时我个人学习与实践react过程中的一些历程,希望借此专栏与大家共同探讨react相关的技术,以求进步。


vdfor
100 声望9 粉丝

大前端