React-router - как передавать данные между страницами в React?

Я работаю над проектом, в котором мне нужно передавать данные с одной страницы на другую. Например, у меня на первой странице стоит data.

let data = [
  {id:1, name:'Ford', color:'Red'},
  {id:2, name:'Hyundai', color:'Blue'}
]

Вот первая страница компонента, на которой я визуализирую этот список данных с именем.

class ListDetail extends Component {
    constructor();
    handleClick(data){
    console.info(data);
  }
  render() {
    return (
      <div>
        <Hello name = {this.state.name} />
        <ul>
          {data.map((data,i) => {
            return <li onClick = {this.handleClick.bind(this,data)}>{data.name}</li>
          })}
        </ul>
      </div>
    );
  }
}

Я хочу передать эти данные на следующую страницу, где мне нужны эти данные и больше данных, чем это. Я использую React Router 4. Любые предложения или помощь были бы полезны.

@ Андрей, есть много способов сделать это. Используете ли вы какую-либо систему управления состоянием, такую ​​как Redux? Если это так, эти данные должны храниться в вашем хранилище Redux, где они будут доступны для всех маршрутов. Если нет, я бы порекомендовал это сделать - это займет немного времени, чтобы научиться, но сделает вашу жизнь намного проще, когда вы научитесь веревкам ...

duhaime 08.09.2018 21:34

Эндрю, альтернатива моему ответу, вы также можете использовать React Context API для передачи данных между компонентами, когда они находятся глубже по дереву. Это вариант, но если вы работаете с большими объемами данных. Я бы посоветовал взглянуть на Redux, как предложил Duhaime. Это немного требует обучения, но бесплатный курс по Redux на egghead.io подготовит вас к этому. Курс подготовлен Дэном, создателем redux.

Roy Scheffers 08.09.2018 21:45
Поведение ключевого слова "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) для оценки ваших знаний,...
42
2
68 584
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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

Вы можете использовать компонент Link из response-router и указать to = {} в качестве объекта, где вы указываете путь в качестве маршрута для перехода. Затем добавьте переменную, например. data для хранения значения, которое вы хотите передать. См. Пример ниже.

Используя компонент <Link />:

<Link
  to = {{
    pathname: "/page",
    state: data // your data array of objects
  }}
>

Использование history.push()

this.props.history.push({
  pathname: '/page',
    state: data // your data array of objects
})

Используя любой из вышеперечисленных вариантов, вы теперь можете получить доступ к data в объекте местоположения, как показано ниже в вашем компоненте страницы.

render() {
  const { state } = this.props.location
  return (
    // render logic here
  )
}

Вы можете увидеть пример того, как передать значение вместе с маршрутом, в другом примере здесь.

Также необходимо убедиться, что маршрут проходит через подпорки во время разводки. <Точный путь маршрута = "/ path" component = {(props) => <View {... props} />} />

Janitha Madushan 23.10.2019 06:36

Вы предложили Redux, но насколько я понимаю, Redux не сохраняет значения при переключении URL-адресов, это правильно?

Yuval Levy 26.04.2020 13:05

Привет, @YuvalLevy, в контексте одностраничного приложения для реагирования и использования маршрутизатора реакции для управления маршрутизацией во внешнем интерфейсе redux управляет состоянием отдельно от маршрутов. Итак, независимо от маршрута, вам доступно состояние в redux. Конечно, если вы переходите на другой сайт вне своего приложения, это что-то еще.

Roy Scheffers 21.07.2020 17:02

Вы также захотите encodeURIComponent передаваемые параметры и decodeURIComponent в приемнике для props.match.params. <variablename> в противном случае, если в параметре, который вы хотите передать, есть косые черты, React не будет вызывать конструктор с props и не будет объявлять какие-либо ошибки или вывод на консоль, оставляя вас в догадках.

wnm3 24.11.2020 16:54

Как получить доступ к данным в компоненте страницы?

tejesh 25.11.2020 01:45

Вы можете использовать компонент Link реактивного маршрутизатора и сделать следующее:

<Link to = {{
  pathname: '/yourPage',
  state: [{id: 1, name: 'Ford', color: 'red'}]
}}> Your Page </Link>

а затем получить доступ к данным с помощью this.props.location.state

Вы также можете рассмотреть возможность использования redux для управления состоянием всего вашего приложения (https://redux.js.org/).

Можем ли мы передать функцию?

AmitJS94 08.06.2019 09:12

Предполагая, что ваша другая страница является компонентом, вы можете передать данные как опору, которая будет доступна на следующей странице. Однако следует отметить, что вы должны использовать компонент <Link />, который доступен в react-router 4, в отличие от использования <a></a>, который вызывает полную перезагрузку страницы, что приводит к потере доступа к данным.

Если вы хотите отправить одну страницу в одном объекте с таким же кодом ниже, вы должны импортировать свою страницу в свой объектный файл и снова импортировать свою страницу в целевой файл так же:

import Home from './componenets/home/home';
import ColdDrink from './componenets/coldDrink/coldDrink';
import HotDrink from './componenets/hotDrink/hotDrink';
import CheaseCake from './componenets/cheaseCake/cheaseCake';
import Lost from './componenets/404/lost';

const link = [
{
name   : "Cold Drink",
link   : "/ColdDrink",
router : <ColdDrink/>
},
{
name   : "Hot Drink",
link   : "/HotDrink",
router : <HotDrink/>
},
{
name   : "chease Cake",
link   : "/CheaseCake",
router : <CheaseCake/>
},
{
name   : "Home",
link   : "/",
router : <Home/>
},
{
name   : "",
link   : "",
router : <Lost/>
}
];

и в вашем файле назначения вы должны сопоставить свой объект ...

const links = (this.props.link);
{links.map((item, i) => (
  {item.router}
))}

как передать данные в другой компонентный маршрутизатор в reactjs

Login.jsx

 handleClickSignIn(){
            console.info("come handle click fun");
            this.props.history.push( {pathname: "/welcome",
            state: { employee:"Steven" }});
      
        }

welcome.jsx

componentDidMount()
{
  console.info(this.props.location.state.employee);
}

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