在组件外部使用 redux 钩子来实现代码的可重用性

Posted

技术标签:

【中文标题】在组件外部使用 redux 钩子来实现代码的可重用性【英文标题】:Using redux hooks outside of a component for code reusability 【发布时间】:2020-04-19 17:41:16 【问题描述】:

我有一个如下的功能组件,我有一个有两个分派的功能。一个设置错误消息,另一个在短暂的超时时间后删除错误消息。设置错误和清除的功能来自许多其他组件,因此我希望在另一个文件中拥有两个调度函数以允许代码可重用性。我无法执行此操作,因为我收到一条错误消息,提示我只能在功能组件内使用 useDispatch。我该如何克服呢?

组件

const Checkout = () => 
  const dispatch = useDispatch();

  const setErrors = (payload) => 
   dispatch(
     type: 'SET_ERRORS',
     payload,
   );

  setTimeout(() => 
    dispatch(
     type: 'CLEAR_ERRORS',
    );
  , 2500);
 ;

 return (
  <>
 // JSX stuff come here
  <>
 )

减速器

const initialState = 
  message: null,
  status: false,
;

export default (state = initialState, action) => 
  switch (action.type) 
    case 'SET_ERRORS':
      return 
        ...state,
        message: action.payload,
        status: true,

      ;
    case 'CLEAR_ERRORS':
      return 
        ...state,
        message: null,
        status: false,

      ;
    default:
      return state;
  
;

【问题讨论】:

【参考方案1】:

UPDATE 2021 带钩子

在组件外部使用useDispatch 会导致错误。

首先,从redux导入你的通用store,然后使用dispatch方法。例如:

import store from 'YOUR_DESTINATION_TO_REDUX_STORE'

function doSomething() 
    // do your stuff
    
    store.dispatch(YOUR_ACTION())

【讨论】:

【参考方案2】:

您可以创建自己的自定义挂钩,例如 useErrorDispatcher,并在许多功能组件中使用它。另请注意,钩子只能在功能组件中使用。

export const useErrorDispatcher = () => 
    const dispatch = useDispatch();

    return (payload) => 
        dispatch( type: 'SET_ERRORS', payload);
        setTimeout(() => dispatch(type: 'CLEAR_ERRORS'), 2500);
    

用法:

const MyComponent = (props) => 
    const errorDispatcher = useErrorDispatcher();

    return (
        <button onClick=() => errorDispatcher('an error occurred') />
    );

【讨论】:

【参考方案3】:
const setErrors = (payload, dispatch) => 

修改setErrors 函数以采用附加参数dispatch。现在您应该可以在许多组件中重用setErrors

【讨论】:

以上是关于在组件外部使用 redux 钩子来实现代码的可重用性的主要内容,如果未能解决你的问题,请参考以下文章

如何在 getInitialProps 中使用 redux 钩子

无效的挂钩调用。钩子只能在反应函数组件内部使用...... useEffect,redux

如何使用 react-redux 钩子测试组件?

使用 Redux Hooks 而不是 connect() 好的设计吗?

在列表中使用 react redux 钩子会影响性能吗?

结合Vue路由器使用Vue 2中的可重用组件