API React-Redux - Hooks


9

Я намагаюся налаштувати нову програму react-redux для використання нових функцій React-Redux. В офіційній документації йдеться

Тепер React Redux пропонує набір API API-інтерфейсу як альтернативу існуючому компоненту вищого порядку.

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

Я хочу змінити функції підключення в моєму додатку за допомогою useSelector (пропонований API Hooks).

Ось приклад фрагменту коду з моєї програми.

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

Відповіді:


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

API Hooks спрощує функціональні компоненти, тому я вклав компонент свого класу всередині функціонального компонента, як це:

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

Згідно з моїм сприйняттям, краще тримати компоненти останнього рівня ізольованими від магазину.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.