mobx v6 + react hook 状态管理配置

2023-11-09

react hook 风格下不再使用class类的形式定义组件,也就不再适用mobx以前版本的装饰器语法。

以下分享 reack hook 语法风格下使用 mobx v6 版本的状态管理配置使用方式。

相关依赖版本:
"react": "^17.0.2",
"mobx": "^6.3.2",
"mobx-react-lite": "^3.2.2",

一、mobx

mobx 是 react 生态中常用的状态管理插件之一,特点是配置及使用方式比较简便,方式上和 vuex 有些相似。
官方中文文档:https://zh.mobx.js.org/react-integration.html

mobx-react-lite 是配合 react 使用的一个轻量化插件,只支持函数式组件,适合 react hook。

官方已不建议使用装饰器语法,主要原因是js装饰器在现在的 ES 规范中并不成熟(目前在stage-2提案阶段且迟迟无法推进),而且引入装饰器语法也会增加打包后的代码体积。这里也将完全放弃装饰器方式。

以下配置使用 react context 方式来传递数据,这也是官方推荐的方式。因为直接引用store原始数据在有多个module模块下可能会使引用变得杂乱,管理维护困难且不利于单元测试。

二、配置

先安装依赖:npm i -S mobx mobx-react-lite

1、配置 store/model

创建 根store src/store/index.js

import User from './modules/user'

export default {
  userStore: new User(),
}

创建 User模块 src/store/modules/user.js

import { makeAutoObservable } from 'mobx'

export default class User {
  constructor () {
    /**
     * state
     */
    this.ticket = '' // 登录凭证ticket

    makeAutoObservable(this)
  }

  /**
   * computed
   */
  get isLogin () {
    return !!this.ticket
  }

  /**
   * action
   */
  setTicket (val) {
    this.ticket = val || ''
  }
}
  • makeAutoObservable 会将你定义的数据自动转化为相应类型的可观察对象,例如 constructor 里定义的转化为 state,get 定义的函数转化为 computed,非 get 定义的函数转化为 action。

2、配置 context

创建 store 状态管理的 context 文件 src/contexts/storeContext.js

import React from 'react'
import store from '@/store'

const storeContext = React.createContext(store)

export default storeContext
  • createContext函数参数为默认值,ts下需要。
  • 使用 react context 向下级传递,来共享全局可观察数据。
  • 引用方式在下面。

3、配置 hook

创建 store 状态管理的 hook 文件 src/hooks/storeHook.js

import { useContext } from 'react'
import StoreContext from '@/contexts/storeContext'
import { observer } from 'mobx-react-lite'

function useStore () {
  const store = useContext(StoreContext)
  return store
}

export {
  observer,
  useStore,
}
  • 导出的 useStore 用于获取store数据。后续页面或组件都通过引用这个hook来获取store数据。
  • 导出的 observer 用于监听store数据的改变,同步到组件数据中。后续页面或组件如需要响应store数据的变化,就引用它包裹一下页面或组件的默认导出函数即可。
  • 这里将 mobx-react-lite 的 observer 在hook里导出是为了使用方便,一个hook就能引入全部所需。

4、引入 store

项目入口文件 src/index.js 里引用:

import React from 'react'
import ReactDOM from 'react-dom'
import App from './App'
import StoreContext from '@/contexts/storeContext'
import store from '@/store'

ReactDOM.render(
  <React.StrictMode>
    <StoreContext.Provider value={store}>
      <App />
    </StoreContext.Provider>
  </React.StrictMode>,
  document.getElementById('root')
)

三、使用

1、获取/响应 store 数据

示例组件 src/App.jsx

import { useStore, observer } from '@/hooks/storeHook'

function App () {
  const { userStore } = useStore()
  
  function onSetStore () {
    userStore.setTicket('ttt')
  }
  
  return (
    <div>
      <p>ticket:{userStore.ticket}</p>

	  <button onClick={onSetStore}>修改store中的ticket</button>
    </div>
  )
}

export default observer(App)
  • 通过自定义的 storeHook 来使用 store 的数据。
  • 如果只是获取一次 store 的数据而无需响应 store 数据的变化,只需要引用 useStore 即可。
  • 如果需要响应 store 数据的变化,即时更新到视图,就需要引用 observer,然后包裹一下该页面或组件的默认导出函数,即可实现响应式。

2、普通 js 中使用

  • 普通js,就是非页面或组件的js里,没办法使用hook。
  • 不过其实使用hook方式的目的就是能实现store数据的响应式。
  • 普通js里不需要数据响应式,直接引入原始store文件就行。

示例 js src/http/axios.js

import axios from 'axios'
import store from '@/store'

const { userStore } = store

const service = axios.create()

service.interceptors.request.use(
  (config) => {
    config.headers = {
      ...config.headers,
      ticket: userStore.ticket,
    }
    return config
  },
  err => {
    Promise.reject(err)
  }
)

export default service
  • 以上实现一个简易的axios请求配置,实现效果就是在请求头headers里统一携带ticket参数,参数值从src/store/index.js文件里直接取。
  • 如要修改store数据用法也一样,调用 userStore.setTicket() 即可。

四、总结

通过这种方式配置后,状态管理的使用将变得简单高效,完美兼容 react hook 语法,和 ts 配合也不再有障碍。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mobx v6 + react hook 状态管理配置 的相关文章

随机推荐

  • 内存泄漏的8种情况(附代码示例)

    一 内存泄漏 memroy leak 严格来说 只有对象不会再被程序用到了 但是GC又不能回收它们的情况 才叫内存泄漏 宽泛的讲 实际情况中很多时候一些不太好的实践会导致对象的生命周期变得很长甚至导致OOM 也叫 内存泄漏 申请了内存用完了
  • C++ - 类中的函数重载

    1 回顾函数重载 gt 函数重载的本质为相互独立的不同函数 gt C 中通过函数名和函数参数确定函数调用 gt 无法直接通过函数名得到重载函数的入口地址 gt 函数重载必然发生在同一个作用域中 2 类中的重载 类中的成员函数可以进行重载 g
  • JNI线程

    作者 左少华 博客 http blog csdn net shaohuazuo article details 43149193 转载请注明出处 http blog csdn net shaohuazuo 1 Android线程介绍 1 线
  • 一个“/”键,封锁了整个互联网

    专栏 九章算法 网址 http www jiuzhang com 正所谓无BUG不生活 从你含辛茹苦地码着第一行代码开始 bug就如影随形 其实 bug 被自己或者是测试人员发现都是好事 但如果是被用户发现 又或者导致了客户和公司的巨额损失
  • 412. Fizz Buzz \ 404. Sum of Left Leaves

    412 法一 class Solution public vector
  • python中好用的库(一)

    python中好用的库 一 时间库 arrow 使用背景 日期时间处理在实际应用场景中无处不在 所以这也成了编程语言中必不可少的模块 Python 也不例外 但是 你知道在Python中有多少个相关的模块吗 datetime time ca
  • 中州韵输入法 linux 小鹤双拼,「Rime 鼠须管」小鹤双拼配置指南

    引言 如何将汉字输入到计算机中是一个编码有关的问题 目前市面上主流的方案包括音码 形码 音形码 和大多数人一样 之前我一直使用全拼 而且得益于 NLP 技术发展 使用搜狗输入法搭配云词库 输入效率可以媲美五笔输入法 但是今天要和大家分享 是
  • java实现5种不同的验证码图片,包括中文、算式等,并返回前端

    导入以下依赖
  • Windows修改右键新建菜单【Win10、Win11版】

    目录 一 引言 二 方法一 三 成果展示 四 方法二 删除Shell New 五 方法三 借助shellNewSettings小工具 一 引言 有些混乱的windows桌面新建菜单 是不是让人很不舒服 比如下图 图中的Access需要新建么
  • 浅谈VPS

    1 VPS的原理 VPS是采用VPS VirtualPrivateServer 技术 将一部物理服务器分割成多个虚拟专享服务器 分割后形成的VPS虚拟主机都可分配独立公网IP地址 独立操作系统Windows Linux 独立享用空间 独立内
  • 5.4.1 虚拟专用网VPN

    5 4 1 虚拟专用网VPN 我们已经学习了因特网的路由协议 5 3 1 因特网的路由协议 一 5 3 2 因特网的路由协议 二 基于距离向量算法的RIP协议 5 3 3 因特网的路由协议 三 OSPF协议 5 3 4 因特网的路由协议 四
  • TCP滑动窗口 和 拥塞窗口

    结论 滑动窗口 表征发送端和接收端的接收能力 拥塞窗口 表征中间设备的传输能力 TCP滑动窗口 需要说明一下 如果你不了解TCP的滑动窗口这个事 你等于不了解TCP协议 我们都知道 TCP必需要解决的可靠传输以及包乱序 reordering
  • 计算智能:不确定知识与推理

    不确定性 简单来说 不确定性指的是条件A不能100 推导出结论B 不确定性是现实问题中的常态 比如说医学中症状向疾病的推导等等 信度是智能体主动提供的对于相关命题的信心 它来自于已经接受到的感知信息 智能体获得新的感知信息后 其概率评估应得
  • 语雀导出知识库内所有文档为markdown格式备份

    语雀 写在前面 本复刻版本无法提交issue 有问题欢迎到语雀评论区和我交流 我一般不看csdn的评论 需要找我请到语雀文章评论区 欢迎给我的语雀文档点赞 或者给我复刻的仓库star 另外我想说明一下 复刻这个仓库的目的是为了防止重要的笔记
  • navigator对象

    navigator 对象是 JavaScript 中的一个内置对象 表示当前浏览器的信息和状态 它提供了访问浏览器相关信息的属性和方法 下面是一些 navigator 对象的常见属性和方法 navigator userAgent 返回包含浏
  • MySQL慢查询日志总结

    慢查询日志概念 MySQL的慢查询日志是MySQL提供的一种日志记录 它用来记录在MySQL中响应时间超过阀值的语句 具体指运行时间超过longquerytime值的SQL 则会被记录到慢查询日志中 longquerytime的默认值为10
  • 在ubuntu18.04下安装 elsasticsearch-head 插件

    下载链接地址为 https github com mobz elasticsearch head archive master zip 下载命令如下 下载完成之后使用 unzip master zip 命令对下的压缩包进行解压 查看node
  • Qt连接远程SqlServer数据库,遍历结果集速度慢

    如题 我用qt连接远程的sqlserver数据库 一共110条数据 查询的时候遍历结果非常慢 达到十几秒左右 一开始我以为是结构体本身的问题 把结构体里面的赋值函数参数改成引用传递后 速度有所改善 缩短到9秒左右 但是并没有改变根本 最后我
  • AES-GCM加密算法的简单介绍

    一 什么是AES加密 常见的加密主要分为两类 对称加密和非对称加密 AES加密就是对称加密的一种 即加密和解密使用相同的一把密钥 它的全称是Advanced Encryption Standard 高级加密标准 主要是用来取代DES加密算法
  • mobx v6 + react hook 状态管理配置

    react hook 风格下不再使用class类的形式定义组件 也就不再适用mobx以前版本的装饰器语法 以下分享 reack hook 语法风格下使用 mobx v6 版本的状态管理配置使用方式 相关依赖版本 react 17 0 2 m