📜  redux saga 使用 axios 获取数据 - Javascript (1)

📅  最后修改于: 2023-12-03 15:19:47.768000             🧑  作者: Mango

Redux Saga 使用 Axios 获取数据

Redux Saga 是一个用于管理应用程序副作用(异步操作)的库,通常用于处理数据获取、状态更新等异步操作。当使用 Redux Saga 进行数据获取时,可以结合 Axios 这个流行的 JavaScript 库来发送和接收 HTTP 请求。

前提条件

在介绍 Redux Saga 如何使用 Axios 获取数据之前,需要确保已经安装并配置好 Redux、Redux Saga 和 Axios。

npm install redux redux-saga axios
安装和配置 Saga Middleware

首先,在应用程序的入口点或根文件中,需要创建和配置 Redux Saga 的中间件并将其与 Redux Store 集成。

import { createStore, applyMiddleware } from 'redux';
import createSagaMiddleware from 'redux-saga';
import rootReducer from './reducers';
import rootSaga from './sagas';

const sagaMiddleware = createSagaMiddleware();
const store = createStore(rootReducer, applyMiddleware(sagaMiddleware));
sagaMiddleware.run(rootSaga);

// 其他代码...
创建 Sagas

在 Redux Saga 中,Sagas 是 Generator 函数,用于监听并处理不同的 action 类型。在 Sagas 中可以使用 Axios 发送 HTTP 请求并处理响应。

import { call, put, takeEvery } from 'redux-saga/effects';
import axios from 'axios';

// worker saga,用于实际发送请求并处理响应
function* fetchDataSaga(action) {
   try {
      // 使用 Axios 发送 HTTP GET 请求
      const response = yield call(axios.get, action.url);
      
      // 成功获取数据后,将数据传递给 Redux Store
      yield put({ type: 'FETCH_DATA_SUCCESS', payload: response.data });
   } catch (error) {
      // 发生错误时,将错误信息传递给 Redux Store
      yield put({ type: 'FETCH_DATA_FAILURE', error: error.message });
   }
}

// watcher saga,用于监听触发 fetchDataSaga 的 action 类型
function* watchFetchData() {
   yield takeEvery('FETCH_DATA', fetchDataSaga);
}

// 根 saga,用于在 Redux Store 初始化时启动 watcher saga
export default function* rootSaga() {
   yield all([
      watchFetchData()
   ]);
}

在上述示例中,fetchDataSaga 是一个 worker saga,它使用 Axios 发送 HTTP GET 请求,并根据响应情况发送不同的 action 给 Redux Store。watchFetchData 是一个 watcher saga,它监听触发 'FETCH_DATA' action 类型并执行 fetchDataSaga。在根 saga 中,通过 all 函数启动所有 watcher sagas。

发起获取数据的 Action

为了触发获取数据的过程,需要在应用程序的某个地方发起一个 'FETCH_DATA' action。

import React, { useEffect } from 'react';
import { useDispatch } from 'react-redux';

const App = () => {
   const dispatch = useDispatch();

   useEffect(() => {
      // 在组件渲染时触发获取数据的 action
      dispatch({ type: 'FETCH_DATA', url: 'https://api.example.com/data' });
   }, []);

   // 其他代码...
};

在上述示例中,dispatch 函数用于发送action。当组件渲染时,使用 useEffect 钩子触发获取数据的 action,并指定要获取数据的 URL。

绑定 Redux Store 和组件

为了从 Redux Store 获取数据,可以使用 connect 函数将组件与 Redux Store 绑定在一起。

import { connect } from 'react-redux';

const App = ({ data, isLoading, error }) => {
   // 在组件中使用数据、状态和错误信息
   // ...

   // 其他代码...
};

const mapStateToProps = state => ({
   data: state.data,
   isLoading: state.isLoading,
   error: state.error
});

export default connect(mapStateToProps)(App);

在上述示例中,connect 函数将 Redux Store 中的 dataisLoadingerror 映射到组件的 props,以便在组件中使用。

这是使用 Redux Saga 和 Axios 获取数据的基本示例。你可以根据你的需求进行调整和扩展,以便更好地适应你的应用程序。请确保在使用 Axios 时遵循其文档中的最佳实践和安全准则。

希望这个介绍对你有帮助!如果您有任何问题或疑问,请随时提问。