Как отобразить компонент на другой странице, если щелкнуть ссылку в строке таблицы в ReactJs - PullRequest
0 голосов
/ 23 октября 2018

Я новичок в ReactJ, и у меня есть компонент ProjectsList, который включает в себя таблицу HTML.Один из ее столбцов - это ссылка, по которой при щелчке она должна перейти на другую страницу, отображающую компонент ProjectInfo.

. Но происходит то, что компонент отображается на той же странице компонента ProjectsList вконец таблицы.ProjectsList компонент отображается при нажатии на ссылку Show Projects в Projects компоненте.

Projects.component.jsx

import React, { Component } from "react";
import { Link, Route, Switch } from "react-router-dom";
import NewProject from "../NewProject/NewProject.component";
import ProjectsList from "../ProjectsList/ProjectsList.component";
import "./Projects.css";

export default class Projects extends Component {
  render() {
    return (
      <div className="projects-dashboard">
        <nav className="nav-up">
          <ul>
            <li>
              <Link to={"/dashboard/projects/add"}>add project</Link>
            </li>

            <li>
              <Link to={"/dashboard/projects/list"}>show projects</Link>
            </li>
          </ul>
        </nav>
        <main>
          <Route path={"/dashboard/projects/add"} component={NewProject} />
          <Route path={"/dashboard/projects/list"} component={ProjectsList} />
        </main>
      </div>
    );
  }
}

ProjectsList.component.jsx

import React, { Component } from "react";
import axios from "axios";
import { Route, Link } from "react-router-dom";
import "./ProjectsList.css";
import ProjectInfo from "../ProjectInfo/ProjectInfo.component";

export default class ProjectsList extends Component {
  constructor(props) {
    super(props);
    this.state = {
      allProject: []
    }
  }

  componentWillMount() {
    this.fetchAllProjects();
  }

  componentDidMount() {
    document.body.style.overflowY = "auto";
  }

  fetchAllProjects = () => {
    axios.get("/api/projects").then(res => {
      this.setState({ allProject: res.data }, () => { console.log(this.state.allProject); });
    });
  };

  render() {
    const projects = this.state.allProject.map(project => {
      return (
        <tr>
          <td>{project.id}</td>
          <td>{project.title}</td>
          <td>{project.organization_name}</td>
          <td className="project-options">
            <Link to={`/dashboard/projects/list/${project.id}`}>
              <i className="far fa-eye" /> show
            </Link>
          </td>
        </tr>
      );
    });

    return (
      <div>
        <table class="projects-list-table">
          <thead>
            <tr>
              <th>
                <h1>Project ID</h1>
              </th>
              <th>
                <h1>Project Name</h1>
              </th>
              <th>
                <h1>Organization Name</h1>
              </th>
              <th>
                <h1>Options</h1>
              </th>
            </tr>
          </thead>
          <tbody>{projects}</tbody>
        </table>
        <main>
          <Route path={"/dashboard/projects/list/:id"} component={ProjectInfo} />
        </main>
      </div>
    );
  }
}

ProjectInfo.component.jsx

import React, { Component } from 'react';
import "./ProjectInfo.css";

export default class ProjectInfo extends Component {
    render() {
        return (
            <div>
                <h1>Project Info Component</h1>
            </div>
        )
    }
}

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Если вы хотите визуализировать компонент исключительно, то есть вы хотите визуализировать только один конкретный компонент (который в вашем случае равен ProjectInfo), когда вы нажимаете на ссылку в таблице, и в этом случае вы этого не делаетедля рендеринга компонента Projects необходимо использовать Switch в маршрутизаторе.

Из официальных документов

<Switch>

Визуализация первого дочернего элемента <Route> или <Redirect>, который соответствует местоположению.

Чем это отличается от использования набора <Route> s?

<Switch> уникален тем, что он отображает маршрут исключительно.Напротив, каждый <Route>, который соответствует местоположению, отображается включительно.

Рассмотрите этот код:

<Route path="/about" component={About}/> 
<Route path="/:user" component={User}/>
<Route component={NoMatch}/>

Если URL-адрес / about, то <About>, <User> и<NoMatch> все будут отображаться, потому что все они соответствуют пути.Это сделано специально, что позволяет нам составлять <Route> s в наших приложениях различными способами, такими как боковые панели и хлебные крошки, вкладки начальной загрузки и т. Д.

Итак, измените ваш компонент Projects на что-то вродеthis (Вы уже импортируете Switch, поэтому нет необходимости импортировать его снова):

<main>
  <Switch>
    <Route exact path={"/dashboard/projects/add"} component={NewProject} />
    <Route exact path={"/dashboard/projects/list"} component={ProjectsList} />
  </Switch>
</main>
0 голосов
/ 23 октября 2018

React router включает эти компоненты в указанный раздел, где находится тег Route.Например:

<section>
  <h1>Hello</h1>
  <Route path={"/random/path"} component={MyComponent} />
</section>

вернет

<section>
  <h1>Hello</h1>
  <MyComponent />
</section>

, чтобы обойти это, вам нужно добавить его на тот же уровень маршрутизации, что и ваш маршрут PrjectList.

такизмените это

<main>
  <Route path={"/dashboard/projects/add"} component={NewProject} />
  <Route path={"/dashboard/projects/list"} component={ProjectsList} />
</main>

на

<main>
  <Route path={"/dashboard/projects/add"} component={NewProject} />
  <Route exact path={"/dashboard/projects/list"} component={ProjectsList} />
  <Route exact path={"/dashboard/projects/list/:id"} component={ProjectInfo} />
</main>

РЕДАКТИРОВАТЬ

Последний маршрут не должен иметь точный тег на

<main>
  <Route path={"/dashboard/projects/add"} component={NewProject} />
  <Route exact path={"/dashboard/projects/list"} component={ProjectsList} />
  <Route path={"/dashboard/projects/list/:id"} component={ProjectInfo} />
</main>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...