React中使用redux-saga

React中使用redux-saga

一、redux-saga简介

redux-saga是管理redux异步操作的中间件,redux-saga通过创建sagas将所有异步操作逻辑
收集在一个地方集中处理。

由于使用了generator函数,redux-saga让你可以用 同步的方式来写异步代码。

二、redux-saga安装

npm install redux-saga -s

三、redux-saga配置

import { takeEvery, put, all } from 'redux-saga/effects'
// put 它是saga提供给我们,用于发送指令给reducer来完成同步操作
// takeEvery 监听每一次dispatch发送的指令
// all方法,可以监听多个监听saga,它的功能和Promise.all方法一样

// 自动导入模块化的子saga文件
//  require.context('目标目录',是否向目标目录的子目录查找,文件后缀)
const moduleFn = require.context('../views', true, /saga\.js/i)
const modules = moduleFn.keys().reduce((prev, curr) => {
  let itor = moduleFn(curr).default
  prev.push(itor())
  return prev
}, [])

// saga中间件 主saga,用于区别是否需要saga来处理异步操作,如果没有异步,则放行
function* mainSaga() {
  yield all(modules)
}

export default mainSaga//引用此文件 可以解构方式使用它 import {mainSaga} from "xxx"

四、redux-saga使用

1.定义子saga

import { takeEvery, put, call } from 'redux-saga/effects'
import { getMenuListApi } from '@/api/userApi'
import { setMenuAction } from '@/actions/userAction'

export default function* watchSaga() {
  yield takeEvery('async_setMenu', setMenu)//使用这个saga需要通过 async_setMenu命令
}

// 账号登录
function* setMenu() {
  let ret = yield call(getMenuListApi)// call 发送请求
  yield put(setMenuAction(ret))// put 将执行完的结果送给redux
}

2.在视图中调用

import React, { useEffect } from "react";
import { useSelector, useDispatch } from "react-redux";
import { asyncSetMenuAction } from "@/actions/userAction";//此目录中封装了命令名称

const Admin = ({ history: { push }, location: { pathname } }) => {
  const dispatch = useDispatch();

  useEffect(() => {
    dispatch(asyncSetMenuAction());//asyncSetMenuAction中有 async_setMenu 命令类型
  }, []);

  return (
    <>
     saga使用
    </>
  );
};

export default Admin;

在搭建一个使用 Redux-SagaReact 项目时,需要完成以下几个关键步骤:安装依赖、创建 Redux Store、配置 Redux-Saga 中间件、编写 Redux reducer、创建 Saga 逻辑以及将 ReduxReact 组件连接起来。 ### 项目依赖安装 首先,确保项目中已安装 `react` 和 `react-dom`。接着安装 Redux 及其相关依赖: ```bash npm install redux react-redux redux-saga ``` 如果希望使用 Redux DevTools 调试工具,也可以安装 `redux-devtools-extension`: ```bash npm install --save-dev redux-devtools-extension ``` ### 创建 Redux Store 在 `store/index.js` 中创建 Redux Store 并应用 Redux-Saga 中间件: ```javascript import { createStore, applyMiddleware } from 'redux'; import { composeWithDevTools } from 'redux-devtools-extension'; import createSagaMiddleware from 'redux-saga'; import rootReducer from './reducers'; import rootSaga from './sagas'; const sagaMiddleware = createSagaMiddleware(); const store = createStore( rootReducer, composeWithDevTools(applyMiddleware(sagaMiddleware)) ); sagaMiddleware.run(rootSaga); export default store; ``` ### 配置 React 项目使用 Redux 在 `index.js` 中,使用 `Provider` 将 Redux Store 注入到 React 应用中: ```javascript import React from 'react'; import ReactDOM from 'react-dom'; import { Provider } from 'react-redux'; import store from './store'; import App from './App'; ReactDOM.render( <Provider store={store}> <App /> </Provider>, document.getElementById('root') ); ``` ### 编写 Redux Reducer 创建 `reducers/index.js` 文件,定义 Redux 的 reducer 逻辑: ```javascript import { combineReducers } from 'redux'; const initialState = { count: 0, }; function counterReducer(state = initialState, action) { switch (action.type) { case 'INCREMENT': return { ...state, count: state.count + 1 }; default: return state; } } const rootReducer = combineReducers({ counter: counterReducer, }); export default rootReducer; ``` ### 创建 Redux-Saga 逻辑 定义 `sagas/index.js` 文件来编写异步逻辑,例如: ```javascript import { put, takeEvery, delay } from 'redux-saga/effects'; function* incrementAsync() { yield delay(1000); // 模拟异步操作 yield put({ type: 'INCREMENT' }); } function* watchIncrementAsync() { yield takeEvery('INCREMENT_ASYNC', incrementAsync); } export default watchIncrementAsync; ``` ### 在组件中使用 ReduxRedux-Saga 最后,在 React 组件中使用 `useDispatch` 和 `useSelector` 来派发 action 并获取状态: ```javascript import React from 'react'; import { useDispatch, useSelector } from 'react-redux'; const Counter = () => { const count = useSelector((state) => state.counter.count); const dispatch = useDispatch(); const handleIncrement = () => { dispatch({ type: 'INCREMENT_ASYNC' }); }; return ( <div> <p>当前计数: {count}</p> <button onClick={handleIncrement}>增加</button> </div> ); }; export default Counter; ``` 通过以上步骤,即可在 React 项目中成功集成 ReduxRedux-Saga,实现状态管理和异步操作的高效处理。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值