美文网首页
create-react-app MobX

create-react-app MobX

作者: 天涯笑笑生 | 来源:发表于2018-07-09 14:19 被阅读0次

    一、安装

    注:react及其他使用create-react-app(据说业界最优秀)
    注:create-react-app 已经使用npm全局安装

    • 创建react应用,执行成功后进入项目目录
    create-react-app mobx-demo
    cd mobx-demo
    

    注:或webstorm 直接打开


    react应用目录
    • 检验是否成功,出现react 的icon说明成功
    npm start
    
    react 访问
    • 安装mobx以及React 绑定库
    npm install mobx --save
    npm install mobx-react --save
    
    package.json

    二、简单使用

    注:应用变成响应式,按照文档中的三步走战略,状态管理最简单的例子基本都是定时器定时更新,详细的可以看官网文档(想直接看到效果的可以忽略下面三步走战略,文章最后有实现源码)
    Mobx 链接
    (一)定义状态并使其可观察

    import {observable} from 'mobx';
    var appState = observable({
       timer:0
    });
    

    (二)创建视图以响应状态的变化

    import {observer} from 'mobx-react';
    
    @observer
    class TimerView extends React.Component {
        render() {
            return (<button onClick={this.onReset.bind(this)}>
                    Seconds passed: {this.props.appState.timer}
                </button>);
        }
    
        onReset () {
            this.props.appState.resetTimer();
        }
    };
    
    ReactDOM.render(<TimerView appState={appState} />, document.body);
    

    (三)更改状态

    appState.resetTimer = action(function reset() {
        appState.timer = 0;
    });
    
    setInterval(action(function tick() {
        appState.timer += 1;
    }), 1000);
    

    执行npm start,报错。
    注意@observe,create-react-app是没有内置的装饰器支持,详见
    如何(不)使用装饰器
    解决办法:
    刚开始想直接使用eject命令,但一直报错Remove untracked files, stash or commit any changes, and try again.,最后在Stack Overflow上找到两种解决方案,但是都未解决,所以最终选择react-app-rewired的方式
    GitHub:
    react-app-rewired
    react-app-rewire-mobx

    • 下载安装所需包
    npm install react-app-rewired --save-dev
    npm install react-app-rewire-mobx --save
    
    • 修改package.json
    {
      "name": "mobx-demo",
      "version": "0.1.0",
      "private": true,
      "dependencies": {
        "mobx": "^5.0.3",
        "mobx-react": "^5.2.3",
        "react": "^16.4.1",
        "react-app-rewire-mobx": "^1.0.8",
        "react-dom": "^16.4.1",
        "react-scripts": "1.1.4"
      },
      "scripts": {
        "start": "react-app-rewired start",
        "build": "react-app-rewired build",
        "test": "react-app-rewired test --env=jsdom",
        "eject": "react-scripts eject"
      },
      "devDependencies": {
        "react-app-rewired": "^1.5.2"
      }
    }
    
    • 在项目根目录下新建config-overrides.js
      工程目录

    config-overrides.js file

    const rewireMobX = require('react-app-rewire-mobx');
    
    module.exports = function override(config, env) {
    
        // use the MobX rewire
        config = rewireMobX(config, env);
    
        return config;
    }
    
    • 运行npm start
      运行结果

    随着时间按秒递增,点击会重置

    三、源码

    为了方便,直接在App.js文件中修改了下,实际中应该在

    import React, { Component } from 'react';
    import logo from './logo.svg';
    import './App.css';
    
    import {observable} from 'mobx';
    import {observer} from 'mobx-react';
    
    //1.定义状态
    var appState = observable({
        timer: 0
    });
    
    //2.创建视图
    @observer
    class TimerView extends React.Component {
        render() {
            return (<button onClick={this.onReset.bind(this)}>
                Seconds passed: {this.props.appState.timer}
            </button>);
        }
    
        onReset () {
            this.props.appState.resetTimer();
        }
    };
    
    //3.更改状态
    appState.resetTimer = () => {
        appState.timer = 0;
    };
    
    setInterval(()=>{
        appState.timer += 1;
    }, 1000);
    
    class App extends Component {
      render() {
        return (
          <div className="App">
              <TimerView appState={appState} />
          </div>
        );
      }
    }
    
    export default App;
    
    

    相关文章

      网友评论

          本文标题:create-react-app MobX

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