S'il vous plaît, vérifiez le Editar
J'essaie de mettre en place des sagas dans mon application.
En ce moment, je vais chercher les accessoires d'une très mauvaise façon. Mon application consiste principalement à interroger des données provenant d'autres sources.
Actuellement, voici comment fonctionne mon application :
J'ai conteneurs qui ont mapStateToProps, mapDispatchToProps.
const mapStateToProps = state => {
return {
someState: state.someReducer.someReducerAction,
};
};
const mapDispatchToProps = (dispatch) => {
return bindActionCreators({someAction, someOtherAction, ...}, dispatch)
};
const something = drizzleConnect(something, mapStateToProps, mapDispatchToProps);
export default something;
et ensuite, j'ai actions comme ceci :
import * as someConstants from '../constants/someConstants';
export const someFunc = (someVal) => (dispatch) => {
someVal.methods.someMethod().call().then(res => {
dispatch({
type: someConstants.FETCH_SOMETHING,
payload: res
})
})
}
et réducteurs comme celui ci-dessous :
export default function someReducer(state = INITIAL_STATE, action) {
switch (action.type) {
case types.FETCH_SOMETHING:
return ({
...state,
someVar: action.payload
});
Je combine les réducteurs avec le combineReducers de redux et les exporte en tant que réducteur unique, que j'importe ensuite dans mon magasin.
Parce que j'utilise drizzle, ma rootSaga est la suivante :
import { all, fork } from 'redux-saga/effects'
import { drizzleSagas } from 'drizzle'
export default function* root() {
yield all(
drizzleSagas.map(saga => fork(saga)),
)
}
Donc, maintenant, lorsque je veux mettre à jour les accessoires, dans la section componentWillReceiveProps
du composant, je le fais : this.props.someAction()
Ok, ça marche, mais je sais que ce n'est pas la bonne méthode. En fait, c'est la pire chose que je puisse faire.
Donc, maintenant, ce que je pense que je devrais faire :
Créer des sagas distinctes, que je vais ensuite importer dans le fichier rootSaga. Ces sagas vont interroger les sources à des intervalles prédéfinis et mettre à jour les props si nécessaire.
Mais mon problème est de savoir comment ces sagas devraient être écrites.
Est-il possible que vous puissiez me donner un exemple, basé sur les actions, les réducteurs et les conteneurs que j'ai mentionnés ci-dessus ?
Edit :
J'ai réussi à suivre les instructions d'Apachuilo.
Jusqu'à présent, j'ai fait ces ajustements :
Le site actions sont comme ça :
export const someFunc = (payload, callback) => ({
type: someConstants.FETCH_SOMETHING_REQUEST,
payload,
callback
})
et le réducteurs comme ceci :
export default function IdentityReducer(state = INITIAL_STATE, {type, payload}) {
switch (type) {
case types.FETCH_SOMETHING_SUCCESS:
return ({
...state,
something: payload,
});
...
J'ai également créé certainesSagas :
...variousImports
import * as apis from '../apis/someApi'
function* someHandler({ payload }) {
const response = yield call(apis.someFunc, payload)
response.data
? yield put({ type: types.FETCH_SOMETHING_SUCCESS, payload: response.data })
: yield put({ type: types.FETCH_SOMETHING_FAILURE })
}
export const someSaga = [
takeLatest(
types.FETCH_SOMETHING_REQUEST,
someHandler
)
]
et ensuite, mis à jour le rootSaga :
import { someSaga } from './sagas/someSagas'
const otherSagas = [
...someSaga,
]
export default function* root() {
yield all([
drizzleSagas.map(saga => fork(saga)),
otherSagas
])
}
De plus, l'api est la suivante :
export const someFunc = (payload) => {
payload.someFetching.then(res => {
return {data: res}
}) //returns 'data' of undefined but just "return {data: 'something'} returns that 'something'
Donc, j'aimerais mise à jour mes questions :
-
Mes API sont dépendantes de l'état du magasin. Comme vous pouvez le comprendre, je suis en train de construire une dApp. Donc, Drizzle (un middleware que j'utilise afin de d'accéder à la blockchain), doit être lancé avant que j'appelle les APIs et de renvoyer des informations aux composants. Ainsi,
a. En essayant de lire l'état avec getState(), j'obtiens des contrats vides (contrats qui ne sont pas encore "prêts"). (contrats qui ne sont pas encore "prêts") - je ne peux donc pas récupérer l'info - je Je n'aime pas lire l'état depuis le magasin, mais...
b. Passer l'état à travers le composant (this.props.someFunc(someState), me retourne
Cannot read property 'data' of undefined
Ce qui est amusant, c'est que je peux consoler.log l'état l'état (il semble correct) et en essayant de simplement `retourner {data : 'someData'}, les props reçoivent les données. -
Dois-je exécuter this.props.someFunc() sur, par exemple, componentWillMount() ? Est-ce la bonne façon de mettre à jour les props ?
Désolé pour ce très long message, mais je voulais être précis.
Modifier pour 1b : Uhh, tant de modifications :) J'ai résolu le problème de la résolution indéfinie. Il fallait juste écrire l'API comme ceci :
export function someFunc(payload) {
return payload.someFetching.then(res => {
return ({ data: res })
})
}