UNPKG

react-redux

Version:

Official React bindings for Redux

56 lines (51 loc) 1.66 kB
import { Action, AnyAction, Dispatch } from 'redux' import { Context } from 'react' import { ReactReduxContext, ReactReduxContextValue, } from '../components/Context' import { useStore as useDefaultStore, createStoreHook } from './useStore' /** * Hook factory, which creates a `useDispatch` hook bound to a given context. * * @param {React.Context} [context=ReactReduxContext] Context passed to your `<Provider>`. * @returns {Function} A `useDispatch` hook bound to the specified context. */ export function createDispatchHook< S = unknown, A extends Action = AnyAction // @ts-ignore >(context?: Context<ReactReduxContextValue<S, A>> = ReactReduxContext) { const useStore = // @ts-ignore context === ReactReduxContext ? useDefaultStore : createStoreHook(context) return function useDispatch< AppDispatch extends Dispatch<A> = Dispatch<A> >(): AppDispatch { const store = useStore() // @ts-ignore return store.dispatch } } /** * A hook to access the redux `dispatch` function. * * @returns {any|function} redux store's `dispatch` function * * @example * * import React, { useCallback } from 'react' * import { useDispatch } from 'react-redux' * * export const CounterComponent = ({ value }) => { * const dispatch = useDispatch() * const increaseCounter = useCallback(() => dispatch({ type: 'increase-counter' }), []) * return ( * <div> * <span>{value}</span> * <button onClick={increaseCounter}>Increase counter</button> * </div> * ) * } */ export const useDispatch = /*#__PURE__*/ createDispatchHook()