如何 运行 redux-saga middleware on the any dispatch action?
How to run redux-saga middleware on the any dispatch action?
我在 'usersaga.js'
中定义了以下 redux saga 中间件函数
import {call, put, takeEvery, takeLatest} from "redux-saga/effects";
import {REQUEST_API_DATA, receiveApiData} from '../store/actions';
import userServiceObject from '../services/user.service';
// Worker Saga function will be fired on USER_FETCH_ACTIONS
export function* getApiData(action){
console.log(action)
try{
// Do Api Call
const data = yield call(userServiceObject.getUsers);
console.log(data.data);
yield put(receiveApiData(data.data));
}
catch(error){
console.log("this is error part and executing");
console.log(error);
}
}
在 'index.js' 文件中,我使用 "run" 方法到 运行 上面的函数 getApiData
import React from 'react';
import ReactDOM from 'react-dom';
import {createStore, combineReducers, applyMiddleware } from 'redux';
import {Provider} from 'react-redux';
import './index.css';
import App from './App';
import * as serviceWorker from './serviceWorker';
import contactReducer from './store/reducers/userlist';
// For Creating Saga and connecting store to saga middleware
import createSagaMiddleware from 'redux-saga';
import {getApiData} from './sagas/usersaga';
const sagaMiddleware = createSagaMiddleware();
const rootReducer = combineReducers({
res: contactReducer
})
const store = createStore(rootReducer, applyMiddleware(sagaMiddleware));
sagaMiddleware.run(getApiData);
ReactDOM.render(<Provider store={store}> <App /> </Provider>, document.getElementById('root'));
serviceWorker.unregister();
它成功地从 api 获取数据并且我成功地处理了 'receiveApiData' 动作生成器函数生成的动作数据。
我想在由 'requestApiData' 调度的函数生成的动作上调用 getApiData 函数。操作名称是“{type: REQUEST_API_DATA}”
如何 运行 我们的 getApiData 用于已调度的操作。
我的用户列表减速器文件如下所示
import * as actionTypes from "../actions";
const initialState = {
value: '',
results: []
};
const reducer = (state = initialState, action) => {
switch(action.type){
case actionTypes.STORE_CONTACTS: // This is for storing all contacts in the state here
console.log(action.values)
return {
...state,
results: action.values
}
case actionTypes.RECEIVE_API_DATA:
console.log(action);
return{
...state,
results: action.contacts
}
case actionTypes.DELETE_CONTACT:
return {
...state,
results: action.value
}
case actionTypes.ADD_CONTACT:
// perform add action to the database, update state and return All new data
return {
...state,
}
case actionTypes.EDIT_CONTACT:
return {
...state,
}
default:
return state;
}
};
export default reducer;
您需要使用实际上已经在 usersaga.js
中导入的 takeEvery
效果
所以在 usersaga.js 中添加这个传奇:
export function* requestWatcher(action){
yield takeEvery('REQUEST_API_DATA', getApiData);
}
并且在 index.js 运行 这个传奇中而不是直接 运行 宁 getApiData
:
sagaMiddleware.run(requestWatcher);
这是 redux-saga 的基本概念之一,我强烈建议阅读文档 https://redux-saga.js.org/docs/basics/UsingSagaHelpers.html
我在 'usersaga.js'
中定义了以下 redux saga 中间件函数import {call, put, takeEvery, takeLatest} from "redux-saga/effects";
import {REQUEST_API_DATA, receiveApiData} from '../store/actions';
import userServiceObject from '../services/user.service';
// Worker Saga function will be fired on USER_FETCH_ACTIONS
export function* getApiData(action){
console.log(action)
try{
// Do Api Call
const data = yield call(userServiceObject.getUsers);
console.log(data.data);
yield put(receiveApiData(data.data));
}
catch(error){
console.log("this is error part and executing");
console.log(error);
}
}
在 'index.js' 文件中,我使用 "run" 方法到 运行 上面的函数 getApiData
import React from 'react';
import ReactDOM from 'react-dom';
import {createStore, combineReducers, applyMiddleware } from 'redux';
import {Provider} from 'react-redux';
import './index.css';
import App from './App';
import * as serviceWorker from './serviceWorker';
import contactReducer from './store/reducers/userlist';
// For Creating Saga and connecting store to saga middleware
import createSagaMiddleware from 'redux-saga';
import {getApiData} from './sagas/usersaga';
const sagaMiddleware = createSagaMiddleware();
const rootReducer = combineReducers({
res: contactReducer
})
const store = createStore(rootReducer, applyMiddleware(sagaMiddleware));
sagaMiddleware.run(getApiData);
ReactDOM.render(<Provider store={store}> <App /> </Provider>, document.getElementById('root'));
serviceWorker.unregister();
它成功地从 api 获取数据并且我成功地处理了 'receiveApiData' 动作生成器函数生成的动作数据。
我想在由 'requestApiData' 调度的函数生成的动作上调用 getApiData 函数。操作名称是“{type: REQUEST_API_DATA}”
如何 运行 我们的 getApiData 用于已调度的操作。
我的用户列表减速器文件如下所示
import * as actionTypes from "../actions";
const initialState = {
value: '',
results: []
};
const reducer = (state = initialState, action) => {
switch(action.type){
case actionTypes.STORE_CONTACTS: // This is for storing all contacts in the state here
console.log(action.values)
return {
...state,
results: action.values
}
case actionTypes.RECEIVE_API_DATA:
console.log(action);
return{
...state,
results: action.contacts
}
case actionTypes.DELETE_CONTACT:
return {
...state,
results: action.value
}
case actionTypes.ADD_CONTACT:
// perform add action to the database, update state and return All new data
return {
...state,
}
case actionTypes.EDIT_CONTACT:
return {
...state,
}
default:
return state;
}
};
export default reducer;
您需要使用实际上已经在 usersaga.js
中导入的takeEvery
效果
所以在 usersaga.js 中添加这个传奇:
export function* requestWatcher(action){
yield takeEvery('REQUEST_API_DATA', getApiData);
}
并且在 index.js 运行 这个传奇中而不是直接 运行 宁 getApiData
:
sagaMiddleware.run(requestWatcher);
这是 redux-saga 的基本概念之一,我强烈建议阅读文档 https://redux-saga.js.org/docs/basics/UsingSagaHelpers.html