Альтернативный способ, если вы используете response-redux и нуждаетесь в этом действии только в одном месте ИЛИ все в порядке с созданием HOC (компонент более высокого уровня, на самом деле не нужно понимать, что важно то, что это может раздувать ваш html) везде, где вам нужно этот доступ заключается в использовании mergeprops с дополнительными параметрами, передаваемыми в действие:
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)
Когда вы используете mergeProps, то, что вы возвращаете, будет добавлено к реквизитам, mapState и mapDispatch будут служить только для предоставления аргументов для mergeProps. Другими словами, эта функция добавит это в свойства вашего компонента (синтаксис машинописного текста):
{hydratedUpdateProduct: () => void}
(обратите внимание, что функция фактически возвращает само действие, а не void, но в большинстве случаев вы проигнорируете это).
Но вы можете:
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);
это предоставит реквизитам следующее:
{
hydratedUpdateProduct: () => void,
otherAction: (param) => void,
accountType: string,
accountNumber: string,
product: string,
}
В целом, хотя полное несогласие разработчиков redux с расширением функциональности своего пакета для правильного включения таких пожеланий, которые могли бы создать шаблон для этих функций БЕЗ поддержки фрагментации экосистемы, впечатляет.
Пакеты вроде Vuex, которые не столь упрямы, не имеют почти такого количества проблем с людьми, злоупотребляющими антипаттернами из-за того, что они теряются, при этом поддерживая более чистый синтаксис с меньшим количеством шаблонов, чем вы когда-либо архивируете с помощью redux и лучших поддерживающих пакетов. И, несмотря на то, что пакет более универсален, документацию легче понять, потому что они не теряются в деталях, как это обычно делается в документации по reduxs.