状态管理最佳实践

JUI使用Mobx作为状态管理,其简单、可扩展的特性结合JUI组件化架构,让复杂的应用状态管理变得简洁和高效。

JUI默认已集成mobx、mobx-react。

1、定义状态并使其可观察

可以用任何你喜欢的数据结构来存储状态,如对象、数组、类。 循环数据结构、引用等。 只要确保所有会随时间流逝而改变的属性打上 mobx 的标记使它们变得可观察即可。

// store.js

import { observable, action } from 'mobx'

class DemoStep {
  //定义状态并使其可观察
  @observable step = {
    payAccount: '',
    receiverAccount: '',
    receiverName: '',
    amount: '',
  }

  //定义动作更改状态
  @action setStep = (values) => {
    this.step = Object.assign(this.step, values)
  }
}

export default {
  DemoStep: new DemoStep()
}

2、使用Provider传递store给组件

使用 React 的context机制来传递 store 给子组件。

import React, { Fragment, Component } from 'react'

//注入store
import { Provider } from 'mobx-react' 
import store from './store'

export default class demoStore extends Component {
  render() {
    return (
      <Provider {...store}>
        <Fragment>
          ...
        </Fragment>
      </Provider>
    )
  }
}

3、创建视图以响应状态的变化

observer 函数/装饰器可以用来将 React 组件转变成响应式组件。 它用 mobx.autorun 包装了组件的 render 函数以确保任何组件渲染中使用的数据变化时都可以强制刷新组件。 observer 是由单独的 mobx-react 包提供的。

import React, { Fragment, Component } from 'react';
import { observer } from 'mobx-react';

@observer class DemoGetStore extends Component {
  render() {
    const { DemoStep } = this.props;
    console.log(DemoStep.step) // 获取状态值
    return (
      <Fragment>
        ...
      </Fragment>
    );
  }
}

export default DemoGetStore

当 observer 需要组合其它装饰器或高阶组件时,请确保 observer 是最深处(第一个应用)的装饰器,否则它可能什么都不做。

4、使用 inject 将组件连接到提供的 stores

相当于Provider 的高阶组件。可以用来从 React 的context中挑选 store 作为 prop 传递给目标组件。

import React, { Fragment, Component } from 'react';
import { observer, inject } from 'mobx-react';

@inject('DemoStep') @observer class DemoGetStore extends Component {
  render() {
    const { DemoStep } = this.props;
    console.log(DemoStep.step) // 获取状态值

    //设置状态值
    DemoStep.setStep({
      payAccount: '',
      receiverAccount: '',
      receiverName: '',
      amount: '',
    })

    return (
      <Fragment>
        ...
      </Fragment>
    );
  }
}

export default DemoGetStore

当 store 中相关数据发生改变时视图会自动更新,以一种最小限度的方式来更新视图。 可以节省大量的样板文件,并且有着令人匪夷所思的高效。