Есть несколько способов сделать то, что вы хотите, и выбор одного зависит как от вашего варианта использования, так и от предпочтений.
Способ передачи его вниз
Самый простой способпросто передать объект до саги myAction
.
yield* saga1(session)
...
fork(watchAction1, session)
...
yield takeEvery(actionTypes.SEND_EVENT, myAction, session)
...
function* myAction(session, action) {
console.log(session);
}
Это достаточно хорошее решение, если у вас всего несколько саг или если структура саг плоская, поэтому вы ненужно передать его слишком глубоко.
Метод импорта
Другой способ сделать это - импортировать объект сеанса.Если вам сначала нужно выполнить некоторую инициализацию, вы можете создать файл, который экспортирует одноэлементный объект, например так:
// session.js
import Session from 'session-library';
const config = {foo: 'bar'};
export default new Session(config);
Теперь вы можете импортировать этот файл туда, где вам нужен доступ к вашему сеансу.Вам не нужно пропускать его через несколько файлов / саг, просто чтобы передать его одной из ваших саг в глубине души.Тем не менее, это может быть немного более проблематичным, если вам нужно заменить объект сеанса.
// action.js
import session from 'path/to/session';
function* myAction(action) {
console.log(session);
}
Метод контекста
Третий метод заключается в использовании setContext/getContext
эффектов.Это мой личный фаворит, так как он не использует модульную систему, не требует специальных файлов, и вы можете запросить доступ к объектам, таким как session
, именно в тот момент, когда вам это нужно, даже в середине саги.
// store.js
const stuffYouWantToAccess = {session};
sagaMiddleware.run(function* (stuffYouWantToAccess) {
yield setContext(stuffYouWantToAccess);
...
}, stuffYouWantToAccess);
// action.js
function* myAction(action) {
const session = yield getContext('session');
console.log(session);
}
Это также не идеально, хотя контекст работает немного как глобальные переменные, и вам необходимо получить доступ к значениям контекста, используя строковые имена ('session'
), что иногда может быть проблемой (например, при использовании закрытиякомпилятор или проверка типов).
Так что выбирайте свой яд:)