Перейти к основному содержимому

Начало работы

Это руководство поможет вам настроить Sagun в вашем React приложении.

Установка

# Сначала установите peer зависимости:
npm install react react-dom redux react-redux redux-saga immutable

# Затем установите Sagun:
npm install @iiiristram/sagun

# Также рекомендуется установить для строго типизированных эффектов саг:
npm install typed-redux-saga

Конфигурация TypeScript

Sagun использует декораторы TypeScript. Включите их в tsconfig.json:

{
"compilerOptions": {
"experimentalDecorators": true
}
}

Инициализация приложения

Ниже представлен пример типовой инициализации приложения на базе redux и redux-saga, и подсвечены строки, которые необходимо добавить, чтобы настроить работу фреймворка

// bootstrap.tsx
import { applyMiddleware, createStore, combineReducers } from 'redux';
import { Provider } from 'react-redux';
import createSagaMiddleware from 'redux-saga';
import React from 'react';
import ReactDOM from 'react-dom';
import { call } from 'typed-redux-saga';
import {
ComponentLifecycleService,
OperationService,
asyncOperationsReducer,
Root,
useOperation,
} from '@iiiristram/sagun';

import {App} from './App';

// 1. Создаём saga middleware
const sagaMiddleware = createSagaMiddleware();

// 2. Создаём Redux store с reducer для операций
const store = applyMiddleware(sagaMiddleware)(createStore)(
combineReducers({
asyncOperations: asyncOperationsReducer,
})
);

// 3. Настраиваем путь к операциям в state
useOperation.setPath(state => state.asyncOperations);

// 4. Создаём основные сервисы
const operationService = new OperationService();
const componentLifecycleService = new ComponentLifecycleService(operationService);

// 5. Запускаем saga middleware с основными сервисами
sagaMiddleware.run(function* () {
yield* call(operationService.run);
yield* call(componentLifecycleService.run);
});

// 6. Рендерим приложение
ReactDOM.render(
<Root
operationService={operationService}
componentLifecycleService={componentLifecycleService}
>
<Provider store={store}>
<App />
</Provider>
</Root>,
document.getElementById('app')
);