【问题标题】:React-Redux - Hooks APIReact-Redux - 钩子 API
【发布时间】:2020-07-11 21:57:24
【问题描述】:

我正在尝试配置我的新 react-redux 应用程序以使用 React-Redux 的新功能。 official documentation

React Redux 现在提供一组钩子 API 作为现有 connect() 高阶组件的替代方案。

我一直在尝试找到一些与 Hooks API 相关的帮助文章,其中包含一些真实示例,但所有 react-redux 应用程序都使用连接功能。官方文档还显示了非常基本的示例。

我想使用 useSelector(由 Hooks API 提供)更改我的应用程序中的连接功能。

这是我的应用程序中的示例代码 sn-p。

//MessagesListContainer
export default connect(
  // mapStateToProps
  (state:State) => ({
    activeUser: getActiveUser(state),   
    messages: getMessagesList(state),   
  })
)(MessagesList)

//Selectors
export const getActiveUser = (state: State) => state.activeUser;
export const getMessagesList = (state : State) => (
  Object.keys(state.messages).map((key : any)=> state.messages[key])
)

export interface IMessagesListProps {
  activeUser?: User;
  messages?: Message[];
}
/**
 *  Messages List
 */
export default class MessagesList extends PureComponent<IMessagesListProps> {
.
.
.
}

【问题讨论】:

    标签: reactjs typescript redux react-redux


    【解决方案1】:

    Hooks API 方便了函数组件,所以我将我的类组件嵌套在一个函数组件中,如下所示:

    //messages-list.container.tsx
    //MessagesListContainer
    export const MessagesListContainer = () => {
       const activeUser= useSelector((state:State) => getActiveUser(state));
       const messages= useSelector((state:State) => getMessagesList(state));
       return <MessagesList activeUser={activeUser} messages={messages} />
    }
    
    
    //Selectors
    export const getActiveUser = (state: State) => state.activeUser;
    export const getMessagesList = (state : State) => (
      Object.keys(state.messages).map((key : any)=> state.messages[key])
    )
    
    //end of messages-list.container.tsx
    
    //messages-list.component.tsx
    export interface IMessagesListProps {
      activeUser?: User;
      messages?: Message[];
    }
    /**
     *  Messages List
     */
    export default class MessagesList extends PureComponent<IMessagesListProps> {
    .
    .
    .
    }
    

    根据我的看法,最好将最后一级组件与商店隔离。

    【讨论】:

      【解决方案2】:

      钩子与类组件不兼容。 要使用 Hook,您需要将类组件转换为函数组件。 例如,您的代码可以重构为

      /**
       *  Messages List
       */
      
      const getActiveUser = (state: State) => state.activeUser;
      const getMessagesList = (state : State) => (Object.keys(state.messages).map((key : any)=> state.messages[key]));
      
      const MessagesList: React.FC = () => {
        const activeUser = useSelector(getActiveUser);
        const messagesList = useSelector(getMessagesList);
      
        ....
      }
      
      export default MessagesList;
      

      【讨论】:

        猜你喜欢
        • 2021-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-03
        • 2020-02-20
        • 1970-01-01
        • 2021-12-30
        • 1970-01-01
        相关资源
        最近更新 更多