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

news2024/9/22 23:37:13

目录

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

// package.json
{
  "name": "react-mobx-demo",
  "version": "1.0.0",
  "description": "react mobx feature",
  "main": "index.js",
  "scripts": {
    "start": "webpack-dev-server --hot --color --progress --host localhost --config webpack.config.js --env.dev",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/luzuoquan/react-mobx-demo.git"
  },
  "keywords": [
    "react",
    "mobx"
  ],
  "author": "luzuoquan",
  "license": "MIT",
  "bugs": {
    "url": "https://github.com/luzuoquan/react-mobx-demo/issues"
  },
  "homepage": "https://github.com/luzuoquan/react-mobx-demo#readme",
  "devDependencies": {
    "@babel/cli": "^7.8.4",
    "@babel/core": "^7.9.6",
    "@babel/plugin-proposal-class-properties": "^7.8.3",
    "@babel/plugin-proposal-decorators": "^7.8.3",
    "@babel/plugin-proposal-export-default-from": "^7.8.3",
    "@babel/plugin-transform-runtime": "^7.9.6",
    "@babel/preset-env": "^7.9.6",
    "@babel/preset-react": "^7.9.4",
    "babel-eslint": "^10.1.0",
    "babel-loader": "^8.1.0",
    "eslint": "6.8.0",
    "eslint-config-airbnb": "^18.1.0",
    "eslint-import-resolver-webpack": "^0.12.1",
    "eslint-plugin-import": "^2.20.2",
    "eslint-plugin-jsx-a11y": "^6.2.3",
    "eslint-plugin-react": "^7.20.0",
    "eslint-plugin-react-hooks": "3",
    "html-webpack-plugin": "^4.3.0",
    "webpack": "^4.43.0",
    "webpack-cli": "^3.3.11",
    "webpack-dev-server": "^3.11.0"
  },
  "dependencies": {
    "@babel/runtime": "^7.9.6",
    "core-js": "3",
    // mobx
    "mobx": "^5.15.4",
    "mobx-react": "^6.2.2",
    // 类型规划
    "prop-types": "^15.7.2",
    // react
    "react": "^16.13.1",
    "react-dom": "^16.13.1",
    // router
    "react-router": "^5.2.0",
    "react-router-dom": "^5.2.0",
    "regenerator-runtime": "^0.13.5",
    "whatwg-fetch": "^3.0.0"
  }
}

@/src/routes/index.jsx

import React from 'react';
import {
  BrowserRouter,
  Route,
  Switch,
} from 'react-router-dom';
import Home from '@/containers/home';
export default function () {
  return (
    <BrowserRouter>
      <Switch>
        <Route exact path="/" component={Home} />
      </Switch>
    </BrowserRouter>
  );
}

@/src/app.jsx

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

@/src/index.jsx

import React from 'react';
import { render } from 'react-dom';
// 全局变量注入
import { Provider } from 'mobx-react';
// 全局store
import store from './models';
import App from './app';
render(
  <Provider {...store}>
    <App />
  </Provider>,
  document.querySelector('#app')
);

@/src/models/home/index.js

import { observable, action } from 'mobx';
export class HomeInfo {
  @observable name = '云课堂';
  @action
  updateName = (params) => {
    // Mobx中可以直接修改
    this.name = params;
  };
}
export default new HomeInfo();

@/src/models/index.js

import homeInfo from './home';
export default {
  homeInfo,
};

@/src/containers/home/index.jsx

import { observer, inject } from 'mobx-react';
import React, { Component } from 'react';
import PropTypes from 'prop-types';
// 全局变量注入
@inject('homeInfo')
// 关联组件
@observer
export default class Home extends Component {
  static propTypes = {
    homeInfo: PropTypes.objectOf(PropTypes.object),
  };
  static defaultProps = {
    homeInfo: {},
  };
  handleClick = () => {
    const {
      homeInfo: { updateName },
    } = this.props;
    updateName('Mobx接入实战 - 云课堂');
  };
  render() {
    const {
      homeInfo: { name },
    } = this.props;
    return (
      <div className='mobx'>
        <p>{name}</p>
        <button type='button' onClick={this.handleClick}>
          更改
        </button>
      </div>
    );
  }
}

Mobx VS Redux

Mobx:适合小而简单的工程

Redux:适合大型应用

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1080102.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RabbitMQ之延迟队列解读

目录 基本介绍 概述 为什么需要引进RabbitMQ延迟队列 应用场景 springboot代码实战 实战架构 工程概述 RabbitConfigDeal 配置类&#xff1a;创建队列及交换机并进行绑定 MessageService业务类&#xff1a;发送消息及接收消息 主启动类RabbitMq01Application&#xff1…

2023年中国医院信息系统发展现状及行业市场规模分析[图]

医院信息系统&#xff0c;亦称“医院管理信息系统”&#xff08;简称HIS&#xff09;&#xff0c;是指利用计算机软硬件技术、网络通信技术等现代化手段&#xff0c;对医院及其所属各部门的人流、物流、财流进行综合管理&#xff0c;对在医疗活动各阶段产生的数据进行采集储存、…

Lab 1: Unix utilities汇总

这个实验主要学习了常用的一些系统调用。 Lab 1: Unix utilities Boot xv6 (easy) git克隆&#xff0c;切换分支&#xff0c;qemu。根据要求进行操作即可。 $ git clone git://g.csail.mit.edu/xv6-labs-2020 $ cd xv6-labs-2020 $ git checkout util $ make qemusleep (ea…

分享一下花店制作微信小程序的步骤是什么

一、准备阶段 在准备阶段&#xff0c;花店需要完成以下任务&#xff1a; 注册微信公众平台账号&#xff1a;首先&#xff0c;花店需要注册一个微信公众平台账号&#xff0c;这个账号将用于创建和管理微信小程序。 确定小程序的功能和需求&#xff1a;花店需要根据自身的业务需…

RISC-V架构 | 飞凌嵌入式FET7110-C国产高性能核心板现货发售!

RISC-V凭借其完全开源免费且可自由修改的特性而备受国内厂商的追捧&#xff0c;在此背景下&#xff0c;飞凌嵌入式联合RISC-V国产处理器厂商赛昉科技(StarFive)基于昉惊鸿7110处理器共同推出FET7110-C核心板。 现在&#xff0c;飞凌嵌入式FET7110-C核心板&#xff08;商业级&a…

2023.10月网络优化项目实战

基础配置 sw2 <Huawei>sy Enter system view, return user view with Ctrl+Z. [Huawei]sy sw2 [sw2]vlan batch 10 20 Info: This operation may take a few seconds. Please wait for a moment...done.[sw2]int e0/0/1 [sw2-Ethernet0/0/1]port link-type access [s…

第十章-输入输出系统

Ⅰ.锁 本质是互斥操作 原因&#xff1a;针对公共资源访问时&#xff0c;临界区若不加以互斥限制&#xff0c;可能导致执行过程中突然的中断导致出现异常。 1.互斥过程 设定互斥量M为二值信号量&#xff0c;0/1&#xff0c;P-&#xff0c;V&#xff0c;现有两个进程A、B共同…

大数据flink篇之三-flink运行环境安装(一)单机Standalone安装

一、安装包下载地址 https://archive.apache.org/dist/flink/flink-1.15.0/ 二、安装配置流程 前提基础&#xff1a;Centos环境&#xff08;建议7以上&#xff09; 安装命令&#xff1a; 解压&#xff1a;tar -zxvf flink-xxxx.tar.gz 修改配置conf/flink-conf.yaml&#xff1…

最新AI创作系统源码ChatGPT网站源码/支持Midjourney,AI绘画/支持OpenAI GPT全模型+国内AI全模型

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…

RxJava介绍及基本原理

随着互联网的迅猛发展&#xff0c;Java已成为最广泛应用于后端开发的语言之一。而在处理异步操作和事件驱动编程方面&#xff0c;传统的Java多线程并不总是最佳选择。这时候&#xff0c;RxJava作为一个基于观察者模式、函数式编程和响应式编程理念的库&#xff0c;为我们提供了…

【Nuget】程序包源

程序包源地址(部分) Azure 中国区的官方 NuGet 程序包源地址 https://nuget.cdn.azure.cn/v3/index.json 官方 NuGet 程序包源地址 V2 https://www.nuget.org/api/v2 官方 NuGet 程序包源地址 V3 https://api.nuget.org/v3/index.json MyGet 上 Eto.Forms 框架的程序包源地址 h…

杨冰:分布式数据库助力企业数实融合,跨越数字化转型深水区

近日&#xff0c;2023 inclusion外滩大会在上海黄浦世博园区举办。由赛迪顾问与 OceanBase 联合主办的外滩大会“分布式数据库助力数实融合”见解论坛圆满落幕。 会上&#xff0c;OceanBase CEO 杨冰发表了《分布式数据库助力企业数实融合&#xff0c;跨越数字化转型深水区》的…

一个完整的初学者指南Django-part1

源自&#xff1a;https://simpleisbetterthancomplex.com/series/2017/09/04/a-complete-beginners-guide-to-django-part-1.html 一个完整的初学者指南Django - 第1部分 介绍 今天我将开始一个关于 Django 基础知识的新系列教程。这是一个完整的 Django 初学者指南。材料分为七…

mysql面试题38:count(1)、count(*) 与 count(列名) 的区别

该文章专注于面试&#xff0c;面试只要回答关键点即可&#xff0c;不需要对框架有非常深入的回答&#xff0c;如果你想应付面试&#xff0c;是足够了&#xff0c;抓住关键点 面试官&#xff1a; count(1)、count(*) 与 count(列名) 的区别 当使用COUNT函数进行数据统计时&…

echarts折线图(其他图也是一样)设置tooltip自动滚动

按顺序自动滚动效果 <div class"leftComp-charts" id"chartsBox"></div>chartsData: {roadNorm: [],time: []},eChartsTimer: nullinitChartsBox() {this.option {tooltip: {trigger: "axis",axisPointer: {// 方法一type: "s…

2023年中国稻谷加工机械分类、市场规模及发展前景分析[图]

稻谷加工机械设备主要包括砻谷机、碾米机、抛光机、碎米机和砻糠机&#xff1b;通过物理和机械方式将稻谷加工成可供人们食用的大米&#xff0c;同时还可以提取出一些有价值的副产品&#xff0c;如砻糠可以用作饲料。 稻谷加工机械制造行业分类 资料来源&#xff1a;共研产业咨…

设计模式-相关内容

文章目录 一、设计模式概述二、UML图1.类的表示方法2.类与类之间关系的表示方法(1)关联关系(2)聚合关系(3)组合关系(4)依赖关系(5)继承关系(6)实现关系 三、软件设计原则1.开闭原则2.里氏代换原则3.依赖倒转原则4.接口隔离原则5.合成复用原则6.迪米特法则 一、设计模式概述 创…

集群分发脚本xysnc

一、scp&#xff08;secure copy&#xff09; 安全拷贝 1.定义 scp&#xff08;Secure Copy&#xff09;是一个用于在不同计算机之间安全地复制文件和目录的命令行工具。它使用 SSH 协议进行连接和文件传输&#xff0c;提供了加密和身份验证机制&#xff0c;确保数据传输的安…

Android 项目增加 res配置

main.res.srcDirs "src/main/res_test" build->android->sourceSets

从裸机启动开始运行一个C++程序(七)

前序文章请看&#xff1a; 从裸机启动开始运行一个C程序&#xff08;六&#xff09; 从裸机启动开始运行一个C程序&#xff08;五&#xff09; 从裸机启动开始运行一个C程序&#xff08;四&#xff09; 从裸机启动开始运行一个C程序&#xff08;三&#xff09; 从裸机启动开始运…