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

React中Redux的基本用法

Redux是React中使用较多的状态管理库,这篇文章主要介绍了Redux的基本用法,快来看看吧
首先我们需要新建一个React项目,我使用的React+TS,文件结构如下
在这里插入图片描述
Redux的相关使用主要在store文件中

  1. Store:存储整个应用的状态
  2. Action:一个描述发生了什么的JS对象
  3. Reducer:一个纯函数,根据传入的action更新相关的状态
  4. Dispatch:发送action到reducer的方法
  5. Selector:从Store中获取函数的函数

接下来,需要安装相关的包

npm install redux react-redux

之后,我们在相关文件中写相关的规范

  1. types.ts
export const INCREMENT = 'INCREMENT';
export const DECREMENT = 'DECREMENT';
  1. action.ts
import { INCREMENT, DECREMENT } from './types';

export const increment = () => ({
  type: INCREMENT,
});

export const decrement = () => ({
  type: DECREMENT,
});
  1. reducers.ts
import { INCREMENT, DECREMENT } from './types';

const initialState = {
  count: 0,
};

const counterReducer = (state = initialState, action) => {
  switch (action.type) {
    case INCREMENT:
      return { ...state, count: state.count + 1 };
    case DECREMENT:
      return { ...state, count: state.count - 1 };
    default:
      return state;
  }
};

export default counterReducer;
  1. index.js
import { createStore } from 'redux';
import { composeWithDevTools } from 'redux-devtools-extension';
import counterReducer from './reducers';

const store = createStore(counterReducer, composeWithDevTools());

export default store;

之后,我们需要将store提供给React应用来使用,在main.tsx中,进行如下修改

// import { StrictMode } from 'react'
import { createRoot } from 'react-dom/client'
import App from './App.tsx'
import './index.css'
import store from './store/index.ts'
import { Provider } from 'react-redux'

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

这样做的目的是,将 Redux Store 注入到整个 React 应用中,这样子组件都可以通过 useSelector 和 useDispatch 访问 Store

接下来,就是在组件中进行使用了,在我们的App.tsx文件中,将相关的方法进行引用

import './App.css'
import { useSelector, useDispatch } from 'react-redux';
import { increment, decrement } from './store/action';

function App() {
  // 使用 useSelector 从 Redux Store 获取数据
  const count = useSelector((state) => state.count);

  // 使用 useDispatch 发送 action
  const dispatch = useDispatch();
  return (
    <>
      <div>
        <h2>Count: {count}</h2>
        <button onClick={() => dispatch(increment())}>Increment</button>
        <button onClick={() => dispatch(decrement())}>Decrement</button>
      </div>
    </>
  )
}

export default App

useSelector() 可以从 Store 中选择数据,然后调用useDispatch() 返回 dispatch 方法,可以触发相关的action,这样就可以成功使用Redux了

但是,在实际开发中,我们大多数情况下都是会处理异步的情况,那么在Redux中如何使用异步呢?由于Redux本身只支持同步数据流,如果处理异步操作,我们需要使用React Thunk中间件
首先需要在store文件夹下边index.ts文件中进行如下修改

import { createStore, applyMiddleware } from 'redux';
import thunk from 'redux-thunk';
import { composeWithDevTools } from 'redux-devtools-extension';
import counterReducer from './reducers';

const store = createStore(
  counterReducer,
  composeWithDevTools(applyMiddleware(thunk))
);

export default store;

接下来就可以在action.ts文件中封装相关的异步操作,案例如下

export const fetchData = () => {
  return async (dispatch) => {
    try {
      const response = await fetch('www.baidu.com');
      const res = await response.json();
      dispatch({ type: 'FETCH_SUCCESS', payload: data });
    } catch (error) {
      dispatch({ type: 'FETCH_ERROR', payload: error });
    }
  };
};

最后在reducers.ts中进行数据返回即可

const initialState = {
  count: 0,
  data: null,
  error: null,
};

const counterReducer = (state = initialState, action) => {
  switch (action.type) {
    case 'FETCH_SUCCESS':
      return { ...state, data: action.payload };
    case 'FETCH_ERROR':
      return { ...state, error: action.payload };
    default:
      return state;
  }
};

export default counterReducer;

以上便是Redux的基本操作,希望可以帮助到你


http://www.kler.cn/a/398442.html

相关文章:

  • 校园二手交易网站毕业设计基于SpringBootSSM框架
  • Pandas进行周期与时间戳转换
  • MySQL数据库:SQL语言入门 【2】(学习笔记)
  • redis和mongodb等对比分析
  • CSS回顾-基础知识详解
  • 活动|华院计算作为联盟理事单位出席进博会全球人工智能合作论坛
  • uniapp: vite配置rollup-plugin-visualizer进行小程序依赖可视化分析减少vender.js大小
  • 华为USG5500防火墙配置NAT
  • 【网络安全 | 漏洞挖掘】通过密码重置污染实现账户接管
  • 《TCP/IP网络编程》学习笔记 | Chapter 13:多种 I/O 函数
  • git的常用用法(最简精华版)
  • 【软考】系统架构设计师-计算机系统基础(4):计算机网络
  • 任意文件下载漏洞
  • 基于Jmeter的分布式压测环境搭建及简单压测实践
  • WSL--无需安装虚拟机和docker可以直接在Windows操作系统上使用Linux操作系统
  • Http常⻅见请求/响应头content-type内容类型讲解(笔记)
  • Linux的指令(三)
  • 【GPTs】Ai-Ming:AI命理助手,个人运势与未来发展剖析
  • Spring-事务学习
  • yolov8目标检测如何设置背景/无标签图像参与训练
  • cooper+隐含数+2元cooper
  • 编辑器vim 命令的学习
  • 快速了解Zookeeper和etcd实现的分布式锁
  • 关于宝塔无法在php中安装fileinfo
  • 信也科技和云杉网络的AI可观测性实践分享
  • 如何将32位数据转化1bit valid,1bit modified,19bit tag, 3 bit index, 8bit数据