Как передать несериализуемый реквизит из приложения в сагу о ребенке

#redux-saga

Вопрос:

У меня есть реквизит, который является частью основного приложения. Я попытался передать его в качестве параметра отправки, но reactjs/toolkit пожаловался на это A non-serializable value was detected in the state .

(Я думаю, потому что prop-это экземпляр класса).

Как я могу использовать эту опору внутри саги?

Для визуализации это то, что мне нужно использовать:

введите описание изображения здесь

Мне нужно иметь возможность использовать ту ual опору , которая находится внутри App , когда пользователь нажимает кнопку где-то в Header .

rootStore.js (не весь код)

 const setupStore = () => {
  const store = configureStore({
      reducer,
      middleware,
  });
  startSaga();
  return store;
};

export default setupStore;
 

rootSaga.js

 import { all,fork } from 'redux-saga/effects';
import createSagaMiddleware from 'redux-saga';

import userSaga from './userSaga';

function* rootSaga() {
    console.log("hi saga")
    yield all([
        fork(userSaga),
    ]);
}

const sagaMiddleware = createSagaMiddleware();

export const startSaga = () => {
    sagaMiddleware.run(rootSaga);
  };
  
export default sagaMiddleware;
 

userSaga.js

 export function* handleUserLogin() {
    console.log('saga handleUserLogin')
    // <=== need to use `ual` here
}

export default function* watchUserLogin() {
    yield takeEvery(fetchLoginRequest.type, handleUserLogin);
}
 

Header.js (соответствующие части):

 import { fetchLoginRequest } from '../reducers/userReducer';
const Header = (props) => {
    const {
        fetchLoginRequest,
      } = props;

    const handleLogin = () => {
        fetchLoginRequest()
    }
}

const mapDispatchToProps = {
    fetchLoginRequest,
};
export default connect(mapStateToProps,mapDispatchToProps)(Header);
  

 

Сага работает, я вижу saga handleUserLogin консоль devtools

Комментарии:

1. Есть ли ual в вашем приложении только один экземпляр объекта? Если да, то не могли бы вы просто передать его в корневую систему для использования sagaMiddleware.run(rootSaga, ual); ? Затем вы можете либо передать его во вложенные саги, либо использовать setContext/getContext , чтобы легко получить его значение в любой вложенной саге, не передавая его на каждом уровне.

2. Да, есть только один пример ual . Как перейти ual от App к rootSaga ?

3. Как и где вы создаете ual экземпляр? В компоненте приложения? В файле, который отображает корневой каталог вашего приложения? Точка входа вашего приложения и его импорт, скорее всего, выполняют множество загрузочных функций для настройки вашего приложения, таких как создание хранилища redux и корня рендеринга вашего приложения, поэтому вам нужно создать ual экземпляр где-нибудь, где вы сможете затем передать его как в качестве реквизита в свой файл ReactDOM.render, так и в файл rootSaga.