React Router v4 - Невозможно прочитать параметры свойства undefined

Я новичок в React. Мне просто нужно получить параметр пути из URL-адреса при загрузке страницы. Мой URL-адрес выглядит следующим образом.

http://localhost:3000/explorer/test/111

Я проложил следующий маршрут,

<Route
    exact path = "/explorer/test/:id"
    component = {() => <BlockPage />}
  />

Затем в компоненте <BlockPage /> мне нужно получить значение :id, когда компонент загружается. Поэтому я добавил следующий сегмент кода, чтобы получить идентификатор, но он дает мне ошибку, как в заголовке.

import React, { Component } from 'react';
import NavigationComp from './Navigation';
import { withRouter } from 'react-router-dom';

const BlockPage = () =>
   <div>
      <NavigationComp/>
      <BlockData />
   </div>

class BlockData extends Component {
    componentDidMount() {
       console.info(this.props.match.params.id);
    }

    render(){
        return(.....)
    }
}

export default withRouter(BlockPage);

Какую ошибку я сделал? Кто-нибудь может мне объяснить? Моя цель - получить значение 111 из URL-адреса в componentDidMount()

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
0
6 234
4

Ответы 4

когда вы хотите использовать компонент, вам не нужна функция, как код, вы можете изменить ее следующим образом:

<Route
exact path = "/explorer/test/:id"
component = {<BlockPage />}
/>

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

 <Route
exact path = "/explorer/test/:id"
render = {(props) => <BlockPage {...props} />}
/>

тогда в this.props.match.params вы можете получить доступ к своему идентификатору.

Не могли бы вы мне это объяснить? Я меняю маршрут, как и во втором методе, который вы упомянули, но для меня это остается той же ошибкой. (TypeError: невозможно прочитать параметры свойства undefined)

Sajitha Liyanage 10.08.2018 08:44

Как я могу получить доступ к: id в componentDidMount ()?

Sajitha Liyanage 10.08.2018 08:45

@SajithaLiyanage, вы используете функцию render, о которой я говорю?

MBehtemam 10.08.2018 08:47

@SajithaLiyanage, мой следующий вопрос: если вы console.info(this.props), что вы видите в консоли? пожалуйста, введите эту строку в BlockPage componentDidMount

MBehtemam 10.08.2018 09:08

@SajithaLiyanage, а что, если вы удалите withRouter и просто экспортируете компонент

MBehtemam 10.08.2018 09:10

Я пробовал оба случая, в console.info (this.props) выдает пустой объект.

Sajitha Liyanage 10.08.2018 14:40

Я нашел проблему. Проблема здесь. const BlockPage = () => <div> <NavigationComp/> <BlockData /> </div> Маршрутизатор подключается к компоненту BlockPage. Но моя функция componentDidMount находится в компоненте BlockData. Я думаю, что нужно передать реквизит с BlockPage на BlockData. Вы можете объяснить мне, как я могу это сделать?

Sajitha Liyanage 10.08.2018 14:46

Это происходит потому, что ваш компонент является подкомпонентом другого компонента, который знает ReactRouter. Например,

<BrowserRouter>
        <Switch>
            <Route path = "/Feedback">
        <Switch>
<BrowserRouter>

в приведенном выше определении маршрута объект соответствия в компоненте Feedback не равен нулю, но если у нас есть другой компонент в обратной связи и мы пытаемся получить к нему доступ, это будет ошибкой.

https://stackoverflow.com/a/57628327/12378703 это работает отлично ... попробуйте это

<Route
exact path = "/explorer/test/:id"
render = {(props) => <BlockPage {...props} />}
/>

Это решило мою проблему:

<CPAroute exact path = "/advcampaigns/:id" component = {AdvCampaigns}/>
class AdvCampaigns extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            activePage: 1
        };
    };
    componentDidMount() {
        console.info(this.props.**computedMatch**.params.id);
    }
}

Другие вопросы по теме