Un modo alternativo, se usi react-redux e hai bisogno di quell'azione solo in un posto OPPURE va bene con la creazione di un HOC (componente superiore oder, non hai davvero bisogno di capire che la cosa importante è che questo potrebbe gonfiare il tuo html) ovunque tu abbia bisogno tale accesso consiste nell'usare mergeprops con i parametri aggiuntivi passati all'azione:
const mapState = ({accountDetails: {stateOfResidenceId}}) => stateOfResidenceId;
const mapDispatch = (dispatch) => ({
pureUpdateProduct: (stateOfResidenceId) => dispatch({ type: types.UPDATE_PRODUCT, payload: stateOfResidenceId })
});
const mergeProps = (stateOfResidenceId, { pureUpdateProduct}) => ({hydratedUpdateProduct: () => pureUpdateProduct(stateOfResidenceId )});
const addHydratedUpdateProduct = connect(mapState, mapDispatch, mergeProps)
export default addHydratedUpdateProduct(ReactComponent);
export const OtherHydratedComponent = addHydratedUpdateProduct(OtherComponent)
Quando usi mergeProps, ciò che restituisci verrà aggiunto agli oggetti di scena, mapState e mapDispatch serviranno solo a fornire gli argomenti per mergeProps. Quindi, in altre parole, questa funzione lo aggiungerà agli oggetti di scena del tuo componente (sintassi del dattiloscritto):
{hydratedUpdateProduct: () => void}
(tieni presente che la funzione restituisce effettivamente l'azione stessa e non è nulla, ma lo ignorerai nella maggior parte dei casi).
Ma quello che puoi fare è:
const mapState = ({ accountDetails }) => accountDetails;
const mapDispatch = (dispatch) => ({
pureUpdateProduct: (stateOfResidenceId) => dispatch({ type: types.UPDATE_PRODUCT, payload: stateOfResidenceId })
otherAction: (param) => dispatch(otherAction(param))
});
const mergeProps = ({ stateOfResidenceId, ...passAlong }, { pureUpdateProduct, ... otherActions}) => ({
...passAlong,
...otherActions,
hydratedUpdateProduct: () => pureUpdateProduct(stateOfResidenceId ),
});
const reduxPropsIncludingHydratedAction= connect(mapState, mapDispatch, mergeProps)
export default reduxPropsIncludingHydratedAction(ReactComponent);
questo fornirà le seguenti cose agli oggetti di scena:
{
hydratedUpdateProduct: () => void,
otherAction: (param) => void,
accountType: string,
accountNumber: string,
product: string,
}
Nel complesso, sebbene il completo dissaproval che i manutentori di redux dimostrano di espandere la funzionalità del loro pacchetto per includere tali desideri in un buon modo, il che creerebbe un modello per queste funzionalità SENZA supportare la frammentazione dell'ecosistema, è impressionante.
Pacchetti come Vuex che non sono così testardi non hanno quasi così tanti problemi con le persone che abusano degli antipattern perché si perdono, mentre supportano una sintassi più pulita con meno boilerplate di quanto tu possa mai archiviare con redux ei migliori pacchetti di supporto. E nonostante il pacchetto sia molto più versatile, la documentazione è più facile da capire perché non si perdono nei dettagli come tende a fare la documentazione di redux.