React-Redux - Hooks API

9

Я пытаюсь настроить мое новое приложение реагировать на использование новых функций React-Redux. Официальная документация говорит

React Redux теперь предлагает набор подключаемых API в качестве альтернативы существующему компоненту высшего порядка connect ().

Я пытался найти некоторые справочные статьи, связанные с Hooks API, с некоторыми реальными примерами, но все приложения реакции-редукса используют функцию соединения Официальная документация также показывает очень простые примеры.

Я хочу изменить функции подключения в моем приложении с помощью 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> {
.
.
.
}
MuhammadUmarFarooq
источник

Ответы:

11

Крючки не совместимы с компонентами класса. Чтобы использовать хуки, вы конвертируете компоненты класса в функциональные компоненты. Например, ваш код может быть изменен на

/**
 *  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;
Майк Перри Йебоа Аттара
источник
0

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> {
.
.
.
}

По моему мнению, лучше держать компоненты последнего уровня изолированными от магазина.

MuhammadUmarFarooq
источник