Eine alternative Möglichkeit, wenn Sie React-Redux verwenden und diese Aktion nur an einer Stelle benötigen, ODER wenn Sie ein HOC (Higher oder Component, müssen Sie nicht wirklich verstehen, dass das Wichtigste darin besteht, dass dies Ihr HTML aufblähen könnte) überall dort sind, wo Sie es benötigen Bei diesem Zugriff werden Mergeprops verwendet, wobei die zusätzlichen Parameter an die Aktion übergeben werden:
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)
Wenn Sie mergeProps verwenden, wird das, was Sie dort zurückgeben, zu den Requisiten hinzugefügt. MapState und mapDispatch dienen nur dazu, die Argumente für mergeProps bereitzustellen. Mit anderen Worten, diese Funktion fügt dies Ihren Komponenten-Requisiten hinzu (Typoskript-Syntax):
{hydratedUpdateProduct: () => void}
(Beachten Sie, dass die Funktion die Aktion selbst zurückgibt und nicht ungültig ist. In den meisten Fällen wird dies jedoch ignoriert.)
Aber was Sie tun können, ist:
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);
Dadurch erhalten die Requisiten Folgendes:
{
hydratedUpdateProduct: () => void,
otherAction: (param) => void,
accountType: string,
accountNumber: string,
product: string,
}
Insgesamt ist die völlige Ablehnung, die die Redux-Betreuer zeigen, um die Funktionalität ihres Pakets zu erweitern, um solche Wünsche auf eine gute Weise zu berücksichtigen, die ein Muster für diese Funktionen ohne Unterstützung der Fragmentierung des Ökosystems schaffen würde, beeindruckend.
Pakete wie Vuex, die nicht so hartnäckig sind, haben nicht annähernd so viele Probleme mit Menschen, die Antimuster missbrauchen, weil sie verloren gehen, und unterstützen eine sauberere Syntax mit weniger Boilerplate als jemals zuvor mit Redux und den besten unterstützenden Paketen. Und obwohl das Paket viel vielseitiger ist, ist die Dokumentation leichter zu verstehen, da sie nicht in den Details verloren geht, wie dies bei der Redux-Dokumentation der Fall ist.