Показать вложенный компонент маршрута на новой странице

У меня есть вложенный компонент маршрута, который отображается внизу родительского компонента. Я хочу отобразить этот компонент на новой странице. Вот мой код -

CategoryList.js

class CategoryList extends Component {
  state = {
    categories: []
  }

  componentDidMount() {
    fetch('http://localhost:8080/testcategory')
      .then(results => {
        return results.json();
      }).then(data => {
        this.setState({ categories: data.categories });
      })
      .catch(error => {
        this.setState({ error: true });

      });
  }

  categorySelectedHandler = (id) => {
    this.props.history.replace('/testcategory/' + id);

  }

  render() {
    let categories = <p style = {{ textAlign: 'center' }}>Something went wrong!</p>;
    if (!this.state.error) {
      categories = this.state.categories.map(category => {
        {this.props.children}
        return (
          <Table.Row key = {category.id}>

            <Table.Cell>{category.name}</Table.Cell>
            <Table.Cell>{category.id}</Table.Cell>
            <Table.Cell> <Button icon labelPosition='left' onClick = {() => this.categorySelectedHandler(category.id)}>show</Button></Table.Cell>
            {/* Tried this as well
              <Table.Cell>
              <Link to = {"/category/"+category.id}>
                <Button icon labelPosition='left' >Show</Button>
              </Link>
            </Table.Cell> */}
          </Table.Row>
        )
      })
    }
return (
      <div>
        <Table stackable>
          <Table.Header>
            <Table.Row >
              <Table.HeaderCell>Name</Table.HeaderCell>
              <Table.HeaderCell>ID</Table.HeaderCell>
              <Table.HeaderCell>Operations</Table.HeaderCell>
            </Table.Row>
          </Table.Header>
          <Table.Body>
            {categories}
            {this.props.children}
          </Table.Body>

        </Table>
        <Route path = {this.props.match.url + '/:id'} exact component = {CategoryDetails} />
      </div>
    );
  }
}

export default CategoryList;

CategoryDetails.js

import React, { Component } from 'react';
import './CategoryDetails.css';
class CategoryDetails extends Component {

  state = { loadedCategory: null }
  componentDidMount() {
    this.loadData();
  }
  componentDidUpdate() {
    this.loadData();
  }
  shouldComponentUpdate(nextProps, nextState) {
    return nextProps.match.params.id != nextState.loadedCategory.id ;
  }
  loadData=() =>{
    if (this.props.match.params.id) {
      if (!this.state.loadedCategory || (this.state.loadedCategory && this.state.loadedCategory.id !== +this.props.match.params.id)) {
        fetch('http://localhost:8080/testcategory/' + this.props.match.params.id)
          .then(results => {
            return results.json();
          }).then(data => {
            this.setState({ loadedCategory: data});
          })
          .catch(error => {
            this.setState({ error: true });
          });
      }
    }
  }

  render() {
    let category = <p style = {{ textAlign: 'center' }}>Please select a Post!</p>;
    if (this.props.match.params.id) {
      category = <p style = {{ textAlign: 'center' }}>Loading...!</p>;
    }


    if (this.state.loadedCategory) {
      category = (
        <div className = "CategoryDetails">
          <h1>{this.state.loadedCategory.name}</h1>
          <p>{this.state.loadedCategory.code}</p>
          <p>{this.state.loadedCategory.id}</p>
          {this.props.children}

        </div>

      );
    }
    return (category);
  }
}

export default CategoryDetails;

Привет, Четан, похоже, что CategoryList и CategoryDetails на самом деле являются родственными маршрутами, учитывая, что их представления полностью отделены друг от друга. Для React Router 4+ вы хотите обрабатывать маршруты так, как если бы они были любым другим компонентом (и, следовательно, они не заменяли бы какие-либо родительские элементы).

Sam 07.05.2018 20:29

Спасибо за ответ, но я хочу, чтобы компонент Show отображался на другой странице, можно ли это сделать каким-либо образом?

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

Ответы 1

Ответ принят как подходящий

удалите CategoryDetails Route из файла CategoryList и переместите его в файл, где Route указан для CategoryList

<Route path = {this.props.match.url + '/:id'} exact component = {CategoryDetails} />

<Route path = {this.props.match.url + '/:dummyid'} exact component = {CategoryList} />

вам, вероятно, не нужен фиктивный идентификатор, вместо этого следует использовать что-то вроде «/ Categories» для CategoryList и «/ Categories /: id» для CategoryDetails.

Sam 07.05.2018 20:31

Спасибо @Piyush и @Sam, это сработало. У меня была проблема с хуком жизненного цикла shouldComponentUpdate, который после исправления работал должным образом.

Chetan Gawai 07.05.2018 21:14

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