Альтернативний спосіб, якщо ви використовуєте реакцію-редукцію і потребуєте цієї дії лише в одному місці, АБО все гаразд із створенням 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. Отже, іншими словами, ця функція додасть це до компонентного реквізиту (синтаксис TypeScript):
{hydratedUpdateProduct: () => 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,
}
В цілому, хоча повне невдоволення редукціоністів демонструє розширення функціональних можливостей свого пакету, щоб добре включати такі побажання, що створило б шаблон для цих функцій БЕЗ підтримки фрагментації екосистеми, вражає.
Такі пакети, як Vuex, які не такі вперті, не мають майже стільки проблем з людьми, які зловживають антипаттернами, тому що вони губляться, підтримуючи при цьому чистіший синтаксис із меншою кількістю шаблонів, ніж ви коли-небудь архівували за допомогою redux та найкращих допоміжних пакетів. І незважаючи на те, що пакет є набагато універсальнішим, документацію легше зрозуміти, оскільки вона не заблукає в деталях, як це зазвичай робить документація reduxs.