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)
相关推荐
帅得不敢出门11 分钟前
Android Framework在mk中新增类似PRODUCT_MODEL的变量并传递给buildinfo.sh及prop属性中
android·linux·前端
她超甜i36 分钟前
css省略号展示,兼容性强,js判断几行,不需要定位
javascript·css·vue.js
小码吃趴菜1 小时前
【无标题】
前端·chrome
毕设源码-朱学姐2 小时前
【开题答辩全过程】以 基于HTML5的购物网站的设计与实现为例,包含答辩的问题和答案
前端·html·html5
梦6502 小时前
CSS 元素垂直水平居中的 8 种方法
前端·css
We་ct2 小时前
LeetCode 68. 文本左右对齐:贪心算法的两种实现与深度解析
前端·算法·leetcode·typescript
ShoreKiten2 小时前
ctfshow-web316
运维·服务器·前端
前端 贾公子2 小时前
release-it 使用指南
前端·javascript
全栈技术负责人3 小时前
前端团队 AI Core Workflow:从心法到落地
前端·人工智能·状态模式
前端 贾公子3 小时前
深入浅出 CSS 属性:pointer-events: none
前端·css