React-Redux - Hooks API

Muh*_*ooq 10 typescript reactjs redux react-redux

我正在尝试配置我的新 react-redux 应用程序以使用 React-Redux 的新功能。在官方文件说:

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

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

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

这是我的应用程序中的示例代码片段。

//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> {
.
.
.
}
Run Code Online (Sandbox Code Playgroud)

Mik*_*ara 11

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

/**
 *  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;
Run Code Online (Sandbox Code Playgroud)