Я изучаю Redux Saga
и пытаюсь вызывать API каждый раз при визуализации компонента и сохраняю ответ API в объекте State. Я реализовал Component
так:
import React, { Component } from "react";
import { Container } from "./styles";
import { withRouter } from "react-router-dom";
import { bindActionCreators } from "redux";
import * as ratesActions from "../../stores/actions/rates";
import { connect } from "react-redux";
class Main extends Component {
componentDidMount() {
ratesActions.updateRate();
}
render() {
return (
<Container>
<div>
<h1>Hi there!</h1>
</div>
</Container>
);
}
}
const mapStateToProps = state => ({
rates: state.rates
});
const mapDispatchToProps = dispatch =>
bindActionCreators(ratesActions, dispatch);
export default connect(
mapStateToProps,
mapDispatchToProps
)(withRouter(Main));
Я хочу, чтобы каждый раз componentDidMount
вызывал действие updateRate()
. Это действие updateRate()
:
export function updateRate() {
return {
type: "ASYNC_RATE_UPDATED"
};
}
Это действие выполняется, потому что, если я добавлю туда console.log
, я вижу, что оно работает.
Затем я создал свой sagas
:
import api from "../../services/api";
import { call, put, takeLatest, all } from "redux-saga/effects";
export function* updateRateAsync() {
try {
const response = yield call(api.get("public/rates/all"));
yield put({
type: "RATE_UPDATE_SUCCEEDED",
response: response.data
});
} catch (error) {
yield put({
type: "RATE_UPDATE_FAILED",
message: error.message
});
}
}
export function* watchUpdateRates() {
yield takeLatest("ASYNC_RATE_UPDATED", updateRateAsync);
}
export default function* root() {
yield all([watchUpdateRates()]);
}
И мой редуктор:
export default function rates(state = [], action) {
switch (action.type) {
case "RATE_UPDATE_SUCCEEDED":
console.log(action.response[0]["exchange_rate"]);
return {
...state,
rates: {
ves: action.response[0]["exchange_rate"],
brl: null,
ars: null,
inr: null,
zar: null
}
};
default:
return state;
}
}
Однако мой saga
не будет прослушивать мой action
и не будет выполнять вызов API
. Что я делаю не так?
Заранее спасибо!