ReactJS - передать реквизиты с компонентом Redirect

Как следует передавать реквизиты с компонентом Redirect, не отображая их в URL-адресе?

Нравится этот <Redirect to = "/order?id=123 />"? Пользуюсь react-router-dom.

Поведение ключевого слова "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) для оценки ваших знаний,...
65
0
90 273
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Вы можете использовать состояние истории браузера следующим образом:

<Redirect to = {{
    pathname: '/order',
    state: { id: '123' }
}} />

Затем вы можете получить к нему доступ через this.props.location.state.id

Источник: https://github.com/ReactTraining/react-router/blob/master/packages/react-router/docs/api/Redirect.md#to-object

this.props.location дает мне undefined. Какие-либо предложения?

Dhruv Singhal 03.01.2019 14:39

@DhruvSinghal Это означает, что ваш компонент не имеет доступа к свойствам маршрутизатора. Может быть, попробуйте обернуть свой компонент withRouter

Anas 03.01.2019 15:46

@SagarKodte То же самое, мой был первым :)

Anas 21.02.2019 16:07

Я получаю эту ошибку Expected an assignment or function call and instead saw an expression. Какие-либо предложения?

Srishti Khandelwal 29.07.2019 10:17

Вы можете передавать данные с помощью Redirect следующим образом:

<Redirect to = {{
            pathname: '/order',
            state: { id: '123' }
        }}
/>

и вот как вы можете получить к нему доступ:

this.props.location.state.id

Документы API объясняет, как передавать состояние и другие переменные в опоре Redirect / History.

Источник: https://github.com/ReactTraining/react-router/blob/master/packages/react-router/docs/api/Redirect.md#to-object

Нужен ли мне компонент BrowserHistory, чтобы это заработало?

Michiel 28.08.2018 20:39

Нет, не знаешь. Если вы используете любой маршрутизатор в своих маршрутах.

Sakhi Mansoor 28.08.2018 20:43

Огромное спасибо, отмечу ваш ответ как решение, как только истечет время таймера! :)

Michiel 28.08.2018 20:44

Это решение не соответствует спецификации истории браузера html 5, данные должны передаваться в объекте состояния.

Anas 28.08.2018 20:44

@anas это то, что рекомендует автор библиотеки: github.com/ReactTraining/history#navigation

Sakhi Mansoor 28.08.2018 20:49

@SakhiMansoor в предоставленном вами URL-адресе написано, что вам следует использовать npm install history? Что делать, если я этого не сделал или уже есть в пакете react-router-dom?

Michiel 28.08.2018 20:53

@SakhiMansoor. Да, объект должен содержать значения pathname, search, state и т. д., Которые используются в истории браузера. Любые пользовательские значения должны быть включены в объект state, который находится на один уровень ниже. Он чище и отделяет то, что используется историей браузера, от вашего собственного настраиваемого объекта.

Anas 28.08.2018 20:53

Спасибо @Anas и SakhiMansoor за помощь. Вы оба заслуживаете оценки за решение! :)

Michiel 28.08.2018 20:56

Да, я согласился с @Anas, но меня больше интересует какая-то конкретная причина этого?

Sakhi Mansoor 28.08.2018 21:02

Одна из причин: допустим, в следующем выпуске они добавят id в свой api, а теперь у вас конфликт.

Anas 28.08.2018 21:08

Это одна из проблем. Но мы должны прочитать документы по миграции перед обновлением пакетов, и да, я бы отредактировал свой ответ. Кстати, спасибо, это тоже урок для меня.

Sakhi Mansoor 28.08.2018 21:17

@SakhiMansoor Я пробовал тот же код, но он дает мне эту ошибку: литерал объекта может указывать только известные свойства, а 'id' не существует в типе 'LocationDescriptor <any>'.

Mustafa Chelik 27.10.2018 16:51

поделитесь своим кодом или задайте новый вопрос с указанием вашей проблемы. Спасибо

Sakhi Mansoor 27.10.2018 16:53

@SakhiMansoor <Перенаправить на = {{pathname: "/ app / AntennaAdd", id: "123"}} />; Спасибо большое

Mustafa Chelik 27.10.2018 16:53

Очевидно, это работает <Redirect to = {{pathname: "/ app / AntennaAdd", state: {id: "123"}}} />;

Mustafa Chelik 27.10.2018 16:55

Обновляю свой ответ, так как React-router внес изменения в свой API. Спасибо за указание на это. Состояние - идеальный способ хранения значений, поскольку они не конфликтуют с ключами, указанными в API, такими как имя пути и т. д.

Sakhi Mansoor 27.10.2018 16:58

Привет ... У меня проблемы с получением параметра состояния, переданного с перенаправлением. this.props.location дает мне undefined. Какие-либо предложения?

Dhruv Singhal 03.01.2019 14:37

Это сработало для меня, но в моем случае мне нужно было использовать mydata: JSON.stringify(data) и JSON.parse(props.location.state.mydata), потому что я передавал объект.

Michael Lynch 06.08.2019 22:41

@DhruvSinghal Здесь та же проблема. Вы нашли решение?

Sealer_05 11.10.2019 21:15

@ Sealer_05 Я перестал работать над React некоторое время назад ... Не очень хорошо помню, как я это решил. Попробуйте немного поэкспериментировать, чтобы выяснить это.

Dhruv Singhal 14.10.2019 12:38

Я получаю this.props как undefined. Есть идеи, почему это так?

vipulsinghthakur 27.02.2020 21:17

Можете ли вы поделиться кодами, песочницей или ссылкой на github, я мог бы изучить это

Sakhi Mansoor 28.02.2020 00:36

Если компонент, на который вы перенаправляете, является функциональным, используйте перехватчик useLocation React Router для доступа к объекту местоположения.

Thibaut 03.05.2020 09:36

@SakhiMansoor в настоящее время пометил другой ответ как правильный. Не могли бы вы обновить свой контент до того, который в настоящее время отмечен? Отмеченный в настоящее время вариант можно было бы лучше объяснить, попробуйте :)

Michiel 27.08.2020 09:04
  • Вы можете использовать свой собственный крючок для той же цели:
import { createBrowserHistory } from "history";

const withRefresh = createBrowserHistory({ forceRefresh: true });
const ROOT_PATH = process.env.PUBLIC_URL || "/myapp";

const useRedirectToAccounting = (params = "1") => {
if (params){
withRefresh.push({
    pathname: `${ROOT_PATH}/create`,
    state: { id: `${params}` }
  });
}
} 

export default  redirectToAccounting;

  • и используйте его как:

 import useRedirectToAccounting from  './redirectToAccounting


const handleOnClick = params => useRedirectToAccounting(params)

const RedirectorComponent = () => <a onClick = {handleOnClick}>{"Label"}</a>

** это может быть подвергнуто дальнейшему рефакторингу в зависимости от требований.

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

Сначала вы должны передать реквизиты в Route, где вы определили в своем App.js

<Route path = "/test/new" render = {(props) => <NewTestComp {...props}/>}/>

затем в вашем первом компоненте

<Redirect
            to = {{
            pathname: "/test/new",
            state: { property_id: property_id }
          }}
        />

а затем в вашем перенаправленном NewTestComp вы можете использовать его где угодно, как это

componentDidMount(props){
console.info("property_id",this.props.location.state.property_id);}

Недооцененный ответ - это полное решение; простое добавление строки в приведенных выше ответах не передает реквизиты должным образом.

bearacuda13 29.05.2020 22:22

Это ВАЖНАЯ часть. Просто и очень полезно, мягко говоря!

sonic98 20.08.2020 12:59

Помечен как новый правильный ответ, поскольку в нем больше информации.

Michiel 27.08.2020 09:00

Можете ли вы уточнить «тогда в вашем первом компоненте»? У меня проблемы со сборкой всего этого. какой компонент является «первым компонентом»?

sammms 27.04.2021 17:17

@sammms не автор, но я считаю, что они имели в виду только компонент перенаправления. Вы можете добавить это к любому компоненту перенаправления, с которым вы хотите передавать реквизиты, при условии, что у компонента Route есть свойство рендеринга, установленное как функция. Подробнее о перенаправлении на и здесь для получения дополнительной информации о рендеринге маршрута

Mxt 12.06.2021 21:20

Когда я запускал этот код, это приводило к пустой странице, когда я возвращал Redirect.

Saiansh Singh 21.06.2021 19:53
<Redirect to = {{
    pathname: '/path',
    state: { id: '123' }
}} />

Затем вы можете получить к нему доступ через this.props.location.state.id в нужном компоненте.

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