• React 状态管理 - Mobx 入门(下)接入实战


    目录

    Mobx接入实战

    Mobx构造复杂应用需要注意的

    Mobx5 Or Mobx4

    Mobx5

    Mobx4

    @/package.json

    @/src/routes/index.jsx

    @/src/app.jsx

    @/src/index.jsx

    @/src/models/home/index.js

    @/src/models/index.js

    @/src/containers/home/index.jsx

    Mobx VS Redux


    Mobx接入实战

    对状态变更更为细腻,Mobx更适合局部场景

    Mobx构造复杂应用需要注意的

    1. Store单例:Store状态全局管理是解决复杂应用的标配
    2. 状态跨组件:跨组件传递可以通过Provider传递
    3. 拆分局部状态:Mobx的特性可以使一些局部状态在当前组件完成
    4. 清理autorun:componentWillUnmount中执行autorun返回的函数

    Mobx5 Or Mobx4

    Mobx5

    • Mobx5内部实现对象observable的核心是基于ES6的proxy。
    • 而目前proxy没有对应的polyfill。所以只能运行在现代浏览器(Edge可以)上。
    Mobx4

    • Mobx4内部实现对象observable的核心是基于Object.defineProperty。
    • Observable数组并非真正的数组,其继承自对象。所以与普通的数组对象及某些行为不一样。

    @/package.json

    1. // package.json
    2. {
    3.   "name": "react-mobx-demo",
    4.   "version": "1.0.0",
    5.   "description": "react mobx feature",
    6.   "main": "index.js",
    7.   "scripts": {
    8.     "start": "webpack-dev-server --hot --color --progress --host localhost --config webpack.config.js --env.dev",
    9.     "test": "echo \"Error: no test specified\" && exit 1"
    10.   },
    11.   "repository": {
    12.     "type": "git",
    13.     "url": "git+https://github.com/luzuoquan/react-mobx-demo.git"
    14.   },
    15.   "keywords": [
    16.     "react",
    17.     "mobx"
    18.   ],
    19.   "author": "luzuoquan",
    20.   "license": "MIT",
    21.   "bugs": {
    22.     "url": "https://github.com/luzuoquan/react-mobx-demo/issues"
    23.   },
    24.   "homepage": "https://github.com/luzuoquan/react-mobx-demo#readme",
    25.   "devDependencies": {
    26.     "@babel/cli": "^7.8.4",
    27.     "@babel/core": "^7.9.6",
    28.     "@babel/plugin-proposal-class-properties": "^7.8.3",
    29.     "@babel/plugin-proposal-decorators": "^7.8.3",
    30.     "@babel/plugin-proposal-export-default-from": "^7.8.3",
    31.     "@babel/plugin-transform-runtime": "^7.9.6",
    32.     "@babel/preset-env": "^7.9.6",
    33.     "@babel/preset-react": "^7.9.4",
    34.     "babel-eslint": "^10.1.0",
    35.     "babel-loader": "^8.1.0",
    36.     "eslint": "6.8.0",
    37.     "eslint-config-airbnb": "^18.1.0",
    38.     "eslint-import-resolver-webpack": "^0.12.1",
    39.     "eslint-plugin-import": "^2.20.2",
    40.     "eslint-plugin-jsx-a11y": "^6.2.3",
    41.     "eslint-plugin-react": "^7.20.0",
    42.     "eslint-plugin-react-hooks": "3",
    43.     "html-webpack-plugin": "^4.3.0",
    44.     "webpack": "^4.43.0",
    45.     "webpack-cli": "^3.3.11",
    46.     "webpack-dev-server": "^3.11.0"
    47.   },
    48.   "dependencies": {
    49.     "@babel/runtime": "^7.9.6",
    50.     "core-js": "3",
    51. // mobx
    52.     "mobx": "^5.15.4",
    53.     "mobx-react": "^6.2.2",
    54. // 类型规划
    55.     "prop-types": "^15.7.2",
    56. // react
    57.     "react": "^16.13.1",
    58.     "react-dom": "^16.13.1",
    59. // router
    60.     "react-router": "^5.2.0",
    61.     "react-router-dom": "^5.2.0",
    62.     "regenerator-runtime": "^0.13.5",
    63.     "whatwg-fetch": "^3.0.0"
    64.   }
    65. }

    @/src/routes/index.jsx

    1. import React from 'react';
    2. import {
    3.   BrowserRouter,
    4.   Route,
    5.   Switch,
    6. } from 'react-router-dom';
    7. import Home from '@/containers/home';
    8. export default function () {
    9.   return (
    10.     <BrowserRouter>
    11.       <Switch>
    12.         <Route exact path="/" component={Home} />
    13.       Switch>
    14.     BrowserRouter>
    15.   );
    16. }

    @/src/app.jsx

    1. import React from 'react';
    2. import Routes from '@/routes';
    3. export default () => <Routes />;

    @/src/index.jsx

    1. import React from 'react';
    2. import { render } from 'react-dom';
    3. // 全局变量注入
    4. import { Provider } from 'mobx-react';
    5. // 全局store
    6. import store from './models';
    7. import App from './app';
    8. render(
    9.   <Provider {...store}>
    10.     <App />
    11.   Provider>,
    12.   document.querySelector('#app')
    13. );

    @/src/models/home/index.js

    1. import { observable, action } from 'mobx';
    2. export class HomeInfo {
    3.   @observable name = '云课堂';
    4.   @action
    5.   updateName = (params) => {
    6.     // Mobx中可以直接修改
    7.     this.name = params;
    8.   };
    9. }
    10. export default new HomeInfo();

    @/src/models/index.js

    1. import homeInfo from './home';
    2. export default {
    3.   homeInfo,
    4. };

    @/src/containers/home/index.jsx

    1. import { observer, inject } from 'mobx-react';
    2. import React, { Component } from 'react';
    3. import PropTypes from 'prop-types';
    4. // 全局变量注入
    5. @inject('homeInfo')
    6. // 关联组件
    7. @observer
    8. export default class Home extends Component {
    9.   static propTypes = {
    10.     homeInfo: PropTypes.objectOf(PropTypes.object),
    11.   };
    12.   static defaultProps = {
    13.     homeInfo: {},
    14.   };
    15.   handleClick = () => {
    16.     const {
    17.       homeInfo: { updateName },
    18.     } = this.props;
    19.     updateName('Mobx接入实战 - 云课堂');
    20.   };
    21.   render() {
    22.     const {
    23.       homeInfo: { name },
    24.     } = this.props;
    25.     return (
    26.       <div className='mobx'>
    27.         <p>{name}p>
    28.         <button type='button' onClick={this.handleClick}>
    29.           更改
    30.         button>
    31.       div>
    32.     );
    33.   }
    34. }

    Mobx VS Redux

    Mobx:适合小而简单的工程

    Redux:适合大型应用

     

  • 相关阅读:
    Juc并发编程学习笔记---狂神说(全)
    安装linux子系统以及配置环境
    linux--LVS负载均衡 DR模式 rr
    Python 3 正则表达式
    【iOS】—— 系统手势操作
    分享:金融短信接口应用场景详解
    《代码大全2》第1章 欢迎进入软件构建的世界
    Linux下protobuf和 protobuf-c安装使用
    Yolov5系列(一)——网络可视化工具netron
    机器学习6——EM算法与高斯混合模型GMM
  • 原文地址:https://blog.csdn.net/qq_35729091/article/details/133697438