Як передати парами з history.push / Link / перенаправлення в реактор-маршрутизатор v4?


217

Як ми можемо передати параметр за допомогою this.props.history.push('/page')React-Router v4?

.then(response => {
       var r = this;
        if (response.status >= 200 && response.status < 300) {
             r.props.history.push('/template');
          });

Компонент , який винесений Routeповинен мати доступ до this.props.location, this.props.historyі т.д. Я думаю , що вам не потрібно використовувати refбільше з v4. Спробуйте зробитиthis.props.history.push('/template');
saadq

Це не ref. Це змінна вказівка ​​на це; this.props.history.push ('/ шаблон'); переведіть мене на наступну сторінку, але я хочу передати реквізит з ними .ref = this;
IshanGarg

Ви намагаєтеся перейти propsдо компонента, який відповідає маршруту? Я думаю, що ця тема GitHub вирішує вашу проблему.
saadq

JFYI - Я видалив <a href> і додав <Посилання>, що також має можливість надіслати стан, доступ до якого можна отримати на наступній сторінці через this.props.location.state.
Манохар Редді Поредді

Скажіть, будь ласка, одну з відповідей як "відповідь". Я впевнений, що люди, які витрачають час набираючи їх, оцінять це.
Джеймс Поулоз

Відповіді:


391

Перш за все, вам цього не потрібно робити, var r = this;оскільки це if statementстосується контексту самого зворотного виклику, який, оскільки ви використовуєте функцію стрілки, відноситься до контексту компонента React.

Згідно з документами:

Об'єкти історії зазвичай мають такі властивості та методи:

  • length - (кількість) Кількість записів у стеку історії
  • дія - (рядок) Поточна дія (PUSH, REPLACE або POP)
  • location - (об'єкт) Поточне місцеположення. Можуть мати такі властивості:

    • pathname - (рядок) Шлях URL-адреси
    • search - (рядок) Рядок запиту URL
    • хеш - (рядок) фрагмент хеша URL-адреси
    • state - (рядковий) стан, специфічний для місцеположення, який надається, наприклад, push (шлях, стан), коли це місце було висунуте на стек. Доступний лише в історії браузера та пам'яті.
  • push (шлях, [стан]) - (функція) Натискає новий запис на стек історії
  • Замінити (шлях, [стан]) - (функція) Замінює поточний запис у стеку історії
  • go (n) - (function) Переміщує вказівник у стеку історії на n записів
  • goBack () - (функція) Еквівалентно йти (-1)
  • goForward () - (функція) еквівалентно йти (1)
  • блок (підказка) - (функція) Перешкоджає навігації

Тож під час навігації ви можете передати реквізит до подібного об’єкта історії

this.props.history.push({
  pathname: '/template',
  search: '?query=abc',
  state: { detail: response.data }
})

або аналогічно для Linkкомпонента або Redirectкомпонента

<Link to={{
      pathname: '/template',
      search: '?query=abc',
      state: { detail: response.data }
    }}> My Link </Link>

а потім у компоненті, який надається /templateмаршрутом, ви можете отримати доступ до реквізитів, переданих як

this.props.location.state.detail

Також майте на увазі, що при використанні об'єктів історії або локації з реквізиту вам потрібно підключити компонент withRouter.

Відповідно до Документів:

зРутер

Ви можете отримати доступ до властивостей об’єкта історії та найближчої <Route>'sвідповідності через withRouterкомпонент вищого порядку. withRouter буде рендерировать його компонент кожного разу, коли маршрут змінюється тим же реквізитом, що і <Route>рендер props: { match, location, history }.


3
так, це спрацювало. Дякую! Але не впевнений, чому this.props.history.push('/template',response.data)не працює. Згідно з документами push(path, [state]), чи не вважаєте ви, що це має працювати?
Sanket Patel

1
Дякую за це! У моєму випадку я передавав історію лише безпосередньо, тому я отримав доступ до своєї опори через this.props.history.location.state.propName -
Nunchucks

@SanketPatel вам потрібно зробити це this.props.history.push ('/ template', {response: response.data})
Арсалан Ахмед Керші

Чи можливо відкрити маршрут на новій вкладці під час передачі даних у змінну стану під час навігації ви можете передавати реквізити об'єкту історії?
Гаурав Кумар

3
що з goBack ()? під час навігації назад за допомогою goBack () я не бачу жодного із станів історії ні в пропсі.локації, ні в пропс.історії.локації. Навігація вперед за допомогою push () працює чудово
MariusB

40

ви можете використовувати,

this.props.history.push("/template", { ...response }) або this.props.history.push("/template", { response: response })

то ви можете отримати доступ до проаналізованих даних із /templateкомпонента, дотримуючись наступного коду,

const state = this.props.location.state

Детальніше про управління історією сесій React


Ця логіка працювала для мене, коли history.push з back_url в стані this.props.history.push (redirect_url, {back_url: '/ needing_url'}); і отримати це на цільовій сторінці цим.props.location.state.back_url
Dev Yadav

24
  • Для більш ранніх версій:

    history.push('/path', yourData);

    І отримайте дані у відповідному компоненті так само, як нижче:

    this.props.location.state // it is equal to yourData
  • Для нових версій вищезазначений спосіб працює добре, але є новий спосіб:

    history.push({
      pathname: '/path',
      customNameData: yourData,
    });

    І отримайте дані у відповідному компоненті так само, як нижче:

    this.props.location.customNameData // it is equal to yourData

Підказка : stateім'я ключа використовувалося в попередніх версіях, а для нових версій ви можете використовувати своє власне ім'я для передачі даних, а використання stateімені не є важливим.


будь ласка, поділіться посиланням, в якому сказано, що стан не є важливим, якщо вам це зручно
Akshay Vijay Jain

Шановний @AkshayVijayJain, це мій досвід кодування. Я не написав це речення на основі документа чи реф.
AmerllicA

21

Розширення рішення (запропоноване Шубхам Хатрі) для використання з гачками React (16,8 і далі):

package.json (always worth updating to latest packages)

{
     ...

     "react": "^16.12.0",
     "react-router-dom": "^5.1.2",

     ...
}

Передача параметрів з натисканням історії:

import { useHistory } from "react-router-dom";

const FirstPage = props => {
    let history = useHistory();

    const someEventHandler = event => {
       history.push({
           pathname: '/secondpage',
           search: '?query=abc',
           state: { detail: 'some_value' }
       });
    };

};

export default FirstPage;

Доступ до пройденого параметра за допомогою UseLocation від 'react-router-dom':

import { useEffect } from "react";
import { useLocation } from "react-router-dom";

const SecondPage = props => {
    const location = useLocation();

    useEffect(() => {
       console.log(location.pathname); // result: '/secondpage'
       console.log(location.search); // result: '?query=abc'
       console.log(location.state.detail); // result: 'some_value'
    }, [location]);

};

Дякую вам, не вдалося знайти оновлену альтернативу, окрім вашої відповіді!
jamezrin

10

Якщо вам потрібно передати параметри URL

Там чудове пояснення Тайлера МакГінніса на своєму сайті, Посилання на пост

ось приклади коду:

  1. про компонент history.push:

    this.props.history.push(`/home:${this.state.userID}`)

  2. для компонента маршрутизатора ви визначаєте маршрут:

    <Route path='/home:myKey' component={Home} />

  3. на компоненті «Головна»:

componentDidMount(){
    const { myKey } = this.props.match.params
    console.log(myKey )
}

У мене є щось подібне, але якщо я оновити сторінку, вона повністю
вийде з

@rabiaasif, оскільки даних більше немає, потрібно зберігати їх або зберігати їх у локальному сховищі
Дрю Кордано,

3

Не обов'язково використовувати withRouter. Це працює для мене:

На своїй батьківській сторінці

<BrowserRouter>
   <Switch>
        <Route path="/routeA" render={(props)=> (
          <ComponentA {...props} propDummy={50} />
        )} />

        <Route path="/routeB" render={(props)=> (
          <ComponentB {...props} propWhatever={100} />
          )} /> 
      </Switch>
</BrowserRouter>

Тоді в ComponentA або ComponentB ви можете отримати доступ

this.props.history

об'єкта, включаючи метод this.props.history.push.


Я думаю, вам це не знадобилося, withRouterтому що ви завернули свій компонент BrowserRouter, який працює так само.
Пиріг 'Ой' Пах

Так, і ви передаєте propsвниз у кожен компонент, який включає historyопору.
Джеремі

2

Для використання React 16.8+ (withHooks) ви можете скористатися цим способом

import React from 'react';
import { useHistory } from 'react-router-dom';

export default function SomeFunctionalComponent() {
let history = useHistory(); // should be called inside react component

const handleClickButton = () => {    
"funcionAPICALL"
       .then(response => {
             if (response.status >= 200 && response.status < 300) {
                 history.push('/template');
              });
}

return ( <div> Some component stuff 
    <p>To make API POST request and redirect to "/template" click a button API CALL</p>
    <button onClick={handleClickButton}>API CALL<button>
</div>)
} 

Джерело тут, щоб прочитати більше https://reacttraining.com/react-router/web/example/auth-workflow


-12

Додайте інформацію, щоб отримати параметри запиту.

const queryParams = new URLSearchParams(this.props.location.search);
console.log('assuming query param is id', queryParams.get('id');

Для отримання додаткової інформації про URLSearchParams перегляньте це посилання URLSearchParams


1
Це зовсім не стосується React Router 4.
Колбі Кокс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.