определение истории отсутствует в ReactNode

#reactjs #typescript #react-router

#reactjs #typescript #реагировать-маршрутизатор

Вопрос:

Я написал Login компонент, который содержит перехват useEffect , который должен обращаться к history объекту компонента:

 export default (props: { children: React.ReactNode }) => {
    const alertContext = useContext(AlertContext);
    const authContext = useContext(AuthContext);

    const { setAlert } = alertContext;
    const { login, error, clearErrors, isAuthenticated } = authContext;

    useEffect(() => {
        if (isAuthenticated) {
            props.history.push('/');
        }

        if (error === 'Invalid Credentials') {
            setAlert(error, 'danger');
            clearErrors();
        }
        // es-lint-disable-next-line
    }, [error, isAuthenticated, props.history]);
  

несмотря на то, что я определил React.ReactNode как props тип для компонента, я получаю:

Свойство ‘history’ не существует для типа ‘{ дочерние элементы: ReactNode; }’

Эта ошибка возникает в этой строке:

 props.history.push('/');
  

Как я могу это исправить?

Ответ №1:

В зависимости от вашего компонента, который является функциональным компонентом, вы можете useHistory() вместо этого использовать hook:

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

useHistory Перехват предоставляет вам доступ к экземпляру истории, который вы можете использовать для навигации.

Вы можете импортировать его как:

 import { useHistory } from "react-router-dom";
  

Итак, попробуйте выполнить следующее:

 export default (props: { children: React.ReactNode }) => {
   const history = useHistory()

   // rest of the code
}
  

Затем используйте без props as:

 history.push('/');
  

Комментарии:

1. Спасибо! Итак, вы подтверждаете, что в компоненте нет интерфейса, который включал бы историю?