zoukankan      html  css  js  c++  java
  • 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);
    

     

  • 相关阅读:
    redis-hash
    redis-list操作
    bootstrap之消息提示
    jQuery水平下拉菜单实现
    JavaScript的Date对象
    积水问题
    Queue的push和front操作
    Stack的pop和push操作
    .py文件不能设置默认打开程序 win10
    Anaconda的安装
  • 原文地址:https://www.cnblogs.com/qq735675958/p/14736110.html
Copyright © 2011-2022 走看看