React-Mobx(入门)

news2025/7/26 19:30:13

目录

1. Mobx介绍

优势 

社区评价

​编辑

 2.配置开发环境

3.基础使用

1)初始化mobx

2)React使用store

 4.计算属性(衍生状态)

 5.异步数据处理

6. 模块化

1)定义task模块 

 2)定义counterStore

3)组合模块导出统一方法

4)组件使用模块中的数据

7. 多组件共享数据

文章推荐


1. Mobx介绍

一个可以和React良好配合的集中状态管理工具,和Redux解决的问题相似,都可以独立组件进行集中状态管理

优势 

        1.简单:编写无模板的极简代码精准描述你的意图

        2.轻松实现最优渲染: 依赖自动追踪,实现最小渲染优化

        3.架构自由: 可移植, 可测试 无特殊心智负担

社区评价

 2.配置开发环境

Mobx是一个独立的响应式的库,可以独立于任何UI框架存在,但是通常大家习惯把它和React进行绑定使用,用Mobx来做响应式数据建模,React作为UI视图框架渲染内容,我们环境的配置需要三个部分

  1. 一个create-react-app创建好的React项目环境
  2. mobx框架本身
  3. 一个用来链接mobx和React的中间件
# 创建项目
$ yarn create vite react-mobx --template react

# 安装mobx和中间件工具 mobx-react-lite  只能函数组件中使用
$ yarn add  mobx  mobx-react-lite

3.基础使用

        简单使用mobx实现一个计数器的案例

1)初始化mobx

初始化步骤

  1. 定义数据状态state
  2. 在构造器中实现数据响应式处理 makeAutoObservble
  3. 定义修改数据的函数action
  4. 实例化store并导出
//counterStore.js
import { makeAutoObservable } from 'mobx'

class CounterStore {
  count = 0 // 定义数据
  constructor() {
    makeAutoObservable(this)  // 响应式处理
  }
  // 定义修改数据的方法
  addCount = () => {
    this.count++
  }
}

const counter = new CounterStore()
export default counter

2)React使用store

实现步骤

  1. 在组件中导入counterStore实例对象
  2. 在组件中使用storeStore实例对象中的数据
  3. 通过事件调用修改数据的方法修改store中的数据
  4. 让组件响应数据变化
//App.js
// 导入counterStore
import counterStore from './store'

// 导入observer方法
import { observer } from 'mobx-react-lite'

function App() {
  return (
    <div className="App">
      <button onClick={() => counterStore.addCount()}>
        {counterStore.count}
      </button>
    </div>
  )
}
// 包裹组件让视图响应数据变化
export default observer(App)

 4.计算属性(衍生状态)

概念: 有一些状态根据现有的状态计算(衍生)得到,我们把这种状态叫做计算属性, 看下面的例子

 实现步骤

  1. 生命一个存在的数据
  2. 通过get关键词 定义计算属性
  3. 在 makeAutoObservable 方法中标记计算属性
//counterStore.js
import { computed, makeAutoObservable } from 'mobx'

class CounterStore {
  list = [1, 2, 3, 4, 5, 6]
  constructor() {
    makeAutoObservable(this, {
      filterList: computed
    })
  }
  // 修改原数组
  changeList = () => {
    this.list.push(7, 8, 9)
  }
  // 定义计算属性
  get filterList () {
    return this.list.filter(item => item > 4)
  }
}

const counter = new CounterStore()

export default counter

 5.异步数据处理

实现步骤:

  1. 在mobx中编写异步请求方法 获取数据 存入state中
  2. 组件中通过 useEffect + 空依赖 触发action函数的执行
//channelStore.js
// 异步的获取

import { makeAutoObservable } from 'mobx'
import axios from 'axios'

class ChannelStore {
  channelList = []
  constructor() {
    makeAutoObservable(this)
  }
  // 只要调用这个方法 就可以从后端拿到数据并且存入channelList
  setChannelList = async () => {
    const res = await axios.get('http://www.bai.net/channels')
    this.channelList = res.data.data.channels
  }
}
const channlStore = new ChannelStore()
export default channlStore
//App.js
import { useEffect } from 'react'
import { useStore } from './store'
import { observer } from 'mobx-react-lite'
function App() {
  const { channlStore } = useStore()
  // 1. 使用数据渲染组件
  // 2. 触发action函数发送异步请求
  useEffect(() => {
    channlStore.setChannelList()
  }, [])
  return (
    <ul>
      {channlStore.channelList.map((item) => (
        <li key={item.id}>{item.name}</li>
      ))}
    </ul>
  )
}
// 让组件可以响应数据的变化[也就是数据一变组件重新渲染]
export default observer(App)

6. 模块化

场景: 一个项目有很多的业务模块,我们不能把所有的代码都写到一起,这样不好维护,提了提供可维护性,需要引入模块化机制 

实现步骤

  1. 拆分模块js文件,每个模块中定义自己独立的state/action
  2. 在store/index.js中导入拆分之后的模块,进行模块组合
  3. 利用React的context的机制导出统一的useStore方法,给业务组件使用

1)定义task模块 

import { makeAutoObservable } from 'mobx'

class TaskStore {
  taskList = []
  constructor() {
    makeAutoObservable(this)
  }
  addTask () {
    this.taskList.push('vue', 'react')
  }
}

const task = new TaskStore()


export default task

 2)定义counterStore

import { makeAutoObservable } from 'mobx'

class CounterStore {
  count = 0
  list = [1, 2, 3, 4, 5, 6]
  constructor() {
    makeAutoObservable(this)
  }
  addCount = () => {
    this.count++
  }
  changeList = () => {
    this.list.push(7, 8, 9)
  }
  get filterList () {
    return this.list.filter(item => item > 4)
  }
}

const counter = new CounterStore()

export default counter

3)组合模块导出统一方法

import React from 'react'

import counter from './counterStore'
import task from './taskStore'


class RootStore {
  constructor() {
    this.counterStore = counter
    this.taskStore = task
  }
}

const rootStore = new RootStore()

// context机制的数据查找链  Provider如果找不到 就找createContext方法执行时传入的参数
const context = React.createContext(rootStore)

const useStore = () => React.useContext(context)
// useStore() =>  rootStore  { counterStore, taskStore }

export { useStore }

4)组件使用模块中的数据

import { observer } from 'mobx-react-lite'
// 导入方法
import { useStore } from './store'
function App() {
  // 得到store
  const store = useStore()
  return (
    <div className="App">
      <button onClick={() => store.counterStore.addCount()}>
        {store.counterStore.count}
      </button>
    </div>
  )
}
// 包裹组件让视图响应数据变化
export default observer(App)

7. 多组件共享数据

目标:当数据发生变化 所有用到数据的组件都会得到同步的组件的更新

实现步骤:在Foo组件和Bar组件中分别使用store中的数据,然后在app组件中进行数据修改,查看Foo组件和Bar组件是否得到更新

// Bar.js
// 用taskStore中的taskList数据
import { useStore } from './store'
import { observer } from 'mobx-react-lite'
const Bar = () => {
  const { taskStore } = useStore()
  return (
    <ul>
      {taskStore.taskList.map((item) => (
        <li>{item}</li>
      ))}
    </ul>
  )
}

export default observer(Son)
//Foo.js
// 用taskStore中的taskList数据
import { useStore } from './store'
import { observer } from 'mobx-react-lite'
const Bar = () => {
  const { taskStore } = useStore()
  return (
    <ul>
      {taskStore.taskList.map((item) => (
        <li>{item}</li>
      ))}
    </ul>
  )
}

export default observer(Son)
//App.js
import Bar from './Bar'
import Foo from './Foo'
import { useStore } from './store'
function App() {
  const { taskStore } = useStore()
  return (
    <div className="App">
      <Bar />
      <button onClick={() => taskStore.setTaskList('angular')}>
        修改taskStore
      </button>
    </div>
  )
}
export default App

文章推荐

        1.React组件(进阶--children/props) 

        2.React组件(进阶--生命周期 ) 

        3.React--hooks详解(入门) 

        4.React--hooks详解(进阶) 

        5.React-Router详解(入门) 

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

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

相关文章

配置错误的smb共享

介绍 Windows 是当今最流行的操作系统&#xff0c;不仅由个人用户使用&#xff0c;而且在大公司中也广泛使用。由于其操作简单性以及使用图形界面&#xff0c;如今&#xff0c;大量实体的公司网络充满了运行Windows操作系统的主机和服务器。无论这些机器针对的是最终用户、我们…

XSS-labs靶场实战(一)——第1-3关

今天继续给大家介绍渗透测试相关知识&#xff0c;本文主要内容是XSS-labs靶场实战。 免责声明&#xff1a; 本文所介绍的内容仅做学习交流使用&#xff0c;严禁利用文中技术进行非法行为&#xff0c;否则造成一切严重后果自负&#xff01; 再次强调&#xff1a;严禁对未授权设备…

Linux安全--iptables详解

目录 1、iptables介绍 2、iptables四表五链详解 3、iptables基本语法 4、实际操作 4.1 增加规则 4.2 删除规则 4.3 修改规则 5、命令语法总结 6、基本匹配条件 7、iptables进阶用法 7.1 iprange扩展模块 7.2 string扩展模块 8、iptables进行端口转发 1、iptables介绍 …

【Python】面向Sqli-Labs Less15的布尔盲注二分法脚本

前言 其实写这个python脚本是为了完成我某节课的某个实验 代码里有一堆一堆的for循环&#xff0c;导致程序整个运行下来起码需要一个小时&#xff0c;而且还是基于二分法的qwq。本来想说去学一学python的多线程提升一下效率&#xff0c;但我发现我这代码一环扣一环&#xff0c…

基于PHP+MySQL的在线学习网站系统

随着我国教育体制的改革,我国大学生的数量越来越多。相对应的对我国的教育质量也提出了新的要求。如果仅仅是在课堂上学习那些有限的知识已经不能够再满足大学生对知识的渴望了。为了能够让大学生学习到更多的内容需要一个在线学习系统来辅助大学生进行学习。 PHP在线学习网站系…

点阵 LED 显示设计实验

一、实验目的&#xff1a; 1.了解LED点阵的基本结构。 2.学习LED点阵扫描显示程序的设计方法。 二、实验内容与要求&#xff1a; 编写程序&#xff0c;控制点阵向上卷动显示“原来如此是这样呀”。 实验系统中的1616 LED点阵由四块88LED点阵组成&#xff0c;如图1所示&…

[附源码]SSM计算机毕业设计作业自动评阅系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【多标签文本分类】《融合注意力与CorNet的多标签文本分类》

阅读摘要&#xff1a;   本文主要提出标签与文本注意力文本注意力、CorNet增强标签预测概率两个创新点&#xff0c;提升了实验精度。 参考文献&#xff1a;   [1] 融合注意力与CorNet的多标签文本分类 参考论文信息 论文名称&#xff1a;《融合注意力与CorNet的多标签文本分…

2.10 80%的小红书新手博主都会忽略的问题:排版【玩赚小红书】

其实&#xff0c;不管在哪一个平台发布作品&#xff0c;都需要注重排版。 因为舒服的排版&#xff0c;不仅能让读者视觉舒服&#xff0c;而且也是你重新检查作品逻辑是不是清晰的过程。 比如&#xff0c;你看下面这张对比图&#xff0c;从读者角度来看&#xff0c;你更喜欢排…

人类小脑内在组织背后的基因图谱

摘要 人类小脑的功能多样性在很大程度上被认为更多地来自于其广泛的联系&#xff0c;而不是局限于其部分不变的结构。然而&#xff0c;小脑内在组织中连接的确定是否以及如何与微尺度基因表达相互作用仍不清楚。在这里&#xff0c;我们通过研究同时连接小脑功能异质性及其驱动因…

【快速上手系列】使用idea调百度AI接口实现人脸识别功能

【快速上手系列】使用idea调百度AI接口实现人脸识别功能 一、人脸检测 步骤 1、百度AI开放平台 登录后点击控制台 点击公有云服务——应用列表——点击创建应用 填写一下信息然后创建 然后回到概览——领取免费资源&#xff08;如果账号没领取过的话&#xff09; 可以自选&…

[Java] [Spring boot] Mybatis generator 生成Mapper.xml无效的问题

报错&#xff1a;org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): 百度出来的解决方案&#xff1a; 1&#xff1a;Mapper.xml中的namespace不对应和mapper接口不对应 2&#xff1a;Mapper.xml中的方法(即id)和mapper接口中的方法名字不同或…

使用 nexus 作为 npm 私服

背景: 之前公司内部是使用的 verdaccio 作为私有前端 npm 仓库的工具的, 由于最近安装包时总是遇到问题, 发包 和 安装都比较慢, 不太确定具体是什么问题 几经解决还是没能够解决掉, 索性换一个工具试试, 公司后端的 maven 库私服是使用的 nexus, 找资料时发现 nexus 也是可…

C++,STL,,vector容器

文章目录一、vector介绍1.vector对象构造2.vector的赋值3.vector的大小4.vector末尾的添加移除操作5.vector的数据存取6.vector的插入7.vector的删除8.vector迭代器一、vector介绍 vector相当于顺序表 vector是将元素置于一个动态数组中加以管理的容器。 vector可以随机存取元…

天元宠物上市首日破发:市值蒸发约5亿元,薛元潮兄妹为实控人

11月18日&#xff0c;杭州天元宠物用品股份有限公司&#xff08;下称“天元宠物”&#xff0c;SZ:301335&#xff09;在深圳证券交易所创业板上市。本次上市&#xff0c;天元宠物的发行价格为49.98元/股&#xff0c;发行数量为2250万股&#xff0c;募资总额约为11.25亿元&#…

华玉通软发布“云雀”执行管理中间件,为智能驾驶关键应用提供确定性执行保障

11月17日&#xff0c;华玉通软&#xff08;下称“华玉”&#xff09;宣布正式发布“云雀”执行管理中间件&#xff08;LARK EM Execution Management&#xff09;。 这是继“雨燕”通信中间件&#xff08;SWIFT DDS&#xff09;后&#xff0c;华玉的又一款完全自主研发的智能驾…

[iOS]分析Mach-O文件

一、Mach-O文件介绍 我们拿到IPA文件后&#xff0c;解压后就能拿到一个与APP同名的可执行文件。 Mach-O为Mach Object文件格式的缩写&#xff0c;它是一种用于可执行文件&#xff0c;目标代码&#xff0c;动态库&#xff0c;内核转储的文件格式。 每个Mach-O文件包括一个Mach-…

Design A NearBy Friends

title: Notes of System Design No.09 — Design a Uber backend description: Design a PasteBin ’ date: 2022-05-13 18:01:58 tags: 系统设计 categories: 系统设计 00. What is Newarby Friends? 01.Functional Requirement 02. Non-Functional Requirement 03. Assump…

Java新特性(2):Java 10以后

您好&#xff0c;我是湘王&#xff0c;这是我的CSDN博客&#xff0c;欢迎您来&#xff0c;欢迎您再来&#xff5e; 虽然到目前为止Java的版本更新还没有什么惊天动地的改变&#xff0c;但总是会冒出一些有趣的小玩意。前面列举了Java9和Java10的一些特色&#xff0c;现在接着来…

shell修改永久性别名,压缩与解压缩(zip gzip bzip2)文件上传预下载(sftp)

命令别名&#xff08;永久有效&#xff09; 敲重点&#xff08;写入文件&#xff09;&#xff08;1&#xff09;仅对root有效&#xff0c;写一个命令命为hello,实现的功能为每输入一次hello命令&#xff0c;就有hello&#xff0c;everyone写入文件/file.txt中。 root用户…