React-Redux - 钩子 API
Posted
技术标签:
【中文标题】React-Redux - 钩子 API【英文标题】:React-Redux - Hooks 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>
.
.
.
【问题讨论】:
【参考方案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;
【讨论】:
以上是关于React-Redux - 钩子 API的主要内容,如果未能解决你的问题,请参考以下文章
如何正确使用带有 react-redux 的 useSelector 钩子的 curried 选择器函数?
测试自定义钩子:不变违规:找不到 react-redux 上下文值;请确保组件包装在 <Provider>
React-redux useDispatch() Uncaught TypeError