当前位置: 首页 > news >正文

【Redux】Redux 基本使用

1. Redux 快速上手

Redux 是 React 最常用的集中状态管理工具,类似于Vue中的Pinia(Vuex),可以独立于框架运行。

<button id="decrement">-</button>
<span id="count">0</span>
<button id="increment">+</button><script src="https://unpkg.com/redux@latest/dist/redux.min.js"></script><script>// 1. 定义 reducer 函数 // 根据不同的 action 对象,返回不同的 state// state 管理数据的初始状态// action 对象的 type 属性标记需要做的修改操作function reducer (state = { count: 0 }, action) {switch (action.type) {case 'INCREMENT':// state 是对象,所以返回的数据也是对象return { count: state.count + 1 }case 'DECREMENT':return { count: state.count - 1 }default:return state}}// 2. 使用reducer函数生成store实例const store = Redux.createStore(reducer)// 3. 通过 store 实例的 subscribe 订阅数据变化// 回调函数在每一次 state 发生变化时自动执行store.subscribe(() => {console.log(store.getState())document.getElementById('count').innerText = store.getState().count})// 4. 通过 store 的 dispatch 函数提交 action 的更改状态const inBtn = document.getElementById('increment')inBtn.addEventListener('click', () => {// 匹配的是 action 对象,所以传入 action 对象store.dispatch({type: 'INCREMENT'})})// 减const dBtn = document.getElementById('decrement')dBtn.addEventListener('click', () => {store.dispatch({type: 'DECREMENT'})})
</script>

2.png

2. React 中使用 Redux

2.1 配制环境

  1. Redux Toolkit(RTK)- 官方推荐编写Redux逻辑的方式,简化书写方式
  2. react-redux - 用来链接 Redux 和 React组件的中间件
npx create-react-app react-redux-demo
npm i @reduxjs/toolkit  react-redux 

2.2 使用 RTK

创建 counterStore

// @/store/modules/counterStore.js
import { createSlice } from '@reduxjs/toolkit'const counterStore = createSlice({// 模块名称唯一name: 'counter',// 初始 stateinitialState: {count: 1},// 修改数据的同步方法 支持直接修改reducers: {increment (state) {state.count++},decrement(state){state.count--},addToNum(state, action) {state.count = action.payload}}
})
// 解构出 actionCreater 函数
const { increment,decrement, addToNum } = counterStore.actions// 获取 reducer 函数
const counterReducer = counterStore.reducer// 导出
export { increment, decrement, addToNum }
export default counterReducer
// @/store/modules/channelStore.js
import { createSlice } from "@reduxjs/toolkit"
import axios from "axios"const channelStore = createSlice({name: 'channel',initialState: {channelList: []},reducers: {setChannels (state, action) {state.channelList = action.payload}}
})// 异步请求部分
const { setChannels } = channelStore.actionsconst fetchChannlList = () => {return async (dispatch) => {const res = await axios.get('http://geek.itheima.net/v1_0/channels')dispatch(setChannels(res.data.data.channels))}
}export { fetchChannlList }const reducer = channelStore.reducerexport default reducer
// @/store/index.js
import { configureStore } from '@reduxjs/toolkit'import counterReducer from './modules/counterStore'export default configureStore({reducer: {// 注册子模块counter: counterReducer}
})

为 React 注入 store

// @/index.js
import React from 'react'
import ReactDOM from 'react-dom/client'
import App from './App'
// 导入store
import store from './store'
// 导入store提供组件Provider
import { Provider } from 'react-redux'ReactDOM.createRoot(document.getElementById('root')).render(// 提供store数据<Provider store={store}><App /></Provider>
)

在 React 组件中使用修改 store 中的数据

// App.js
import { useEffect } from 'react'
import { useDispatch, useSelector } from 'react-redux'
// 导入actionCreater
import { inscrement, decrement, addToNum } from './store/modules/counterStore'
import { fetchChannlList } from './store/modules/channelStore'function App () {// useSelector 函数将 store 中的数据映射到组件中 counter 是 store 名字const { count } = useSelector(state => state.counter)const { channelList } = useSelector(state => state.channel)const dispatch = useDispatch()// 使用useEffect触发异步请求执行useEffect(() => {dispatch(fetchChannlList())}, [dispatch])return (<div className="App"><button onClick={() => dispatch(decrement())}>-</button>{count}<button onClick={() => dispatch(inscrement())}>+</button>{/* 变为10 和 变为20 */}<button onClick={() => dispatch(addToNum(10))}>add To 10</button><button onClick={() => dispatch(addToNum(20))}>add To 20</button><ul>{channelList.map(item => <li key={item.id}>{item.name}</li>)}</ul></div>)
}export default App
http://www.lryc.cn/news/235161.html

相关文章:

  • 多线程Thread(初阶一:认识线程)
  • 系列五、GC垃圾回收【四大垃圾算法-复制算法】
  • LeetCode(24)文本左右对齐【数组/字符串】【困难】
  • Spring-Spring之事务底层源码解析
  • 后端面经学习自测(三)
  • 力扣labuladong——一刷day40
  • 在VS Code中使用VIM
  • 注解【元数据,自定义注解等概念详解】(超简单的好吧)
  • vue-pdf在vue框架中的使用
  • Wordpress页面生成器:Elementor 插件制作网站页面教程(图文完整)
  • 完全随机设计的方差分析
  • 035、目标检测-物体和数据集
  • 【开源】基于Vue.js的社区买菜系统的设计和实现
  • 【双指针】复写0
  • 记录一些涉及到界的题
  • Linux秋招面试题
  • OPPO发布AndesGPT大模型;Emu Video和Emu Edit的新突破
  • 2311rust,到46版本更新
  • Rust根据条件删除相邻元素:dedup
  • 2023年(第六届)电力机器人应用与创新发展论坛-核心PPT资料下载
  • Android BitmapFactory.decodeResource读取原始图片装载成原始宽高Bitmap,Kotlin
  • 阿里云服务器 手动搭建WordPress(CentOS 8)
  • 竞赛 题目:基于深度学习的中文对话问答机器人
  • CCF ChinaSoft 2023 论坛巡礼|软件测试产教研融合论坛
  • 浅谈WPF之控件模板和数据模板
  • 微信小程序会议OA首页-开发说明创建项目关于flex布局关于尺寸单位(rpx)关于WXS轮播图会议信息
  • Linux上编译和安装SOFA23.06
  • 定时任务 Spring Task
  • golang 上传图片 --chatGPT
  • Android Studio 写一个Java调用c++ 的demo