React 第三方状态管理库相关 -- Redux & MobX 篇

一、redux

首先安装依赖:

javascript 复制代码
npm install redux react-redux @reduxjs/toolkit

示例代码:

javascript 复制代码
// src/store/index.js
import { configureStore } from '@reduxjs/toolkit'
import couterSlice from './couterSlice'

const store  = configureStore({
    reducer:{
        couterSlice
    }
})

export default store
javascript 复制代码
// src/store/couterSlice.js
import { createSlice } from '@reduxjs/toolkit';

const couterSlice = createSlice({
    name:'couterSlice',
    initialState:{ count: 0 },
    reducers:{
        increment: (state) => { state.count++ },
        decrement: (state) => { state.count++ }
    },
    extraReducers:(builder) => { }
})
export const { increment,decrement } = couterSlice.actions
export default couterSlice.reducer
javascript 复制代码
// src/main.jsx
import { StrictMode } from 'react'
import { createRoot } from 'react-dom/client'
import './index.css'
import App from './App.jsx'
import { Provider } from 'react-redux'
import store from '@/store'

createRoot(document.getElementById('root')).render(
  <StrictMode>
    <Provider store={store}>
      <App />
    </Provider>
  </StrictMode>,
)

具体使用示例:

javascript 复制代码
// src/App.jsx
import { useState } from 'react'
import reactLogo from './assets/react.svg'
import viteLogo from '/vite.svg'
import './App.css'
import { useSelector, useDispatch } from 'react-redux'
import { increment } from '@/store/couterSlice.js'

function App() {
  const [count, setCount] = useState(0)
  const dispatch = useDispatch()
  const counter = useSelector((state) => state.couterSlice)
  console.log(counter);
  return (
    <>
      <div>
        <a href="https://vite.dev" target="_blank">
          <img src={viteLogo} className="logo" alt="Vite logo" />
        </a>
        <a href="https://react.dev" target="_blank">
          <img src={reactLogo} className="logo react" alt="React logo" />
        </a>
      </div>
      <h1>Vite + React</h1>
      <div className="card">
        <button onClick={() => dispatch(increment())}>
          count is {counter.count}
        </button>
        <p>
          Edit <code>src/App.jsx</code> and save to test HMR
        </p>
      </div>
      <p className="read-the-docs">
        Click on the Vite and React logos to learn more
      </p>
    </>
  )
}

export default App

持久化存储参考: react-redux 数据持久化-CSDN博客

二、MobX

首先安装依赖:

javascript 复制代码
npm install mobx mobx-react-lite

示例代码:

javascript 复制代码
// src/store/index.js
import React from 'react'
import counter from './counterStore'

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

const rootStore = new RootStore()
const context = React.createContext(rootStore)
const useStore = () => React.useContext(context)
export { useStore }
javascript 复制代码
// src/store/counterStore.js
import { makeAutoObservable } from 'mobx'

class CounterStore {
    count = 0
    constructor() {
        makeAutoObservable(this)
    }
    addCount = () => {
        this.count++
    }
    get Count() {
        return this.count
    }
}

const counter = new CounterStore()
export default counter
javascript 复制代码
// src/App.jsx
import { observer } from 'mobx-react-lite'
import { useStore } from './store'
function App() {
  const store = useStore()
  return (
    <div className="App">
      <button onClick={() => store.counterStore.addCount()}>
        {store.counterStore.count}
      </button>
    </div>
  )
}
export default observer(App)
相关推荐
A5rZ21 分钟前
缓存投毒进阶 -- justctf 2025 Busy Traffic
前端·javascript·缓存
未来之窗软件服务1 小时前
浏览器CEFSharp133+X86+win7 之多页面展示(三)
前端·javascript·浏览器开发·东方仙盟
胡斌附体1 小时前
elementui cascader 远程加载请求使用 选择单项等
前端·javascript·elementui·cascader·可独立选中单节点
烛阴1 小时前
Vector Normaliztion -- 向量归一化
前端·webgl
孟陬2 小时前
写一个 bun 插件解决导入 svg 文件的问题 - bun 单元测试系列
react.js·单元测试·bun
孟陬3 小时前
CRA 项目 create-react-app 请谨慎升级 TypeScript
react.js·typescript
甘露寺3 小时前
深入理解 Axios 请求与响应对象结构:从配置到数据处理的全面指南
javascript·ajax
追梦人物3 小时前
Uniswap 手续费和协议费机制剖析
前端·后端·区块链
招风的黑耳4 小时前
Axure 高阶设计:打造“以假乱真”的多图片上传组件
javascript·图片上传·axure
拾光拾趣录4 小时前
基础 | 🔥6种声明方式全解⚠️
前端·面试