跳至主要内容

入门

安装

$ npm install redux-saga

或者

$ yarn add redux-saga

或者,您可以直接在 HTML 页面中的 <script> 标签中使用提供的 UMD 构建。请参阅此部分.

使用示例

假设我们有一个 UI,当点击按钮时,它会从远程服务器获取一些用户数据。(为了简洁,我们只展示触发代码的动作。)

class UserComponent extends React.Component {
...
onSomeButtonClicked() {
const { userId, dispatch } = this.props
dispatch({type: 'USER_FETCH_REQUESTED', payload: {userId}})
}
...
}

组件向 Store 分发一个普通对象动作。我们将创建一个 Saga,它会监视所有 USER_FETCH_REQUESTED 动作并触发 API 调用以获取用户数据。

sagas.js

import { call, put, takeEvery, takeLatest } from 'redux-saga/effects'
import Api from '...'

// worker Saga: will be fired on USER_FETCH_REQUESTED actions
function* fetchUser(action) {
try {
const user = yield call(Api.fetchUser, action.payload.userId)
yield put({ type: 'USER_FETCH_SUCCEEDED', user: user })
} catch (e) {
yield put({ type: 'USER_FETCH_FAILED', message: e.message })
}
}

/*
Starts fetchUser on each dispatched `USER_FETCH_REQUESTED` action.
Allows concurrent fetches of user.
*/
function* mySaga() {
yield takeEvery('USER_FETCH_REQUESTED', fetchUser)
}

/*
Alternatively you may use takeLatest.

Does not allow concurrent fetches of user. If "USER_FETCH_REQUESTED" gets
dispatched while a fetch is already pending, that pending fetch is cancelled
and only the latest one will be run.
*/
function* mySaga() {
yield takeLatest('USER_FETCH_REQUESTED', fetchUser)
}

export default mySaga

为了运行我们的 Saga,我们需要使用 redux-saga 中间件将其连接到 Redux Store。

main.js

import { configureStore } from '@reduxjs/toolkit'
import createSagaMiddleware from 'redux-saga'

import reducer from './reducers'
import mySaga from './sagas'

// create the saga middleware
const sagaMiddleware = createSagaMiddleware()
// mount it on the Store
const store = configureStore({
reducer,
middleware: (getDefaultMiddleware) => getDefaultMiddleware().concat(sagaMiddleware),
})

// then run the saga
sagaMiddleware.run(mySaga)

// render the application

在浏览器中使用 UMD 版本

redux-sagadist/ 文件夹中也提供了一个 **UMD** 版本。使用 UMD 版本时,redux-saga 在窗口对象中可用作 ReduxSaga。这使您能够在不使用 ES6 import 语法的情况下创建 Saga 中间件,例如

var sagaMiddleware = ReduxSaga.default()

如果您不使用 Webpack 或 Browserify,UMD 版本非常有用。您可以直接从 unpkg 访问它。

以下版本可用

重要! 如果您要定位的浏览器不支持 *ES2015 生成器*,您必须对其进行转译(例如,使用 babel 插件)并提供有效的运行时,例如 这里提供的运行时。运行时必须在 **redux-saga** 之前导入。

import 'regenerator-runtime/runtime'
// then
import sagaMiddleware from 'redux-saga'