Реализация Router для смены страниц в React.js

Я делаю приложение со списком покупок react.js. У меня есть оно, чтобы вы вводили значения и могли распечатать их в таблице. Я впервые использую реакцию, и я хочу, чтобы моя таблица была на отдельной странице. Я знаю о методе ROUTER, но у меня проблемы с его реализацией.

Вот мой код примечание: я еще не добавил ничего для навигации между страницами, но я хочу, чтобы кнопка печати переходила от App.js к Details.js

import NavBar from "./components/navbar";
import "./App.css";
import Counters from "./components/counters";
import Details from "./Details";
import { BrowserRouter as Router, Switch, Route } from "react-router-dom";

class App extends Component {
  state = {
    counters: [
      //example of objects in array
      /*{ id: 1, value: 2, text: "hi" },*/
    ],
  };
  constructor(props) {
    super(props);
    console.info("app- constructor");
  }

  componentDidMount() {
    console.info("app- mouneted");
  }

  handleIncrement = (counter) => {
    const counters = [...this.state.counters];
    const index = counters.indexOf(counter);
    counters[index] = { ...counter };
    counters[index].value++;
    this.setState({ counters });
  };

  handleDecrement = (counter) => {
    const counters = [...this.state.counters];
    const index = counters.indexOf(counter);
    counters[index] = { ...counter };
    counters[index].value--;
    this.setState({ counters });
  };

  handleReset = () => {
    const counters = this.state.counters.map((c) => {
      c.value = 0;
      return c;
    });
    this.setState({ counters });
  };

  handleName = () => {
    var name = prompt("name");
    return name;
  };

  handleCreate = () => {
    const create = this.state.counters.length + 1;
    const counter = this.state.counters.push({
      id: create,
      value: 0,
      text: this.handleName(),
    });
    this.setState({ counter });
  };

  handleDelete = (counterId) => {
    const counters = this.state.counters.filter((c) => c.id !== counterId);
    this.setState({ counters });
  };

  handleInfo = () => {
    let x;
    //loops through all tems and adds the to the list
    for (x = 0; x <= this.state.counters.length; x++) {
      //breaks loop if x is == to counters array
      if (this.state.counters.length == x) {
        break;
      }
      const info = this.state.counters[x]["text"];
      const quantity = this.state.counters[x]["value"];
      console.info(info, quantity);

      //creates rows based on input
      var table = document.getElementById("myList");
      var row = table.insertRow(1);
      var itemCell = row.insertCell(0);
      var quantityCell = row.insertCell(1);
      itemCell.innerHTML = info;
      quantityCell.innerHTML = quantity;
    }
    //calls the print function
    return <a href = "http://localhost:3000/Details"></a>;
  };

  render() {
    console.info("rendered");
    return (
      <React.Fragment>
        <NavBar
          totalCounters = {this.state.counters.filter((c) => c.value > 0).length}
        />

        <main className = "container">
          <Counters
            counters = {this.state.counters}
            onReset = {this.handleReset}
            onCreate = {this.handleCreate}
            onIncrement = {this.handleIncrement}
            onDecrement = {this.handleDecrement}
            onDelete = {this.handleDelete}
            onInfo = {this.handleInfo}
          />
        </main>

        <div>
          <table bordered id = "myList">
            <tr>
              <th>Items</th>
              <th>Quantity</th>
            </tr>
          </table>
        </div>
        <style>
          {`
          th{
            border: 2px solid black;
            padding: 2px;
            min-width: 100px;
            font-size: 22px;
            font-style: bold;
          }
          
          td{
            border: 2px solid black;
            padding: 2px;
            min-width: 100px;
            font-size: 18px;
          }

        
          `}
        </style>
      </React.Fragment>
    );
  }
}

export default App;

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

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
202
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Router — это не метод, а компонент, обертывающий приложение. Внутри Router компонент Switch оборачивает несколько экземпляров Route, которые, в свою очередь, оборачивают компоненты, которые должны быть отрисованы при попадании на этот маршрут. Наконец, компонент Link используется для создания ссылок на различные экземпляры Route. Все вместе это выглядит примерно так:

import { 
    BrowserRouter as Router, 
    Switch, 
    Route,
    Link
} from "react-router-dom";

<Router>
    <Switch>

        <Route exact path = "/">
            <div>

                ...insert home page here...

                <Link to = "/details">Click here to go to details page!</Link>

            </div>
        </Route>

        <Route path = "/details">
            ...details page/component here...
        </Route>

    </Switch>
</Router>

См. Учебник React Router для получения дополнительной информации.

Можно ли поставить его в возврат функции или это не сработает?

moawwad 22.12.2020 05:41

Хорошо, я добавил это, и у меня есть ссылка, и она ведет на мой localhost: 3000/Details ..... но она сохраняет все те же компоненты одной и той же страницы, хотя у меня ничего нет в моих деталях. js. Кто-нибудь знает, почему

moawwad 22.12.2020 07:03

Да, это должно быть возвращено функцией рендеринга. Если внутри переключателя есть какой-либо контент, но за пределами Route, он будет отображаться на обеих страницах. Если проблема не в этом, попробуйте передать реквизит exact маршруту /. Я отредактировал приведенный выше пример, чтобы отразить это.

Daly 23.12.2020 20:46

Большое спасибо, что сработало. Это было намного сложнее, чем я думал, прежде чем научиться реагировать, я делал все свои проекты на ванильном JavaScript, и было намного проще менять страницы.

moawwad 23.12.2020 22:34

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

Похожие вопросы