Компоненты и (rootReducer, rootSaga) подключены к хранилищу, через которое поступают все действия и реквизиты. Вы можете отладить в браузере, чтобы увидеть, как идут данные.
Вот официальная документация. Это легко и довольно коротко, но важно понять все это редуктор, действие, подпорки. Также есть небольшой фрагмент кода, чтобы увидеть, как он работает.
Redux документы
Пример короткого притока
Также здесь выписка из аналогичного проекта. Добавлено еще несколько строк из точек разрыва.
UPD:
Он принимает данные от rootReducer, который подключен к хранилищу. Если в инициализирован хранилище и объединены все редукторы, то так называемый combReducers:
export interface RootState {
books: BooksState;
authors: AuthorsState;
}
const rootReducer: Reducer<RootState> = combineReducers<RootState>({
authors: authorReducer,
books: booksReducer
})
export default rootReducer;
После того, как редуктор вернул полезную нагрузку (данные), он принимается селектором:
export const getData = (state: RootState) => state.books.data
и он используется в mapStateToProps, я использовал connect для вызова функции высокого порядка и сбора данных из хранилища и создания контейнера. Compose не является излишним, и если вы используете его, вы должны проверить порядок ваших промежуточных программ (compose (m1, m2, m3 ...) справа налево):
const mapStateToProps = (state: RootState) => ({
books: getData(state),
pagination: getPagination(state),
loading: getLoadingStatus(state),
error: getError(state),
})
export default connect(mapStateToProps, { loadBooks, searchBook, removeBook, addBook, editBook, sortBook,
})(FilterableBooksTable);
Затем речь идет о «умном» компоненте:
export interface BooksTableProps {
readonly books: Array<Book>;
loadBooks: (pagination: Pagination) => object;
}
export interface BookFormProps {
addBook: (name: string, author: string, cost: number, genre: string) => object;
}
type FilterableBooksTableProps = BooksTableProps & BookFormProps;
export default class FilterableBooksTable extends React.Component<FilterableBooksTableProps> {
render() {
const {
books,
loadBooks,
addBook,
} = this.props
return (
<div>
<Row>
<Col span={4}>
<BookForm
addBook={addBook}
>
</Col>
<Col span={16}>
<BookTable
books={books}
loadBooks={loadBooks}
/>
</Col>
</Row>
</div>
)
}
И, наконец, данные доходят до «тупого» компонента:
render() {
const {
books
} = this.props;
return (
<div>
<Table
dataSource={books}
...
/>
</div>
)
}
Я не знаю, как настроен ваш магазин, поэтому я добавлю мой со всеми сагами, редукторами, подключенными к нему:
import { Store, createStore, applyMiddleware } from 'redux';
import createSagaMiddleware from 'redux-saga';
import { composeWithDevTools } from 'redux-devtools-extension';
import rootReducer, { RootState } from '@redux/rootReducer';
import rootSaga from '@redux/sagas';
export default function configureStore(initialState?: RootState): Store<RootState> {
const sagaMiddleware = createSagaMiddleware();
const middlewares = [sagaMiddleware];
const composeEnhancers = composeWithDevTools({});
const enhancer = composeEnhancers(
applyMiddleware(...middlewares)
);
const store = createStore(
rootReducer,
initialState!,
enhancer,
);
if (module.hot) {
module.hot.accept('@redux/rootReducer', () => {
const nextRootReducer = require('@redux/rootReducer').default;
store.replaceReducer(nextRootReducer);
});
}
sagaMiddleware.run(rootSaga);
return store;
}