Свойство ‘unlisten’ не существует для типа ‘component’

#reactjs #react-router

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

Вопрос:

Я хочу перейти к началу страницы после изменения маршрута. Я буду использовать react-router history.listen хук. Однако в нем говорится Property 'unlisten' does not exist on type 'ScrollToTop'.

Это не кажется сложной проблемой, но я не мог понять, что не так. Пожалуйста, не предлагайте другой метод, вместо этого объясните решение этой ошибки. Я просто хочу устранить эту ошибку.

Это фрагмент кода, который я использую

 import {RouteComponentProps, withRouter} from "react-router-dom";

type TScrollToTopProps = RouteComponentProps;

class ScrollToTop extends Component<TScrollToTopProps> {

  componentDidMount() {
    this.unlisten = this.props.history.listen((location) => {
      window.scrollTo(0, 0);
    });
  }

  componentWillUnmount() {
    this.unlisten();
  }

  render() {
    return this.props.children;
  }
}

export default withRouter(ScrollToTop);
  

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

1. unlisten не существует в классе. Вы можете просто объявить его и он будет доступен в this контексте

Ответ №1:

Вы должны просто создать такое состояние unlisten

 import { RouteComponentProps, withRouter } from "react-router-dom";
import { UnregisterCallback } from 'history';

interface IScrollToTopState {
  unlisten: UnregisterCallback;
}
class ScrollToTop extends Component<RouteComponentProps, IScrollToTopState> {
  state: IScrollToTopState = {
    unlisten: null
  };

  componentDidMount() {
    this.setState({
      unlisten: this.props.history.listen((location) => {
         window.scrollTo(0, 0);
      })
    });
  }

  componentWillUnmount() {
    this.state.unlisten();
  }

  render() {
    return this.props.children;
  }
}

export default withRouter(ScrollToTop);