Uma maneira alternativa, se você usar o react-redux e precisar dessa ação apenas em um lugar OU está bem com a criação de um HOC (componente superior de oder, realmente não precisa entender que o importante é que isso pode inchar seu html) em todos os lugares que você precisar esse acesso é para usar mergeprops com os parâmetros adicionais sendo passados para a ação:
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 você usa mergeProps, o que você retorna será adicionado aos props, mapState e mapDispatch servirão apenas para fornecer os argumentos para mergeProps. Então, em outras palavras, esta função irá adicionar isso aos seus componentes (sintaxe de texto digitado):
{hydratedUpdateProduct: () => void}
(observe que a função realmente retorna a própria ação e não nula, mas você irá ignorar isso na maioria dos casos).
Mas o que você pode fazer é:
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);
isso fornecerá o seguinte material aos adereços:
{
hydratedUpdateProduct: () => void,
otherAction: (param) => void,
accountType: string,
accountNumber: string,
product: string,
}
No geral, embora a desaprovação completa dos redux-mantenedores mostram para expandir a funcionalidade de seu pacote para incluir tais desejos de uma boa maneira, o que criaria um padrão para essas funcionalidades SEM apoiar a fragmentação do ecossistema, é impressionante.
Pacotes como o Vuex, que não são tão teimosos, não têm tantos problemas com pessoas abusando de antipadrões porque eles se perdem, ao mesmo tempo em que oferecem uma sintaxe mais limpa com menos clichê do que você jamais arquivará com redux e os melhores pacotes de suporte. E apesar do pacote ser muito mais versátil, a documentação é mais fácil de entender porque eles não se perdem nos detalhes como a documentação do redux tende a fazer.