react-redux与mobx

React 状态管理之 Redux 与 MobX 对比剖析:原理、选型与最佳实践 ReduxRedux 是由 Dan Abramov 和 Andrew Clark 创建的一个 JavaScript 状态管理库,通常与 React 搭配使用。Redux 基于 Flux 架构,强调状态的不可变性和数据流的单向性。Redux 和 MobX 各自有着鲜明的特点和适用场景。Redux 强调数据流的严格控制和高可维护性,适合复杂的企业级应用;而 MobX 更加简洁、灵活,适合快速开发和性能要求较高的场景。选择哪种工具,应根据项目的规模、团队经验和具体需求来决定。 阅读详情

react中的状态管理有很多,我们今天讲的是react-redux 和 mobx。

一:mobx

1、根目录

index.js

import { Provider } from 'mobx-react'

ReactDOM.render(<Provider locale={zh_CN}><App store={AppStore} /></Provider>, document.getElementById('root'))

app.js

import { Provider } from 'mobx-react'

render() {
    //const newState = new AppStore()
    return (
      <Provider {...this.props}>
        <BrowserRouter history={history} basename="/">
          <div className="App">
            {/* <TopView /> */}
            <div className="mainContain">
              <RouterConfig />
            </div>
          </div>
        </BrowserRouter>
      </Provider>
    )
  }

2、appStore文件

import { observable, computed, action } from 'mobx';

@observable:值可以是JS基本数据类型、引用类型、普通对象、类实例、数组和映射。其修饰的state会暴露出来供观察者使用

@observable 接受任何类型的 js 值(原始类型、引用、纯对象、类实例、数组和、maps),observable 的属性值在其变化的时候 mobx 会自动追踪并作出响应。

当 value 是一个对象类型值的时候,它会默认克隆该对象并且把其中每个属性变为可观察的值,这里默认是深拷贝,也就是说其对象的后代属性都会变成可观察的,比如 @observable classProperty = { obj: { name: 'q' } } ,当 classProperty.obj.name 改变的时候,在 MobX 中也是可以观察到并响应的;

当然在这里可以加一些调节器来做一些配置:

  • @observable.deep (默认)对对象进行深拷贝;
  • @observable.shallow 它只对对象进行浅拷贝;
  • @observable.ref 禁用对象的自动转化,只转化其引用;

@action:只有在 actions 中,才可以修改 Mobx 中 state 的值,支持异步
注意:当你使用装饰器模式时,@action 中的 this 没有绑定在当前这个实例上,要用过 @action.bound 来绑定 使得 this 绑定在实例对象上。

@computed get TodoListCount() {

        return this.todos.length;

  }

autorun

在上面的例子中,当触发了可观察状态属性的改变后,其变化的监听则是在传入 autorun 函数中作出响应。

autorun 接受一个函数作为参数,在使用 autorun 的时候,该函数会被立即调用一次,之后当该函数中依赖的可观察状态属性(或者计算属性)发生变化的时候,该函数会被调用,注意,该函数的调用取决的函数中使用了哪些可观察状态属性(或者计算属性)。

componentDidMount() {
    const { store } = this.props
    var that = this
    autorun(() => {
      console.log('11', store.name)
      that.setState({
        numbers: store.name
      })
    })
  }

3、组件中引入:

import { observer, inject } from 'mobx-react'

@inject('store')

@observer

//获取store

    const { store } = this.props

    store.setWarnFlag(false)

class appStore {
  @observable socketUrl = 'kc.tianren.com:6060/ws'
  @action setSocketUrl(socketUrl) {
    this.socketUrl = parseInt(socketUrl)
  }
  @observable nowIndex = 0
  @observable childNowIndex = 5
  @action setIndex(nowIndex) {
    this.nowIndex = parseInt(nowIndex)
  }
  @action setChildIndex(childNowIndex) {
    this.childNowIndex = parseInt(childNowIndex)
  }
  @observable flag = false
  @action setFlag(flag) {
    this.flag = flag
  }
  @observable warnFlag = true
  @action setWarnFlag(warnFlag) {
    this.warnFlag = warnFlag
  }
  @observable todos = [
    {
      name: `李四`,
      age: 1
    }
  ] //todos列表
  @action fetchTodos() {
    var randomAge = Math.random(10)
    this.todos.push({
      name: `张三${randomAge}`,
      age: randomAge
    })
  }
  @action fetchTodoRemove() {
    this.todos.pop()
  }

  //添加
  @action AddTodo = () => {
    this.fetchTodos()
  }

  //删除单个
  @action remove() {
    this.fetchTodoRemove()
  }

  //计算长度
  @computed get TodoListCount() {
    return this.todos.length
  }
}
const AppStore = new appStore()
export default AppStore

二:Redux

index.js//

import { Provider } from 'react-redux'
import { createStore } from 'redux';
import testReducer from './store/reducer'
const store = createStore(testReducer)

Home.js//

import { connect } from "react-redux"
import { setName, getName, resetName } from '../store/actions'

setA(name) {
    console.log('sss')
    this.props.setName(name)
}

function mapStateToProps(state) {
  return {
    name: state.name
  };
}
const mapDispatchToProps = {
  setName,
  getName,
  resetName
};
export default connect(mapStateToProps, mapDispatchToProps)(Home)
reduce //
import { SET_NAME, GET_NAME, RESET_NAME } from './actions'
const finialState = {
  name: '未设置'
};

export default function testReducer(state = finialState, actions) {
  switch (actions.type) {
    case GET_NAME:
      return {
        name: `my name is ${state.name}`
      }
    case SET_NAME:
      return {
        name: actions.preload.value
      }
    case RESET_NAME:
      return {
        name: '未设置'
      }
    default:
      return state;
  }
} 

//rootReducer
import { combineReducers } from "redux";
export default combineReducers({
  products
});

同样注意 Redux 如何传递了一个 undefined 的 state,同时 action 是一个有 type 属性的对象。
我们稍后会更多地讨论 actions。现在,我们先看看 reducer。

记住 reducer 的职责是接收当前 state 和一个 action 然后返回新的 state。

const initialState = {
  count: 0
};
function reducer(state = initialState, action) {
  console.log('reducer', state, action);
  return state;
}

Actions 的格式非常自由。只要它是个带有 type 属性的对象就可以了。

另一个关于 reducers 的规则是它们必须是纯函数。也就是说不能修改它们的参数,也不能有副作用(side effect)。必须返回一个 state,不要改变 state

const store = createStore(reducer);
store.dispatch({ type: "INCREMENT" });

要做到这一点,要用到 react-redux 库的两样东西:一个名为 Provider 的组件和一个 connect 函数。

function mapStateToProps(state) {
  return {
    count: state.count
  };}

 export default  connect(mapStateToProps)(Counter);    

这样写是因为 connect 是一个高阶函数,它简单说就是当你调用它时会返回一个函数。然后调用返回的函数传入一个组件时,它会返回一个新(包装的)组件。

固执的 Redux 只接受简单对象作为 actions。

“thunk” 是(少见)指被其它函数作为返回值的函数。你可以像其他 action 生成器一样 dispatch 这些 “thunk actions”:dispatch(getUser())。

function doStuff() {
  return function(dispatch, getState) {
    // 在这里 dispatch actions
    // 或者获取数据
    // 或者该干啥干啥
  }}

Action 生成器返回的函数接收两个参数:dispatch 函数和 getState。

大多数场景你只需要 dispatch,但有时你想根据 Redux state 里面的值额外做些事情。这种情况下,调用 getState() 你就会获得整个 state 的值然后按需所取。

export function fetchProducts() {
  return dispatch => {
    dispatch(fetchProductsBegin());
    return fetch("/products")
      .then(res => res.json())
      .then(json => {
        dispatch(fetchProductsSuccess(json.products));
        return json.products;
      })
      .catch(error => dispatch(fetchProductsFailure(error)));
  };
}

 

谈谈React的全局状态管理Redux和Mobx的使用 目前有很多基于flow理念的状态管理器,Redux和Mobx是目前追随度比较高的两种,那么选择Redux还是Mobx呢? 阅读详情

相关推荐

React技术原理与代码开发实战:从Redux到MobX

作者:禅与计算机程序设计艺术 1.背景介绍 近年来前端框架层出不穷,React已经成为一个非常流行的前端框架。React在设计理念上着重于组件化思想,通过单独封装可复用的UI组件,使得代码更加模块化、易维护。同时Facebook还开源了一套名为Flux的架构模式,应用在React项目中,即“单向数据

AI天才研究院 210

react——mobx和redux的区别

mobx和redux的区别

weixin_70623314的博客 1854

AI开发提效10倍:从需求到部署的全流程实战指南(附Prompt模板)

用AI开发不是“偷懒”,而是把时间花在更有价值的地方——原来花80%时间写重复代码,现在用AI搞定后,能把精力放在“优化用户体验”“提升系统性能”这些核心工作上,这才是AI给开发者的真正红利。如果你还没开始用AI做开发,建议从“写一个简单接口”“补一段注释”开始尝试,先用起来再优化方法。记住:AI是工具,不是对手,学会驾驭它,你会发现开发效率提升的同时,还能告别无效加班。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1525

React 数据流方案专题(Redux、MobX)

它的注册需要使用到redux的一个 applyMiddleware 方法,这个方法就是用来注册中间件的,该方法的返回值放在 createStore 方法的第二个参数中,这样一来,当组件去触发action的时候,这个中间件的代码就可以得到执行了。值得注意的是reduxjs/toolkit 它自己本身就已经内置了一些中间间,所以我们在配置自己的中间件时需要把本来内置的中间件获取到再跟我们自己要添加的中间件组合到一起,设置给 store 的 middleware 属性,它的值是一个数组。

前端高薪进击手记 1378

保姆级教程:用Protege 5.5.0从零构建你的第一个知识图谱(附实战案例文件)

本文提供了一份详细的Protege 5.5.0使用指南,从零开始构建知识图谱。通过'中国古代文人关系网'实战案例,涵盖软件安装、本体创建、属性定义、实例填充到高级功能应用的全流程,帮助初学者快速掌握知识建模的核心技能。

weixin_26808205的博客 234

Jenkins中文显示不全?三步搞定Locale插件+汉化包的正确安装姿势

本文针对Jenkins界面中文显示不全问题,提供从原理到实战的深度解决方案。文章详细解析了Locale插件与中文语言包的核心机制,并分步指导如何通过配置JVM环境、正确安装插件及执行深度排查,彻底解决汉化顽疾,实现Jenkins界面的完美中文显示。

weixin_42611310的博客 259

React中状态管理之redux、mobx简单总结

一、什么是redux: Redux 是 JavaScript 状态容器,提供可预测化的状态管理。可以让你构建一致化的应用,运行于不同的环境(客户端、服务器、原生应用),并且易于测试。Redux 除了和 React 一起用外,还支持其它界面库。 它体小精悍(只有2kB,包括依赖)。 二、安装与引入: npm install --save redux //安装 import { createStore } from 'redux' //引入 三、redux三大原则: 单一数据源、state是只读的

duansamve的博客 1135

Changer: Feature Interaction Is What You Need forChange Detection

还有“交换“交互是一种完全不需要参数和计算的操作,它是通过交换空间或通道维度上的双时态特征映射来实现的,交换的特征在经过后续的卷积或令牌混合时进行混合。方法二:提出了两种简单的交互策略,AD和特征“交换”,大量的实验表明,它们可以极大地提高MetaChanger的性能,特别是特征“交换”,即使嵌入到复杂的网络中或应用于具有挑战性的数据集。在这里,我们用虚线勾勒本文的重点。这是变化检测任务的基本问题,双时相图像提供了同一地区在不同时间点的图像数据,通过对比这两个时间点的图像,我们可以检测出该地区的变化。

yokon的博客 1619

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

MobX 是一个状态管理库,它提供了一种响应式的数据流方案,使得状态的变化能够自动地反映到相关的组件中。

cherry__yu的博客 1650

【军标】《军用软件计价规范(试行)》和GJB 10162-2021《军用软件计价功能项识别方法》-费用标准解读系列37

2021年2月1日实施的《军用软件计价规范(试行)》(替代了2019年版本)以及2021年3月1日实施的《军用软件计价功能项识别方法》(GJB 10162-2021),是我们平时在军用软件造价咨询中进行软件规模度量、计价和审价的主要依据。《军用软件计价规范(试行)》(4号文)的附件1为《军用软件功能规模度量方法》,即4号文本身包含对软件规模测试的方法(功能点方法主要参考NESMA等国际标准)、规模度量过程、功能点计数和计算规则等相关说明。(四)软件研发费用=软件研发工作量x软件研发人月综合费率。

xiaosenyouli的博客 6104

栅格数据做相关性分析前的预处理(批量定义投影、栅格投影、重采样)

最近在做两个栅格数据的相关性分析,这个最主要的是两个栅格数的行列号是一致的(也就是说坐标系、分辨率一致),那么标准的栅格数据的分辨率是以米的形式存在的,但是有一些栅格数据是以度为单位存在的,所以在做分析前,一定要先把其转换为米,否则在重采样的时候就会出错。(相关文章——栅格数据以度为单位变为以米为单位的简单做法)当然,在变其分辨率的单位前,一定要将其坐标系转换为一致。所以就有以下的步骤(如何将两个栅格数据的坐标系、分辨率的单位和分辨率一致) 1.首先,要看两个栅格数据的坐标系是否一致,如果不一致,要先统一到

qq_41828818的博客 8350

React 中mobx和redux有什么区别?

MobX是一个简单、可扩展且高效的状态管理库。它使用可观察的数据结构来自动追踪和更新状态,并与React无缝集成。MobX通过响应式的方式,使得状态的变化能够自动地反映到相关的组件上,从而实现了轻松的状态管理。

alive_new的博客 2948

OpenCV-Python实战(10)——详解 OpenCV 轮廓检测

在计算机视觉领域,轮廓通常指图像中对象边界的一系列点。因此,轮廓通常描述了对象边界的关键信息,包含了有关对象形状的主要信息,该信息可用于形状分析与对象检测和识别。在本文中,将首次通过简单示例了解轮廓的基本概念,然后通过实际示例来了解如何检测和压缩轮廓,最后利用介绍如何利用图像矩描述检测到的轮廓属性。

盼小辉丶的博客 3万+

react+redux与react+mobx

了解react的状态管理前先回忆一下VUE中的状态管理VUEX,其实也是后者借鉴的前者,其实对于我来说,管你情感还是生活,经历后才知道其中味!!!

Front小思的博客 578

ISMN数据处理

可批量下载,十分方便

m0_46268055的博客 1214

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

React 三大仓库(Dva 、mobx 、Redux)

Dva:数据状态管理库 mobx:响应式管理 Redux:函数式管理 1.Dva详解 1.使用dva脚手架(dva-cli)快速构建React项目 npm install -g dva-cli 2.定义model 先设计 model 设计 component 连接两者(model 和 component) 2.1 dva 通过 model 的概念把一个领域的模型管理起来,包含同步更新 state 的 reducers,处理异步逻辑的 effects,订阅数据源的 subscriptions 。 .

ZhaoYulin6的博客 2254

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【八股系列】说一下mobx和redux有什么区别?(React)

说一下mobx和redux有什么区别?(React)

to_the_Future的博客 1746

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

用 Redux 或 Mobx 对 React 进行状态管理

文章目录一、Redux1. react-redux2. redux-thunk3. redux-saga二、Mobx1. mobx-react 一、Redux 返回目录 包名 说明 环境 备注 redux -S react-redux -S redux-thunk -S redux-saga -S 1. react-redux 返回目录 2. redux-thunk 返回目录 3. redux-saga 返回目录 二、Mobx 返回目录 包名 说明 .

wwwmewww的专栏 268

React 状态管理:Redux 和 MobX 的对比与选择

🤍 前端开发工程师、技术日更博主、已过CET6🍨、23年度博客之星前端领域TOP1🕠高级专题作者、打造专栏🍚签约作者、上架课程💬 前些天发现了一个巨牛的,通俗易懂,风趣幽默,忍不住分享一下给大家。。

你若盛开,清风自来 1532

Redux和MobX在React Native状态管理中的优缺点对比

摘要: Redux和MobX是React Native中两种主流状态管理方案。Redux基于函数式编程,强调单向数据流和不可变性,适合大型复杂应用,但代码量多、学习成本高;MobX采用响应式编程,通过可观察对象自动更新,代码简洁但灵活性可能引发副作用。Redux在可预测性和调试方面更优,MobX性能更好且易上手。选择建议:大型严格项目用Redux,中小型快速开发选MobX,也可根据场景混合使用。(149字)

前端技术的学习整理 1154

react状态管理工具redux还是mobx?

一、redux 1. 工作原理: JavaScript 状态容器,提供可预测化的状态管理,严格遵守单向数据流 2. 简单实现 function createStore(reducer) { let currentState; // 始终保持最新的state const listeners = []; // 用于存储订阅者 // 订阅store function subscribe(fn) { this.listeners.push(fn) } // 获取最新state

kellywong的博客 853

27、状态管理三神器——React 19 Redux/MobX/Zustand对比

允许像操作普通变量一样更新状态,违背React单向数据流但效率极高,类似黑魔法中的「不可饶恕咒」。:全局状态存储于唯一Store中,类似霍格沃茨的学院杯计分器,所有数据变更需经中央审核。:每个Store独立存在,无需Provider包裹,如同分院帽快速分配学院。:依赖追踪图实现精准重渲染,//如摄魂怪只攻击特定目标,避免全局性能损耗。的强约束流程管理状态,如同魔法部的时间转换器,确保每次状态变更都可追溯。自动追踪状态变化,如同活点地图实时显示城堡动态,数据与视图自动同步。• 需要严格的状态变更历史记录。

m0_60414444的博客 1656

react-redux与MobX状态库

luemeon的博客 242

React数据管理:Redux和Mobx应用对比

最近又开始了一个React项目,对于系统公用数据的管理,由于之前用过Redux,这次决定用Mobx是想看看它是否比Redux更好。三个月后,我发现虽然Mobx很简单易用,但是由于缺乏规则和限制,可能不适合大型团队,所以决定回归到Redux。在这里,我会展示一下用两种不同方式做同一个应用的代码,...

chongpiaochi0253的博客 324

【React】状态管理 Context API \ MobX \ Redux

Context API ; MobX ; Redux

千里之行,始于足下 698

React Native状态管理终极指南:Redux与MobX集成方案

React Native作为跨平台移动应用开发的热门框架,其状态管理一直是开发者关注的核心问题。本文将为你详细介绍如何在create-react-native-app项目中集成Redux与MobX这两种主流状态管理方案,帮助你构建更稳定、可维护的移动应用。 ## 为什么需要状态管理? 在React Native应用开发中,随着组件数量增加和业务逻辑复杂化,组件间的数据共享和状态同步变得越来越困

gitblog_00486的博客 770
上一篇: react-router-dom 之 Link 与NavLink
下一篇: sass知识点总结
小桃酥
博客等级 码龄10年 23粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值