React-Redux - Hooks API

9

Próbuję skonfigurować moją nową aplikację React-Redux, aby korzystać z nowych funkcji React-Redux. Oficjalna dokumentacja mówi

React Redux oferuje teraz zestaw interfejsów API przechwytujących jako alternatywę dla istniejącego komponentu wyższego rzędu connect ().

Próbowałem znaleźć kilka artykułów pomocniczych związanych z interfejsem API Hooks z prawdziwymi przykładami, ale wszystkie aplikacje Re-Redux używają funkcji łączenia. Oficjalna dokumentacja pokazuje również bardzo podstawowe przykłady.

Chcę zmienić funkcje łączenia w mojej aplikacji za pomocą useSelector (oferowanego przez Hooks API).

Oto przykładowy fragment kodu z mojej aplikacji.

//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
źródło

Odpowiedzi:

11

Haki nie są kompatybilne z komponentami klasy. Aby użyć haczyków, konwertujesz komponenty klasy na komponenty funkcyjne. Na przykład kod można refaktoryzować

/**
 *  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;
Mike Perry Yeboah Attara
źródło
0

Interfejs API Hooks ułatwia komponenty funkcyjne, więc zagnieździłem komponent klasy wewnątrz komponentu funkcyjnego w następujący sposób:

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

Z mojego punktu widzenia lepiej jest trzymać komponenty ostatniego poziomu w izolacji od sklepu.

MuhammadUmarFarooq
źródło