【实例】React 状态管理库 MobX Redux 入门及对比

news2024/9/21 20:12:48

在这里插入图片描述

上一篇:【实例】React 组件传值方法: Props、回调函数、Context、路由传参

MobX

MobX 是一个状态管理库,它提供了一种响应式的数据流方案,使得状态的变化能够自动地反映到相关的组件中。
MobX 的核心理念是可观察的状态(Observable State)和响应式行为(Reactive Behavior)。将状态标记为可观察的后,MobX 可以自动跟踪状态的变化,并且在状态发生变化时自动通知相关的组件进行更新。

概念

  1. State(状态)
    状态 是驱动应用的数据。通常有像待办事项列表这样的业务数据状态,还有像当前已选元素的视图状态。

  2. action(动作)
    动作 是改变状态的代码。用户事件、后端数据推送、预定事件、等等。
    在 MobX 中可以显式地定义动作,它可以帮你把代码组织的更清晰。如果是在严格模式下使用 MobX 的话,MobX 会强制只有在动作之中才可以修改状态。

  3. Derivations(衍生)
    任何源自状态并且不会再有任何进一步的相互作用的东西就是衍生。MobX 区分了两种类型的衍生:
    Computed values(计算值): 它们是永远可以使用纯函数从当前可观察状态中衍生出的值。黄金法则: 如果你想创建一个基于当前状态的值时,请使用 computed。(所有的计算值都应该是纯净的。它们不应该用来改变状态)
    Reactions(反应): Reactions 是当状态改变时需要自动发生的副作用。

原则

MobX 支持单向数据流,也就是动作改变状态,而状态的改变会更新所有受影响的视图。
在这里插入图片描述

例子

MobX 将一个应用变成响应式的可归纳为以下三个步骤:

  1. 定义状态并使其可观察
    可以用任何你喜欢的数据结构来存储状态,如对象、数组、类。循环数据结构、引用都可以。只要确保所有会随时间流逝而改变的属性打上 mobx 的标记使它们变得可观察即可。
import {observable} from 'mobx';

var appState = observable({
    timer: 0
});
  1. 创建视图以响应状态的变化
    用 observer 来定义观察者组件。
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);
  1. 更改状态
    只有在严格模式(默认是不启用)下更新被观察的状态才需要 action 包装。 建议使用 action,因为它将帮助你更好地组织应用,并表达出一个函数修改状态的意图。 同时,它还自动应用事务以获得最佳性能。
appState.resetTimer = action(function reset() {
    appState.timer = 0;
});

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

Redux

在这里插入图片描述

在 Redux 中,所有的状态被保存在 store 状态树中(一个应用程序中只能有一个)。任何组件都可以直接从 store 中访问特定对象的状态。如果要更改状态,需要分发一个 action,分发在这里意味着将可执行信息发送到 store,然后 store 将 action 代理给相关的 reducer。reducer是一个纯函数,它可以查看之前的状态,执行一个 action 并且返回一个新的状态。

例子

App.js 是应用程序的入口文件。使用 Provider 组件包裹整个应用程序,并传递 Redux store 作为属性。这样,应用程序中的所有组件都能够访问 Redux store 中的状态和动作。

// src/App.js
import React from 'react';
import Counter from './components/Counter';
import { Provider } from 'react-redux';
import store from './store';

function App() {
  return (
    <Provider store={store}>
      <div>
        <h1>React Redux Counter App</h1>
        <Counter />
      </div>
    </Provider>
  );
}

export default App;

在组件里使用 useSelector 钩子从 Redux store 中获取状态,并使用 useDispatch 钩子获取 dispatch 函数用于分发动作。

// src/components/Counter.js
import React from 'react';
import { useSelector, useDispatch } from 'react-redux';
import { increment, decrement } from '../actions';

function Counter() {
  const counter = useSelector(state => state);
  const dispatch = useDispatch();

  return (
    <div>
      <h1>Counter: {counter}</h1>
      <button onClick={() => dispatch(increment())}>Increment</button>
      <button onClick={() => dispatch(decrement())}>Decrement</button>
    </div>
  );
}

export default Counter;

action 文件定义了两个动作创建函数 increment 和 decrement。这些动作创建函数用于创建描述动作的对象,并且这些对象包含一个 type 属性,指示要执行的动作类型。然后定义 reducer,Reducer 函数接收两个参数:当前状态(state)和要执行的动作(action)。根据不同的动作类型,它会返回一个新的状态。创建 redux store,将 reducer 作为参数传进去。

// src/actions/index.js
export const increment = () => {
  return {
    type: 'INCREMENT'
  };
};

export const decrement = () => {
  return {
    type: 'DECREMENT'
  };
};


// src/reducers/index.js
const counterReducer = (state = 0, action) => {
  switch (action.type) {
    case 'INCREMENT':
      return state + 1;
    case 'DECREMENT':
      return state - 1;
    default:
      return state;
  }
};

export default counterReducer;


// src/store/index.js
import { createStore } from 'redux';
import counterReducer from '../reducers';

const store = createStore(counterReducer);

export default store;

对比

Redux 强调不可变性和可预测性,而 MobX 更灵活,也少很多模版代码,状态的自动追踪和更新也使开发更方便。但是优点也同时可能是缺点,太灵活对于讲究严格的大型应用可能会有问题。但是私以为只要组织的好,规范代码结构,用 MobX 也挺严谨的。
一张很多地方看到的对比图
在这里插入图片描述

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

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

相关文章

一种基于约化因子上三角矩阵求逆方法与MATLAB仿真

一种基于约化因子上三角矩阵求逆的方法与MATLAB仿真 目录 前言 一、上三角矩阵单位化 二、C对角矩阵求逆 三、A 矩阵求逆 四、A矩阵求逆 五、计算量分析 六、MATLAB仿真 七、参考资料 总结 前言 矩阵运算广泛应用于实时性要求的各类电路中&#xff0c;其中矩阵求逆运算…

04课程发布模块之课程审核

课程审核 课程审核是为了防止课程信息出现违规情况&#xff0c;课程信息不完善对网站用户体验也不好&#xff0c;课程审核不仅起到监督作用&#xff0c;也是帮助教学机构规范使用平台的手段 教学机构提交课程审核后&#xff0c;平台运营人员登录运营平台进行课程审核&#xf…

SpringBoot ---HTML转PDF工具

之前项目用的WKHtmlToPdf&#xff0c;速度较慢&#xff0c;现在需要改成基于ITEXT java使用itext7实现html转pdf_java使用itext7实现html转pdf全代码完整示例 cainiaobulan-CSDN博客文章浏览阅读2.7k次。使用itext7html转pdf_java使用itext7实现html转pdf全代码完整示例 caini…

C++之继承详解

一.继承基础知识 继承定义&#xff1a; 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保 持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派生类。继承呈现了面向对象 程序设…

电脑文件msvcp100.dll丢失原因,如何快速修复msvcp100.dll

电脑文件msvcp100.dll丢失原因&#xff0c;最近有朋友在问这个&#xff0c;显然会问这个的人&#xff0c;一般都是遇到了msvcp100.dll丢失的问题了&#xff0c;今天我们就来详细的给大家说说msvcp100.dll这个文件吧&#xff0c;我们只有了解了msvcp100.dll这个文件&#xff0c;…

C语言,自定义数据类型

引言&#xff1a; C语言当中除了&#xff0c;自己带的基本数据类型&#xff0c;还有一些自定义数据类型&#xff0c;用户自己可以控制数据类型大小&#xff0c;所包含的元素&#xff0c;使用起来更加方便&#xff0c;快捷。 一 数组arr&#xff1a; 对于数组而言&#xff0…

LeetCod459:重复的子字符串

题目描述 给定一个非空的字符串 s &#xff0c;检查是否可以通过由它的一个子串重复多次构成。 示例 1: 输入: s “abab” 输出: true 解释: 可由子串 “ab” 重复两次构成。 示例 2: 输入: s “aba” 输出: false 示例 3: 输入: s “abcabcabcabc” 输出: true 解释: 可…

Obsidian插件PicGo-图床创建使用[腾讯云保姆级教程]

一、下载PicGo并配置 1&#xff1a;安装插件 首先插件市场搜索picgo会出现Image auto upload&#xff0c;这个就是PicGo安装此插件并启用即可 2&#xff1a;安装PicGo软件 打开此链接&#xff1a;https://github.com/Molunerfinn/PicGo 自己选择一个方式下载&#xff0c;我…

unicloud 云函数 介绍及使用

普通云函数 callFunction方式云函数&#xff0c;也称之为普通云函数。 uni-app的前端代码&#xff0c;不再执行uni.request联网&#xff0c;而是通过uniCloud.callFunction调用云函数。 callFunction方式避免了服务器提供域名&#xff0c;不暴露固定ip&#xff0c;减少被攻击…

【JS】闭包的漏洞

下面这段代码可以实现&#xff1a;通过立即执行函数o返回对象中的get方法&#xff0c;通过参数key得到fn函数内部对象obj中的值。 var fn function () {var obj {a: 1,b: 2}return {get: function (key) {return obj[key]}} }() console.log(fn.get(b)); // 2这是一个典型的…

3个好用的WP免费主题

免费wordpress模板下载 高端大气上档次的免费wordpress主题&#xff0c;首页大图全屏显示经典风格的wordpress主题。 https://www.wpniu.com/themes/289.html 经典的红色免费wordpress主题 这是一款经典的免费wordpress主题&#xff0c;被广泛应用于多个行业的网站。 https…

智慧公厕的系统构成与功能解析

智慧公厕系统是通过传感器和云平台相结合的创新技术&#xff0c;旨在提供更好的公厕管理与服务。智慧公厕从系统的构成来看&#xff0c;主要分为感知层&#xff08;数据收集&#xff09;、传输层&#xff08;数据传输&#xff09;、平台层&#xff08;数据处理&#xff09;和应…

VUE+Vant实现H5组织架构选人选公司组件

提醒自己&#xff1a; 这是之前的逻辑&#xff0c;或许你重新写会有更好的方法&#xff0c;可以参考逻辑&#xff01;&#xff01;&#xff01; 功能介绍 1.有面包屑点击切换 2.有公司、部门、人员 3.单选、多选实现 4.编辑/回显 5.使用随意切换层级和跳转到指定层级回显等功…

CSAPP | Lab1-Data Lab 详细解析

You may assume that your machine:1. Uses 2s complement, 32-bit representations of integers.2. Performs right shifts arithmetically.3. Has unpredictable behavior when shifting if the shift amountis less than 0 or greater than 31.Part1&#xff1a;整数 1.Bit…

力扣爆刷第102天之hot100五连刷96-100

力扣爆刷第102天之hot100五连刷96-100 文章目录 力扣爆刷第102天之hot100五连刷96-100一、136. 只出现一次的数字二、169. 多数元素三、75. 颜色分类四、31. 下一个排列五、287. 寻找重复数 一、136. 只出现一次的数字 题目链接&#xff1a;https://leetcode.cn/problems/sing…

Java疫苗接种管理系统

本系统lw为2024-3-21本人原创&#xff0c;查chong13% 1.3W字&#xff0c;可以直接上交&#xff0c;这并不是乱七八糟的技术文档和项目文档。 4.2 功能结构设计 可视化的疫苗接种管理系统功能结构设计主要包括以下几个模块&#xff1a; 登录注册模块&#xff1a;这个模块负责…

算法体系-14 第十四 贪心算法(上)

一 、 递归套路解决判断完全二叉树 1.1 描述 1.2 分析 1.2 分析 第二种 第三种 第四种 1.3 代码 public static boolean isCBT2(Node head) {return process(head).isCBT;}public static class Info {public boolean isFull;public boolean isCBT;public int height;public…

hcia静态实验

题目&#xff1a; 要求&#xff1a; 1、R6为isp&#xff0c;接口ip均为公有地址&#xff0c;该设备只能配置ip地址&#xff0c;之后不能再对其进行任何其他配置 2、r1到r5为局域网&#xff0c;私有ip地址为192.168.1.0 24&#xff0c;合理分配 3、r1,r2,r4各有两个环回地址&am…

2024年全国职业院校技能大赛中职组大数据应用与服务赛项题库参考答案陆续更新中,敬请期待…

2024年全国职业院校技能大赛中职组大数据应用与服务赛项题库参考答案陆续更新中&#xff0c;敬请期待… 武汉唯众智创科技有限公司 2024 年 3 月 联系人&#xff1a;辜渝傧13037102709 题号&#xff1a;试题04 ZZ052-大数据应用与服务赛选赛题04 模块一&#xff1a;平台搭建…

JVM面试篇

面试篇就是复习前面学的 什么是JVM 1.定义&#xff1a;JVM指的是Java虚拟机&#xff0c;本质是一个运行在计算机上的程序 2.作用&#xff1a;为了支持Java中Write Once &#xff0c;Run Anywhere 编写一次 到处运行的跨平台特性 功能&#xff1a; 1.解释和运行 2.内存管理…