• react17 hooks 使用 mobx 记录


    1. 使用 

    # 全局安装
    npm install -g create-react-app
    # 构建一个my-app的项目
    npx create-react-app my-app
    cd my-app
    
    # 启动编译当前的React项目,并自动打开 http://localhost:3000/
    npm start
    

    2. 安装 mobx  

    yarn add mobx mobx-react 

    3. 由于 react 不支持最新的装饰器写法 需要如下操作

    Support for the experimental syntax 'decorators-legacy' isn't currently enabled

    npm install  customize-cra react-app-rewired @babel/plugin-proposal-decorators --save
    

      

    项目根目录新建config-overrides.js文件加入以下代码:
    
    
    const { override, addDecoratorsLegacy } = require('customize-cra');
    module.exports = override(
     addDecoratorsLegacy()
    );

    修改package.json文件如下:

    "scripts": {
     "start": "react-app-rewired start",
     "build": "react-app-rewired build",
     "test": "react-app-rewired test",
     "eject": "react-app-rewired eject"
    },
    4. 

     5. 新建 store 目录

    6. 新建 模块文件

    store

      -- aboutStore.js

      -- index.js

      --  newsStore.js

    ababoutStore.js
    
    import { action, observable , makeAutoObservable} from 'mobx';
    
    class AboutStore {
      constructor(){
        makeAutoObservable(this)
      }
      @observable
      abouts = '123'
    
      @observable
      numbers = 1
      
      @action
      setAbout = (abouts) => {
        this.abouts = abouts
      }
    
      @action
      setNumbers = () => {
        this.numbers++
      }
    }
    
    const aboutStore = new AboutStore();
    
    export default aboutStore;
    

      

    newsStore.js
    
    
    import { action, observable , makeAutoObservable} from 'mobx';
    
    class NewsStore {
      constructor(){
        makeAutoObservable(this)
      }
      
      @observable
      news = '重要新闻'
      
      @action
      setNews = (news) => {
        this.news = news
      }
    }
    
    const newsStore = new NewsStore();
    
    export default newsStore;
    

      

    index.js 
    
    /* eslint-disable import/no-anonymous-default-export */
    import aboutStore from './aboutStore'
    import newsStore from './newsStore'
    
    
    export default {
        aboutStore,
        newsStore
    }
    

      

    入口 index.js
    
    import React from 'react';
    import ReactDOM from 'react-dom';
    import './index.css';
    import App from './App';
    import { Provider } from "mobx-react"
    import stores from './store'
    // import reportWebVitals from './reportWebVitals';
    
    ReactDOM.render(
        <Provider {...stores}>
          <App />
        </Provider>,
      document.getElementById('root')
    );
    
    

      

    app.js
    
    import './App.css';
    import { Observer,observer,useLocalObservable} from 'mobx-react';
    import store from './store'
    
    
    const App = () => {
        const localStore = useLocalObservable(() => store);
        const { aboutStore,newsStore}  = localStore
        return <Observer>{
          () => <div>
            <div>{aboutStore.abouts}</div> 
            <p style={{cursor:'pointer'}} onClick={ () =>  aboutStore.setAbout('哈哈哈')}>改变about</p>
            <p>{aboutStore.numbers}</p>
            <button onClick = { aboutStore.setNumbers }>add</button>
            <hr/>
            <h2>{newsStore.news}</h2>
            <button onClick={() => newsStore.setNews('非重要新闻') }>改变标题</button>
          </div>
        }</Observer>
    }
    
    
    export default observer(App);
    

     

  • 相关阅读:
    BZOJ3752 : Hack
    XIV Open Cup named after E.V. Pankratiev. GP of SPb
    XIII Open Cup named after E.V. Pankratiev. GP of Ukraine
    BZOJ2087 : [Poi2010]Sheep
    BZOJ2080 : [Poi2010]Railway
    BZOJ2082 : [Poi2010]Divine divisor
    Moscow Pre-Finals Workshop 2016. National Taiwan U Selection
    XIII Open Cup named after E.V. Pankratiev. GP of Asia and South Caucasus
    XIII Open Cup named after E.V. Pankratiev. GP of Azov Sea
    XIII Open Cup named after E.V. Pankratiev. GP of SPb
  • 原文地址:https://www.cnblogs.com/qq735675958/p/14736110.html
Copyright © 2020-2023  润新知