Alternatywny sposób, jeśli używasz React-Redux i potrzebujesz tego działania tylko w jednym miejscu LUB możesz stworzyć HOC (komponent o wyższej jakości, naprawdę nie musisz rozumieć, że ważne jest to, że może to nadmuchać twój HTML) wszędzie, gdzie potrzebujesz dostęp polega na użyciu mergeprops z dodatkowymi parametrami przekazywanymi do akcji:
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)
Kiedy używasz mergeProps, to, co zwrócisz, zostanie dodane do właściwości, mapState i mapDispatch posłużą tylko jako argumenty dla mergeProps. Innymi słowy, ta funkcja doda to do twoich właściwości komponentu (składnia maszynopisu):
{hydratedUpdateProduct: () => void}
(zwróć uwagę, że funkcja w rzeczywistości zwraca samą akcję, a nie void, ale w większości przypadków zignorujesz to).
Ale możesz zrobić:
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);
to dostarczy następujące rzeczy do rekwizytów:
{
hydratedUpdateProduct: () => void,
otherAction: (param) => void,
accountType: string,
accountNumber: string,
product: string,
}
Ogólnie rzecz biorąc, chociaż całkowite zaniedbanie, które opiekunowie redux wykazują, aby rozszerzyć funkcjonalność swojego pakietu tak, aby zawierał takie życzenia w dobry sposób, który stworzyłby wzorzec dla tych funkcji BEZ wspierania fragmentacji ekosystemu, robi wrażenie.
Pakiety takie jak Vuex, które nie są tak uparte, nie mają prawie tak wielu problemów z ludźmi nadużywającymi antywzorców, ponieważ gubią się, jednocześnie wspierając czystszą składnię z mniejszą liczbą szablonów niż kiedykolwiek archiwizujesz za pomocą Redux i najlepszych pakietów pomocniczych. I pomimo tego, że pakiet jest znacznie bardziej wszechstronny, dokumentacja jest łatwiejsza do zrozumienia, ponieważ nie gubi się w szczegółach, takich jak dokumentacja Redux.