Điều hướng lập trình bằng cách sử dụng bộ định tuyến phản ứng


1430

Với react-routertôi có thể sử dụng Linkphần tử để tạo các liên kết được xử lý tự nhiên bằng bộ định tuyến phản ứng.

Tôi thấy trong nội bộ nó gọi this.context.transitionTo(...).

Tôi muốn làm một điều hướng. Không phải từ một liên kết, mà từ một lựa chọn thả xuống (làm ví dụ). Làm thế nào tôi có thể làm điều này trong mã? Là this.context

Tôi đã thấy Navigationmixin, nhưng tôi có thể làm điều này mà không có mixins?


26
@SergioTapia hãy nhớ rằng câu hỏi này đặt ra một bản phát hành chính của bộ định tuyến phản ứng, một bản phát hành chính của React, và một bản phát hành chính của javascript
George Mauer

5
Đây là một liên kết đến hướng dẫn trong các tài liệu chính thức của bộ định tuyến phản ứng v4: Reacttraining.com/react-router/web/guides/scroll-restoration
chitzui

4
Bạn có thể kiểm tra câu trả lời này stackoverflow.com/questions/44127739/ từ
Shubham Khatri

4
Tôi rất vui vì bạn đã nhận được câu trả lời này, nhưng tôi buồn nó phải phức tạp như vậy. Điều hướng trong một ứng dụng web phải dễ dàng và được ghi chép đầy đủ. VueJS làm cho nó tầm thường. Mỗi thành phần được tự động đưa vào bộ định tuyến. Có một phần được xác định rõ ràng cho nó trong tài liệu của họ. router.vuejs.org/guide/essentials/navlation.html Tôi thích React cho rất nhiều thứ, nhưng đôi khi nó quá phức tạp. </ rant>
colefner

7
@GeorgeMauer Bạn nói đúng. Đó không phải là những gì cộng đồng này là về. Đó là về việc trả lời các câu hỏi, không phải tranh cãi về các khung. Cảm ơn đã nhắc nhở.
colefner

Câu trả lời:


1434

React Router v5.1.0 với hook

Có một useHistoryhook mới trong React Router> 5.1.0 nếu bạn đang sử dụng React> 16.8.0 và các thành phần chức năng.

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

function HomeButton() {
  const history = useHistory();

  function handleClick() {
    history.push("/home");
  }

  return (
    <button type="button" onClick={handleClick}>
      Go home
    </button>
  );
}

Bộ định tuyến phản ứng v4

Với v4 của React Router, có ba cách tiếp cận mà bạn có thể thực hiện để định tuyến theo chương trình trong các thành phần.

  1. Sử dụng thành phần withRouterbậc cao hơn.
  2. Sử dụng thành phần và kết xuất <Route>
  3. Sử dụng context.

React Router chủ yếu là một trình bao bọc xung quanh historythư viện. historyxử lý tương tác với trình duyệt window.historycho bạn với lịch sử băm và trình duyệt. Nó cũng cung cấp một lịch sử bộ nhớ hữu ích cho các môi trường không có lịch sử toàn cầu. Điều này đặc biệt hữu ích trong phát triển ứng dụng di động ( react-native) và thử nghiệm đơn vị với Node.

Một historythể hiện có hai phương thức để điều hướng: pushreplace. Nếu bạn nghĩ đó historylà một mảng các vị trí được truy cập, pushsẽ thêm một vị trí mới vào mảng và replacesẽ thay thế vị trí hiện tại trong mảng bằng vị trí mới. Thông thường bạn sẽ muốn sử dụng pushphương pháp khi bạn đang điều hướng.

Trong các phiên bản trước đó của Phản ứng Router, bạn phải tạo riêng của bạn historychẳng hạn, nhưng trong v4 sự <BrowserRouter>, <HashRouter><MemoryRouter>các thành phần sẽ tạo ra một trình duyệt, băm, và trường hợp bộ nhớ cho bạn. React Router làm cho các thuộc tính và phương thức của historythể hiện được liên kết với bộ định tuyến của bạn có sẵn thông qua ngữ cảnh, bên dưới routerđối tượng.

1. Sử dụng thành phần withRouterbậc cao

Thành phần withRouterbậc cao hơn sẽ tiêm historyđối tượng như một chỗ dựa của thành phần. Điều này cho phép bạn truy cập pushreplacecác phương thức mà không phải đối phó với context.

import { withRouter } from 'react-router-dom'
// this also works with react-router-native

const Button = withRouter(({ history }) => (
  <button
    type='button'
    onClick={() => { history.push('/new-location') }}
  >
    Click Me!
  </button>
))

2. Sử dụng thành phần và kết xuất <Route>

Thành <Route>phần không chỉ dành cho các vị trí phù hợp. Bạn có thể kết xuất một tuyến đường không có đường dẫn và nó sẽ luôn khớp với vị trí hiện tại . Thành <Route>phần này chuyển các đạo cụ tương tự như withRouter, vì vậy bạn sẽ có thể truy cập các historyphương thức thông qua historyprop.

import { Route } from 'react-router-dom'

const Button = () => (
  <Route render={({ history}) => (
    <button
      type='button'
      onClick={() => { history.push('/new-location') }}
    >
      Click Me!
    </button>
  )} />
)

3. Sử dụng bối cảnh *

Nhưng có lẽ bạn không nên

Tùy chọn cuối cùng là một tùy chọn mà bạn chỉ nên sử dụng nếu bạn cảm thấy thoải mái khi làm việc với mô hình bối cảnh của React (API bối cảnh của React ổn định kể từ v16).

const Button = (props, context) => (
  <button
    type='button'
    onClick={() => {
      // context.history.push === history.push
      context.history.push('/new-location')
    }}
  >
    Click Me!
  </button>
)

// you need to specify the context type so that it
// is available within the component
Button.contextTypes = {
  history: React.PropTypes.shape({
    push: React.PropTypes.func.isRequired
  })
}

1 và 2 là những lựa chọn đơn giản nhất để thực hiện, vì vậy đối với hầu hết các trường hợp sử dụng, chúng là cược tốt nhất của bạn.


24
Tôi đã thử sử dụng phương thức 1 theo cách này vớiRouter (({history}) => {console.log ("hhhhhhhh"); history.push ('/ bets')}); Nhưng nó không bao giờ hoạt động với bộ định tuyến 4
Dmitry Malugin 20/03/2017

57
GÌ!? Tôi chỉ có thể sử dụng withRouterthay vì chuyển historyqua tất cả các thành phần của mình ?? Gahh Tôi cần dành nhiều thời gian hơn để đọc tài liệu ...
hellojeffhall

18
Làm thế nào bạn có thể chạy history.push('/new-location')mà không gắn hành vi đó vào Nút hoặc thành phần DOM khác?
Neil

4
ném lỗi nhưUnexpected use of 'history' no-restricted-globals
Pardeep Jain

18
contextkhông còn thử nghiệm nữa như phản ứng 16.
phân tích

920

React-Router 5.1.0+ Trả lời (sử dụng hook và React> 16.8)

Bạn có thể sử dụng useHistoryhook mới trên Các thành phần chức năng và điều hướng theo chương trình:

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

function HomeButton() {
  let history = useHistory();
  // use history.push('/some/path') here
};

React-Router 4.0.0+ Trả lời

Trong 4.0 trở lên, sử dụng lịch sử làm chỗ dựa cho thành phần của bạn.

class Example extends React.Component {
   // use `this.props.history.push('/some/path')` here
};

LƯU Ý: this.props.history không tồn tại trong trường hợp thành phần của bạn không được hiển thị bởi <Route>. Bạn nên sử dụng <Route path="..." component={YourComponent}/>để có this.props.history trong YourComponent

React-Router 3.0.0+ Trả lời

Trong 3.0 trở lên, sử dụng bộ định tuyến làm chỗ dựa cho thành phần của bạn.

class Example extends React.Component {
   // use `this.props.router.push('/some/path')` here
};

React-Router 2.4.0+ Trả lời

Trong 2.4 trở lên, sử dụng thành phần bậc cao hơn để lấy bộ định tuyến làm chỗ dựa cho thành phần của bạn.

import { withRouter } from 'react-router';

class Example extends React.Component {
   // use `this.props.router.push('/some/path')` here
};

// Export the decorated class
var DecoratedExample = withRouter(Example);

// PropTypes
Example.propTypes = {
  router: React.PropTypes.shape({
    push: React.PropTypes.func.isRequired
  }).isRequired
};

React-Router 2.0.0+ Trả lời

Phiên bản này tương thích ngược với 1.x nên không cần Hướng dẫn nâng cấp. Chỉ cần đi qua các ví dụ là đủ tốt.

Điều đó nói rằng, nếu bạn muốn chuyển sang mẫu mới, có một mô-đun trình duyệt trong bộ định tuyến mà bạn có thể truy cập

import { browserHistory } from 'react-router'

Bây giờ bạn có quyền truy cập vào lịch sử trình duyệt của mình, vì vậy bạn có thể thực hiện những việc như đẩy, thay thế, v.v ... Giống như:

browserHistory.push('/some/path')

Đọc thêm: Lịch sửđiều hướng


React-Router 1.xx Trả lời

Tôi sẽ không đi vào chi tiết nâng cấp. Bạn có thể đọc về điều đó trong Hướng dẫn nâng cấp

Thay đổi chính về câu hỏi ở đây là thay đổi từ Điều hướng mixin sang Lịch sử. Bây giờ, nó đang sử dụng historyAPI của trình duyệt để thay đổi tuyến đường nên chúng tôi sẽ sử dụng pushState()từ bây giờ.

Đây là một ví dụ sử dụng Mixin:

var Example = React.createClass({
  mixins: [ History ],
  navigateToHelpPage () {
    this.history.pushState(null, `/help`);
  }
})

Lưu ý rằng điều này Historyđến từ dự án rackt / history . Không phải từ chính React-Router.

Nếu bạn không muốn sử dụng Mixin vì một số lý do (có thể vì lớp ES6), thì bạn có thể truy cập vào lịch sử mà bạn nhận được từ bộ định tuyến từ đó this.props.history. Nó sẽ chỉ có thể truy cập cho các thành phần được kết xuất bởi Bộ định tuyến của bạn. Vì vậy, nếu bạn muốn sử dụng nó trong bất kỳ thành phần con nào, nó cần được truyền lại dưới dạng một thuộc tính thông qua props.

Bạn có thể đọc thêm về bản phát hành mới tại tài liệu 1.0.x của họ

Đây là một trang trợ giúp cụ thể về việc điều hướng bên ngoài thành phần của bạn

Nó khuyên bạn nên lấy một tài liệu tham khảo history = createHistory()và kêu gọi replaceStatevề điều đó.

React-Router 0.13.x Trả lời

Tôi gặp vấn đề tương tự và chỉ có thể tìm ra giải pháp với Mixin điều hướng đi kèm với bộ định tuyến phản ứng.

Đây là cách tôi đã làm nó

import React from 'react';
import {Navigation} from 'react-router';

let Authentication = React.createClass({
  mixins: [Navigation],

  handleClick(e) {
    e.preventDefault();

    this.transitionTo('/');
  },

  render(){
    return (<div onClick={this.handleClick}>Click me!</div>);
  }
});

Tôi đã có thể gọi transitionTo()mà không cần truy cập.context

Hoặc bạn có thể thử ES6 ưa thích class

import React from 'react';

export default class Authentication extends React.Component {
  constructor(props) {
    super(props);
    this.handleClick = this.handleClick.bind(this);
  }

  handleClick(e) {
    e.preventDefault();

    this.context.router.transitionTo('/');
  }

  render(){
    return (<div onClick={this.handleClick}>Click me!</div>);
  }
}

Authentication.contextTypes = {
  router: React.PropTypes.func.isRequired
};

React-Router-Redux

Lưu ý: nếu bạn đang sử dụng Redux, có một dự án khác có tên React-Router-Redux cung cấp cho bạn các liên kết redux cho ReactRouter, sử dụng một cách tiếp cận tương tự như React-Redux thực hiện

React-Router-Redux có một vài phương thức khả dụng cho phép điều hướng đơn giản từ những người tạo hành động bên trong. Chúng có thể đặc biệt hữu ích cho những người có kiến ​​trúc hiện có trong React Native và họ muốn sử dụng các mẫu tương tự trong React Web với chi phí tối thiểu.

Khám phá các phương pháp sau:

  • push(location)
  • replace(location)
  • go(number)
  • goBack()
  • goForward()

Dưới đây là một ví dụ sử dụng, với Redux-Thunk :

./actioncreators.js

import { goBack } from 'react-router-redux'

export const onBackPress = () => (dispatch) => dispatch(goBack())

./viewcomponent.js

<button
  disabled={submitting}
  className="cancel_button"
  onClick={(e) => {
    e.preventDefault()
    this.props.onBackPress()
  }}
>
  CANCEL
</button>

3
Tôi đang sử dụng v2.4.0nhưng cách tiếp cận được đề cập không hiệu quả với tôi, ứng dụng của tôi hoàn toàn không hiển thị và các kết quả đầu ra của giao diện điều khiển: Uncaught TypeError: (0 , _reactRouter.withRouter) is not a functionđây là liên kết đến bài đăng SO của tôi: stackoverflow.com/questions/37306166/
Thẻ

7
Đây phải là câu trả lời được chấp nhận, câu trả lời được chấp nhận là một chút lộn xộn và rất cũ. @GiantElk Tôi có nó hoạt động như được mô tả trong câu trả lời cho phiên bản 2.6.0.
JMac

2
Cách tiếp cận này vẫn là cách được đề xuất cho phiên bản 3.0.x? Nhiều người dường như sử dụng contextcách này.
Velop

6
trong 4.0, this.props.history không tồn tại. Chuyện gì đang xảy ra vậy?
Nicolas S.Xu

4
@ NicolasS.Xu this.props.historykhông tồn tại trong trường hợp thành phần của bạn không được hiển thị bởi <Route>. Bạn nên sử dụng <Route path="..." component={YourComponent}/>để có this.props.historytrong YourComponent.
vogdb

508

Bộ định tuyến phản ứng v2

Đối với bản phát hành gần đây nhất ( v2.0.0-rc5), phương thức điều hướng được đề xuất là bằng cách đẩy trực tiếp vào đĩa đơn lịch sử. Bạn có thể thấy rằng trong hành động trong Điều hướng bên ngoài tài liệu Thành phần .

Đoạn trích có liên quan:

import { browserHistory } from 'react-router';
browserHistory.push('/some/path');

Nếu sử dụng API bộ định tuyến phản ứng mới hơn, bạn cần sử dụng historytừ this.propskhi bên trong các thành phần để:

this.props.history.push('/some/path');

Nó cũng cung cấp pushStatenhưng điều đó không được chấp nhận trên mỗi cảnh báo đã đăng nhập.

Nếu sử dụng react-router-redux, nó cung cấp một pushchức năng mà bạn có thể gửi như vậy:

import { push } from 'react-router-redux';
this.props.dispatch(push('/some/path'));

Tuy nhiên, điều này có thể chỉ được sử dụng để thay đổi URL, không thực sự điều hướng đến trang.


15
Đừng quên rằng API mới hơn không sử dụng import { browserHistory } from './react-router'mà thay vào đó tạo lịch sử bằng cách sử dụng import createBrowserHistory from 'history/lib/createBrowserHistory'. Sau đó, bạn có thể truy cập historytừ các đạo cụ thành phần:this.props.history('/some/path')
Ricardo Pedroni

7
var browserHistory = require('react-router').browserHistory; browserHistory.goBack();
Bobby

7
React-router-redux pushchỉ thay đổi URL, không thực sự thay đổi trang. Để làm cả hai, nhập browserHistorytừ react-routervà sử dụng browserHistory.push('/my-cool-path'). Thật không may, điều này không phải là siêu dễ dàng để tìm thấy. github.com/reactjs/react-router/blob/master/docs/guides/ mẹo
Andrew Samuelsen

4
Tôi đang sử dụng this.props.history.push ('/') nhưng chỉ URL được thay đổi ... Không có định tuyến thực tế đang diễn ra ở đây. Tôi đang thiếu gì?
rgcalsaverini


56

Đây là cách bạn làm điều này react-router v2.0.0với ES6 . react-routerđã chuyển khỏi mixins.

import React from 'react';

export default class MyComponent extends React.Component {
  navigateToPage = () => {
    this.context.router.push('/my-route')
  };

  render() {
    return (
      <button onClick={this.navigateToPage}>Go!</button>
    );
  }
}

MyComponent.contextTypes = {
  router: React.PropTypes.object.isRequired
}

5
Tôi tin rằng khuyến nghị hiện tại là sử dụng historysingleton như được nêu bởi @Bulk. Bạn có thể sử dụng context.routernhưng bạn đang thực sự khó khăn khi kiểm tra các thành phần đó vì việc khởi tạo chỉ thành phần đó sẽ không có điều này trong ngữ cảnh.
George Mauer

2
@GeorgeMauer Tôi nghĩ nó phụ thuộc vào nơi mã đang chạy. Theo tài liệu phản ứng, sử dụng bối cảnh.router được khuyến nghị nếu nó chạy trên máy chủ. github.com/reactjs/react-router/blob/master/upTHER-guides/iêu
KumarM

50

React-Router 4.x Trả lời:

Cuối cùng, tôi muốn có một đối tượng lịch sử duy nhất mà tôi có thể mang theo ngay cả các thành phần bên ngoài. Những gì tôi muốn làm là có một tệp history.js mà tôi nhập theo yêu cầu và chỉ cần thao tác với nó.

Bạn chỉ cần thay đổi BrowserRouterthành Bộ định tuyến và chỉ định lịch sử prop. Điều này không thay đổi bất cứ điều gì cho bạn ngoại trừ việc bạn có đối tượng lịch sử của riêng mình mà bạn có thể thao tác theo ý muốn.

Bạn cần cài đặt lịch sử , thư viện được sử dụng bởi react-router.

Ví dụ sử dụng, ký hiệu ES6:

history.js

import createBrowserHistory from 'history/createBrowserHistory'
export default createBrowserHistory()

BasicComponent.js

import React, { Component } from 'react';
import history from './history';

class BasicComponent extends Component {

    goToIndex(e){
        e.preventDefault();
        history.push('/');
    }

    render(){
        return <a href="#" onClick={this.goToIndex}>Previous</a>;
    }
}

EDIT ngày 16 tháng 4 năm 2018:

Nếu bạn phải điều hướng từ một thành phần thực sự được kết xuất từ ​​một Routethành phần, bạn cũng có thể truy cập lịch sử từ các đạo cụ, như thế:

BasicComponent.js

import React, { Component } from 'react';

class BasicComponent extends Component {

    navigate(e){
        e.preventDefault();
        this.props.history.push('/url');
    }

    render(){
        return <a href="#" onClick={this.navigate}>Previous</a>;
    }
}

2
Ngoại trừ các tài liệu Bộ định tuyến React cho chúng tôi biết, bạn không nên sử dụng Routerthay vì BrowserRouter. BrowserRoutertạo và duy trì historyđối tượng cho bạn. Bạn không nên mặc định tạo riêng cho mình, chỉ khi bạn ["cần tích hợp sâu với các công cụ quản lý nhà nước như Redux."] Reacttraining.com/react-router/web/api/Router
bulkz

2
Đó là điều tôi đã học được qua thời gian và kinh nghiệm. Mặc dù thường là một cách thực hành tốt để sử dụng mặc định this.props.history, tôi chưa tìm thấy giải pháp nào có thể giúp tôi làm một việc như vậy trong một lớp không phải là thành phần hoặc bất kỳ công cụ nào khác không được xây dựng như một thành phần React mà bạn có thể truyền lại đạo cụ Cảm ơn phản hồi của bạn :)
Eric Martin

44

Đối với điều này, người không kiểm soát phía máy chủ và vì điều này đang sử dụng bộ định tuyến băm v2:

Đặt lịch sử của bạn vào tệp riêng biệt (ví dụ: app_history.js ES6):

import { useRouterHistory } from 'react-router'
import { createHashHistory } from 'history'
const appHistory = useRouterHistory(createHashHistory)({ queryKey: false });

export default appHistory;

Và sử dụng nó ở khắp mọi nơi!

Điểm vào của bạn cho bộ định tuyến phản ứng (app.js ES6):

import React from 'react'
import { render } from 'react-dom'
import { Router, Route, Redirect } from 'react-router'
import appHistory from './app_history'
...
const render((
  <Router history={appHistory}>
  ...
  </Router>
), document.querySelector('[data-role="app"]'));

Điều hướng của bạn bên trong bất kỳ thành phần nào (ES6):

import appHistory from '../app_history'
...
ajaxLogin('/login', (err, data) => {
  if (err) {
    console.error(err); // login failed
  } else {
    // logged in
    appHistory.replace('/dashboard'); // or .push() if you don't need .replace()
  }
})

1
Cảm ơn. Có lẽ tôi đang thiếu một cái gì đó. Đây không phải là chính xác như hai câu trả lời hàng đầu?
George Mauer

2
Khi bạn đang sử dụng điều hướng "băm", trong "Reac-router" v2, bạn cần cài đặt "history" mô-đun bổ sung (nếu bạn muốn tránh các truy vấn băm lạ), và thay vì sử dụng browserHistory, bạn cần sử dụng useRouterHistory (createdHashHistory) ( {queryKey: false}). Đây là lý do chính tại sao tôi đăng bài này. Tôi đã chỉ ra cách điều hướng với lịch sử băm.
Alexey Volodko

1
Ồ, tôi hiểu rồi, bạn nói đúng. Tôi không còn ở dự án đó nữa nhưng tôi nghĩ cách ưa thích là sử dụng historycho cả hai cách tiếp cận bây giờ
George Mauer

4
Tại sao câu trả lời này không phải là tốt nhất? Tại sao gặp rắc rối với các nguyên mẫu Bối cảnh hoặc HOC hoặc sự kiện, tại sao không nhập lịch sử và sử dụng bất cứ nơi nào chúng tôi muốn? chỉ cần cố gắng để hiểu sự đánh đổi
Storm_buster

@storm_buster không có sự đánh đổi. Chúng tôi có các mô-đun ES6 và chúng tôi nên sử dụng chúng! Đây là một ví dụ điển hình về việc sử dụng công cụ của bạn (phản ứng trong trường hợp này) cho mọi thứ - ngay cả đối với những thứ bạn không thực sự muốn sử dụng chúng cho.
Capaj

40

Bộ định tuyến phản ứng V4

tl: dr;

if (navigate) {
  return <Redirect to="/" push={true} />
}

Câu trả lời đơn giản và khai báo là bạn cần sử dụng <Redirect to={URL} push={boolean} />kết hợp vớisetState()

đẩy: boolean - khi đúng, chuyển hướng sẽ đẩy một mục mới vào lịch sử thay vì thay thế mục hiện tại.


import { Redirect } from 'react-router'

class FooBar extends React.Component {
  state = {
    navigate: false
  }

  render() {
    const { navigate } = this.state

    // here is the important part
    if (navigate) {
      return <Redirect to="/" push={true} />
    }
   // ^^^^^^^^^^^^^^^^^^^^^^^

    return (
      <div>
        <button onClick={() => this.setState({ navigate: true })}>
          Home
        </button>
      </div>
    )
  }
}

Ví dụ đầy đủ ở đây . Đọc thêm ở đây .

Tái bút Ví dụ sử dụng ES7 + Trình khởi tạo thuộc tính để khởi tạo trạng thái. Nhìn vào đây là tốt, nếu bạn quan tâm.


Đây là câu trả lời tốt nhất tôi tìm thấy. Sử dụng withRouterkhông hoạt động khi đã trên tuyến đường đang được tải lại. Trong trường hợp của chúng tôi, chúng tôi phải chọn lọc setState(gây ra return <Redirect>) nếu đã có trên tuyến hoặc history.push()từ nơi khác.
karmakaze

Rất, rất thông minh. Nhưng rất đơn giản. Tks. Tôi đã sử dụng nó trong ReactRouterTable vì tôi muốn xử lý nhấp chuột trên toàn bộ dòng. Được sử dụng trên onRowClick để đặt trạng thái. setState ({navigationTo: "/ path /" + row.uuid});
Lovato

Đây là câu trả lời bằng chứng đạn.
Nitin Jadhav

31

Cảnh báo: câu trả lời này chỉ bao gồm các phiên bản ReactRouter trước 1.0

Tôi sẽ cập nhật câu trả lời này với các trường hợp sử dụng 1.0.0-RC1 sau!

Bạn có thể làm điều này mà không cần mixins quá.

let Authentication = React.createClass({
  contextTypes: {
    router: React.PropTypes.func
  },
  handleClick(e) {
    e.preventDefault();
    this.context.router.transitionTo('/');
  },
  render(){
    return (<div onClick={this.handleClick}>Click me!</div>);
  }
});

Gotcha với bối cảnh là nó không thể truy cập được trừ khi bạn định nghĩa contextTypestrên lớp.

Đối với bối cảnh là gì, nó là một đối tượng, giống như đạo cụ, được truyền từ cha mẹ sang con cái, nhưng nó được truyền lại một cách ngầm định, mà không phải tái phân phối đạo cụ mỗi lần. Xem https://www.tildedave.com/2014/11/15/int sinhtion-to-contexts-in-react-js.html


26

Tôi đã thử ít nhất 10 cách để làm điều này trước khi một cái gì đó hoạt động đúng!

withRouterCâu trả lời của @Felipe Skinner có một chút áp đảo đối với tôi và tôi không chắc chắn mình muốn tạo tên lớp mới "ExportedWithRouter".

Đây là cách đơn giản và gọn gàng nhất để thực hiện, tuần hoàn React-Router 3.0.0 và ES6:

React-Router 3.xx với ES6:

import { withRouter } from 'react-router';

class Example extends React.Component {
   // use `this.props.router.push('/some/path')` here
};

// Export the decorated class
export default withRouter(Example);

hoặc, nếu đó không phải là lớp mặc định của bạn, hãy xuất như sau:

withRouter(Example);
export { Example };

Lưu ý rằng trong 3.xx, <Link>chính thành phần này đang sử dụng router.push, vì vậy bạn có thể chuyển cho nó bất cứ thứ gì bạn sẽ vượt qua <Link to=thẻ, như:

   this.props.router.push({pathname: '/some/path', query: {key1: 'val1', key2: 'val2'})'

1
Nó hoạt động hoàn toàn tốt. Nhưng trả lời 200 OKthay vì 30xmã. Làm thế nào tôi có thể khắc phục vấn đề này?
Muhammad Ateeq Azam

1
Không chắc. Điều này không bao giờ xuất hiện với tôi vì đó không phải là yêu cầu bên ngoài - đó chỉ là trình duyệt của bạn sử dụng mã riêng của trang để thay đổi những gì trên trang. Bạn luôn có thể thực hiện chuyển hướng javascript thủ công nếu bạn thích.
Ben Wheeler

1
nó cũng có thể được sử dụng với @withRouter như một công cụ trang trí lớp ... tuyệt vời với mobx
Dan

21

Để thực hiện điều hướng theo chương trình, bạn cần đẩy một lịch sử mới vào đạo cụ.history trong bạn component, vì vậy một cái gì đó như thế này có thể làm việc cho bạn:

//using ES6
import React from 'react';

class App extends React.Component {

  constructor(props) {
    super(props)
    this.handleClick = this.handleClick.bind(this)
  }

  handleClick(e) {
    e.preventDefault()
    /* Look at here, you can add it here */
    this.props.history.push('/redirected');
  }

  render() {
    return (
      <div>
        <button onClick={this.handleClick}>
          Redirect!!!
        </button>
      </div>
    )
  }
}

export default App;

Vui lòng viết phiên bản của bộ định tuyến phản ứng
Ash

19

Đối với các thành phần Phản ứng ES6 +, giải pháp sau đây phù hợp với tôi.

Tôi đã theo dõi Felippe skinner, nhưng đã thêm một giải pháp kết thúc để giúp những người mới bắt đầu như tôi.

Dưới đây là các phiên bản tôi đã sử dụng:

"bộ định tuyến phản ứng": "^ 2.7.0"

"phản ứng": "^ 15.3.1"

Dưới đây là thành phần phản ứng của tôi, nơi tôi đã sử dụng điều hướng lập trình bằng bộ định tuyến phản ứng:

import React from 'react';

class loginComp extends React.Component {
   constructor( context) {
    super(context);
    this.state = {
      uname: '',
      pwd: ''
    };
  }

  redirectToMainPage(){
        this.context.router.replace('/home');
  }

  render(){
    return <div>
           // skipping html code 
             <button onClick={this.redirectToMainPage.bind(this)}>Redirect</button>
    </div>;
  }
};

 loginComp.contextTypes = {
    router: React.PropTypes.object.isRequired
 }

 module.exports = loginComp;

Dưới đây là cấu hình cho bộ định tuyến của tôi:

 import { Router, Route, IndexRedirect, browserHistory } from 'react-router'

 render(<Router history={browserHistory}>
          <Route path='/' component={ParentComp}>
            <IndexRedirect to = "/login"/>
            <Route path='/login' component={LoginComp}/>
            <Route path='/home' component={HomeComp}/>
            <Route path='/repair' component={RepairJobComp} />
            <Route path='/service' component={ServiceJobComp} />
          </Route>
        </Router>, document.getElementById('root'));

19

Có thể không phải là cách tiếp cận tốt nhất nhưng ... Sử dụng bộ định tuyến phản ứng v4, Bản mô tả sau đây có thể đưa ra ý tưởng cho một số người.

Trong thành phần được kết xuất bên dưới, ví dụ LoginPage, routerđối tượng có thể truy cập và chỉ cần gọi router.transitionTo('/homepage')để điều hướng.

Mã điều hướng được lấy từ .

"react-router": "^4.0.0-2", "react": "^15.3.1",

import Router from 'react-router/BrowserRouter';
import { History } from 'react-history/BrowserHistory';
import createHistory from 'history/createBrowserHistory';
const history = createHistory();

interface MatchWithPropsInterface {
  component: typeof React.Component,
  router: Router,
  history: History,
  exactly?: any,
  pattern: string
}

class MatchWithProps extends React.Component<MatchWithPropsInterface,any> {
  render() {
    return(
      <Match {...this.props} render={(matchProps) => (
             React.createElement(this.props.component, this.props)

        )}
       />
    )
  }
}

ReactDOM.render(
    <Router>
      {({ router }) => (
        <div>
          <MatchWithProps exactly pattern="/" component={LoginPage} router={router} history={history} />
          <MatchWithProps pattern="/login" component={LoginPage} router={router} history={history} />
          <MatchWithProps pattern="/homepage" component={HomePage} router={router} history={history} />
          <Miss component={NotFoundView} />
        </div>
      )}
    </Router>,

   document.getElementById('app')
);


1
Tại sao bạn không sử dụng vớiRouter và browserHistory?
Erwin Mayer

1
@Erwin API khác với v4. Xem github.com/ReactTraining/react-router/issues/3847 này .
mcku

1
@mcku Bạn lấy tập tin dts typcript của bạn cho bộ định tuyến v4 ở đâu?
jmathew

1
@jmathew Tôi không có bất kỳ định nghĩa loại nào cho bộ định tuyến phản ứng v4
mcku

16

Trong React-Router v4ES6

Bạn có thể sử dụng withRouterthis.props.history.push.

import {withRouter} from 'react-router-dom';

class Home extends Component {

    componentDidMount() {
        this.props.history.push('/redirect-to');
    }
}

export default withRouter(Home);

2
Đã được đề cập trong một số câu trả lời khác (bao gồm cả độ dài trong câu trả lời hàng đầu)
George Mauer

13

Để sử dụng withRoutervới một thành phần dựa trên lớp, hãy thử một cái gì đó như thế này dưới đây. Đừng quên thay đổi câu lệnh xuất để sử dụng withRouter:

import { withRouter } from 'react-router-dom'

class YourClass extends React.Component {
  yourFunction = () => {
    doSomeAsyncAction(() =>
      this.props.history.push('/other_location')
    )
  }

  render() {
    return (
      <div>
        <Form onSubmit={ this.yourFunction } />
      </div>
    )
  }
}

export default withRouter(YourClass);

11

dựa trên câu trả lời trước đó
từ Jose Antonio Postigo và Ben Wheeler
sự mới lạ? được phải được viết bằng nguyên cảo
và việc sử dụng các trang trí
HOẶC tĩnh bất động sản / lĩnh vực

import * as React from "react";
import Component = React.Component;
import { withRouter } from "react-router";

export interface INavigatorProps {
    router?: ReactRouter.History.History;
}

/**
 * Note: goes great with mobx 
 * @inject("something") @withRouter @observer
 */
@withRouter
export class Navigator extends Component<INavigatorProps, {}>{
    navigate: (to: string) => void;
    constructor(props: INavigatorProps) {
        super(props);
        let self = this;
        this.navigate = (to) => self.props.router.push(to);
    }
    render() {
        return (
            <ul>
                <li onClick={() => this.navigate("/home")}>
                    Home
                </li>
                <li onClick={() => this.navigate("/about")}>
                    About
                </li>
            </ul>
        )
    }
}

/**
 * Non decorated 
 */
export class Navigator2 extends Component<INavigatorProps, {}> {

    static contextTypes = {
        router: React.PropTypes.object.isRequired,
    };

    navigate: (to: string) => void;
    constructor(props: INavigatorProps, context: any) {
        super(props, context);
        let s = this;
        this.navigate = (to) =>
            s.context.router.push(to);
    }
    render() {
        return (
            <ul>
                <li onClick={() => this.navigate("/home")}>
                    Home
                </li>
                <li onClick={() => this.navigate("/about")}>
                    About
                </li>
            </ul>
        )
    }
}

với bất cứ điều gì npm được cài đặt ngày hôm nay. "Reac-router": "^ 3.0.0" và
"@ type / Reac-router": "^ 2.0.41"


11

với React-Router v4 ở đường chân trời, giờ đây có một cách mới để làm điều này.

import { MemoryRouter, BrowserRouter } from 'react-router';

const navigator = global && global.navigator && global.navigator.userAgent;
const hasWindow = typeof window !== 'undefined';
const isBrowser = typeof navigator !== 'undefined' && navigator.indexOf('Node.js') === -1;
const Router = isBrowser ? BrowserRouter : MemoryRouter;

<Router location="/page-to-go-to"/>

Reac-lego là một ứng dụng ví dụ cho thấy cách sử dụng / cập nhật bộ định tuyến Reac-router và nó bao gồm các ví dụ kiểm tra chức năng điều hướng ứng dụng.


5
Điều này rất tốt cho việc điều hướng từ chức năng kết xuất, mặc dù tôi tự hỏi làm thế nào để điều hướng từ một cái gì đó như móc vòng đời, hoặc chuyển hướng?
Ruben Martinez Jr.

11

Trong phản ứng bộ định tuyến v4. Tôi theo hai cách này để định tuyến theo chương trình.

1. this.props.history.push("/something/something")
2. this.props.history.replace("/something/something")

Số hai

Thay thế mục hiện tại trên ngăn xếp lịch sử

Để có được lịch sử trong đạo cụ, bạn có thể phải bọc thành phần của mình với

với đồ trang sức


Cảm ơn!! Câu trả lời hay nhất
Taha Farooqui

9

Nếu bạn đang sử dụng hàm băm hoặc lịch sử trình duyệt thì bạn có thể làm

hashHistory.push('/login');
browserHistory.push('/login');

2
hashHistory.push, không thể đọc thuộc tính "đẩy" của không xác định. Bạn nhập những thứ này từ đâu?
ArchNoob

nhập {hashHistory} từ "bộ định tuyến phản ứng"; bạn có thể nhập nó theo cách này ở đầu.
Zaman Afzal

Tôi đang sử dụng mẫu mã của bạn từ tệp saga redux của mình, nhập giống như cách bạn nói và sử dụng nó nhưng tôi vẫn tiếp tục nhận TypeError đó.
ArchNoob

8

Với phiên bản React hiện tại (15.3), this.props.history.push('/location');đã hoạt động với tôi, nhưng nó cho thấy cảnh báo sau:

browser.js: 49 Cảnh báo: [Reac-router] props.historycontext.historykhông được dùng nữa. Hãy sử dụng context.router.

và tôi đã giải quyết nó bằng cách sử dụng context.routernhư thế này:

import React from 'react';

class MyComponent extends React.Component {

    constructor(props) {
        super(props);
        this.backPressed = this.backPressed.bind(this);
    }

    backPressed() {
        this.context.router.push('/back-location');
    }

    ...
}

MyComponent.contextTypes = {
    router: React.PropTypes.object.isRequired
};

export default MyComponent;

1
Điều này đang làm việc cho V4. Chà ... gần ... nó thực sự cần phải là this.context.router.history.push ('/ back-location');
velohomme

7

Bộ định tuyến phản ứng V4

nếu bạn đang sử dụng phiên bản 4 thì bạn có thể sử dụng thư viện của tôi (phích cắm không biết xấu hổ) trong đó bạn chỉ cần gửi một hành động và mọi thứ chỉ hoạt động!

dispatch(navigateTo("/aboutUs"));

bộ ba


5

Những người đang phải đối mặt với các vấn đề trong việc thực hiện điều này trên bộ định tuyến v4.

Đây là một giải pháp làm việc để điều hướng thông qua ứng dụng phản ứng từ các hành động redux.

history.js

import createHistory from 'history/createBrowserHistory'

export default createHistory()

App.js / Route.jsx

import { Router, Route } from 'react-router-dom'
import history from './history'
...
<Router history={history}>
 <Route path="/test" component={Test}/>
</Router>

Another_file.js HOẶC tệp redux

import history from './history' 

history.push('/test') // this should change the url and re-render Test component

Tất cả là nhờ nhận xét này: ReactTraining vấn đề bình luận


4

Nếu xảy ra để ghép RR4 w / redux thông qua Reac -router-redux , hãy sử dụng các trình tạo hành động định tuyến từ đó react-router-reduxcũng là một tùy chọn.

import { push, replace, ... } from 'react-router-redux'

class WrappedComponent extends React.Component {
  handleRedirect(url, replaceState = true) { 
    replaceState 
      ? this.props.dispatch(replace(url)) 
      : this.props.dispatch(push(url)) 
  }
  render() { ... }
}

export default connect(null)(WrappedComponent)

Nếu sử dụng redux thunk / saga để quản lý luồng không đồng bộ, hãy nhập các trình tạo hành động ở trên trong các hành động redux và hook để phản ứng các thành phần bằng mapDispatchToProps có thể tốt hơn.


1
react-router-reduxđã bị phản đối / lưu trữ trong một thời gian dài
oligofren

4

Bạn cũng có thể sử dụng useHistorymóc trong một thành phần không trạng thái. Ví dụ từ các tài liệu.

import { useHistory } from "react-router"

function HomeButton() {
  const history = useHistory()

  return (
    <button type="button" onClick={() => history.push("/home")}>
      Go home
    </button>
  )
}

Lưu ý: Móc đã được thêm vào react-router@5.1.0và yêu cầureact@>=16.8


1
Cuộc gọi tốt, bạn có thể lưu ý phiên bản nào của bộ định tuyến phản ứng và phản ứng đề cập đến? Đây là một thay đổi mới không phải lúc nào cũng có sẵn
George Mauer

3

Câu trả lời đúng là cho tôi tại thời điểm viết

this.context.router.history.push('/');

Nhưng bạn cần thêm PropTypes vào thành phần của mình

Header.contextTypes = {
  router: PropTypes.object.isRequired
}
export default Header;

Đừng quên nhập PropTypes

import PropTypes from 'prop-types';

Vui lòng ghi lại phiên bản của bộ định tuyến phản ứng và bạn đã nhập gì từ bộ định tuyến phản ứng
Ash

Không có gì để nhập và đây là phiên bản "Reac-router": "^ 4.2.0"
quản trị trang web

3

Có thể không phải là giải pháp tốt nhất nhưng nó hoàn thành công việc:

import { Link } from 'react-router-dom';

// create functional component Post
export default Post = () => (
    <div className="component post">

        <button className="button delete-post" onClick={() => {
            // ... delete post
            // then redirect, without page reload, by triggering a hidden Link
            document.querySelector('.trigger.go-home').click();
        }}>Delete Post</button>

        <Link to="/" className="trigger go-home hidden"></Link>

    </div>
);

Về cơ bản, một logic gắn liền với một hành động (trong trường hợp này là xóa bài đăng) sẽ kết thúc việc gọi một trình kích hoạt để chuyển hướng. Điều này không lý tưởng vì bạn sẽ thêm nút 'kích hoạt' vào đánh dấu của mình để bạn có thể gọi nó một cách thuận tiện khi cần. Ngoài ra, bạn sẽ tương tác trực tiếp với DOM, điều mà trong thành phần React có thể không mong muốn.

Tuy nhiên, loại chuyển hướng này không được yêu cầu thường xuyên. Vì vậy, một hoặc hai liên kết ẩn, ẩn trong đánh dấu thành phần của bạn sẽ không ảnh hưởng nhiều, đặc biệt nếu bạn đặt cho chúng những cái tên có ý nghĩa.


Bạn có thể giải thích lý do tại sao bạn sẽ sử dụng điều này trên các giải pháp được chấp nhận?
George Mauer

Nó chỉ là một giải pháp thay thế cho vấn đề được thảo luận. Như đã nêu, không lý tưởng nhưng nó chỉ hoạt động tốt cho các chuyển hướng lập trình.
neatsu

2

Điều này làm việc cho tôi, không cần nhập khẩu đặc biệt:

<input 
  type="button" 
  name="back" 
  id="back" 
  class="btn btn-primary" 
  value="Back" 
  onClick={() => { this.props.history.goBack() }} 
/>

Tất nhiên điều này cần nhập khẩu đặc biệt - thành phần của bạn không chỉ historyđược thêm vào props. Điều đó xuất phát từ một HoC mà bạn sẽ cần nhập để sử dụng (các thành phần được gửi trực tiếp đến bởi RouteHoC đó nhưng sau đó bạn cần nhập cho Route...)
George Mauer

2

sử dụng hookrouter thay thế, phương án hiện đại cho bộ định tuyến phản ứng

https://www.npmjs.com/package/hookrouter

import { useRoutes, usePath, A} from "hookrouter";

để trả lời câu hỏi của OP về liên kết thông qua hộp chọn, bạn có thể thực hiện:

navigate('/about');

FYI. Bản thân tác giả gọi thư viện này là "bằng chứng của khái niệm" và nó đã không có hoạt động trong gần một năm (tháng 6 năm 2019).
MEMark

@MEMark đó là vì nó đã hoàn hảo
StefanBob

Vâng, 38 vấn đề mở, cùng với thực tế là phiên bản 2.0 sẽ được viết lại hoàn toàn theo trình tự động, nói khác.
MEMark

1

Đối với Bộ định tuyến React v4 +

Giả sử rằng bạn sẽ không cần điều hướng trong lần kết xuất ban đầu (mà bạn có thể sử dụng <Redirect>thành phần), đây là những gì chúng tôi đang làm trong ứng dụng của mình.

Xác định một tuyến đường trống trả về null, điều này sẽ cho phép bạn có quyền truy cập vào đối tượng lịch sử. Bạn cần phải làm điều này ở cấp cao nhất, nơi bạn Routerđược xác định.

Bây giờ bạn có thể làm tất cả những gì có thể được thực hiện trên lịch sử như history.push(), history.replace(), history.go(-1)vv!

import React from 'react';
import { HashRouter, Route } from 'react-router-dom';

let routeHistory = null;

export function navigateTo(path) {
  if(routeHistory !== null) {
    routeHistory.push(path);
  }
}

export default function App(props) {
  return (
    <HashRouter hashType="noslash">
      <Route
        render={({ history }) => {
          routeHistory = history;
          return null;
        }}
      />
      {/* Rest of the App */}
    </HashRouter>
  );
}

1

Reac-router-dom: 5.1.2

  • Trang web này có 3 trang, tất cả đều được hiển thị động trong trình duyệt.

  • Mặc dù trang không bao giờ làm mới, hãy chú ý cách Bộ định tuyến React giữ URL cập nhật khi bạn điều hướng qua trang web. Điều này bảo tồn lịch sử trình duyệt, đảm bảo những thứ như nút quay lại và dấu trang hoạt động đúng

  • Một Chuyển trông qua tất cả các yếu tố con của nó và làm cho cái đầu tiên mà con đường phù hợp với URL hiện tại. Sử dụng bất kỳ lúc nào bạn có nhiều tuyến đường, nhưng bạn chỉ muốn một trong số chúng hiển thị tại một thời điểm

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



export default function BasicExample() {
  return (
    <Router>
      <div>
        <ul>
          <li>
            <Link to="/">Home</Link>
          </li>
          <li>
            <Link to="/about">About</Link>
          </li>
          <li>
            <Link to="/dashboard">Dashboard</Link>
          </li>
        </ul>

        <hr />

        <Switch>
          <Route exact path="/">
            <Home />
          </Route>
          <Route path="/about">
            <About />
          </Route>
          <Route path="/dashboard">
            <Dashboard />
          </Route>
        </Switch>
      </div>
    </Router>
  );
}

// You can think of these components as "pages"
// in your app.

function Home() {
  return (
    <div>
      <h2>Home</h2>
    </div>
  );
}

function About() {
  return (
    <div>
      <h2>About</h2>
    </div>
  );
}

function Dashboard() {
  return (
    <div>
      <h2>Dashboard</h2>
    </div>
  );
}```

Chào mừng đến với SO! Khi bạn trả lời một câu hỏi với rất nhiều câu trả lời, hãy cố gắng thể hiện những lợi ích của bạn.
David García Bodego

Điều này cũng không trả lời câu hỏi làm thế nào để thực hiện nó theo chương trình từ js bắt buộc, không phải với đánh dấu.
George Mauer

1

Vì vậy, trong câu trả lời của tôi có 3 cách khác nhau để chuyển hướng lập trình đến một tuyến đường. Một số giải pháp đã được trình bày nhưng những giải pháp sau chỉ tập trung cho các thành phần chức năng với một ứng dụng demo bổ sung.

Sử dụng các phiên bản sau:

phản ứng: 16.13.1

phản ứng-dom: 16.13.1

bộ định tuyến phản ứng: 5.2.0

Reac-router-dom: 5.2.0

bản thảo: 3.7.2

Cấu hình:

Vì vậy, trước hết giải pháp đang sử dụng HashRouter, được cấu hình như sau:

<HashRouter>
    // ... buttons for redirect

    <Switch>
      <Route exact path="/(|home)" children={Home} />
      <Route exact path="/usehistory" children={UseHistoryResult} />
      <Route exact path="/withrouter" children={WithRouterResult} />
      <Route exact path="/redirectpush" children={RedirectPushResult} />
      <Route children={Home} />
    </Switch>
</HashRouter>

Từ các tài liệu về <HashRouter>:

A <Router>sử dụng phần băm của URL (nghĩa là window.location.hash) để giữ cho giao diện người dùng của bạn đồng bộ hóa với URL.

Các giải pháp:

  1. Sử dụng <Redirect>để đẩy bằng cách sử dụng useState:

Sử dụng trong một thành phần chức năng ( RedirectPushActionthành phần từ kho lưu trữ của tôi) chúng ta có thể sử dụng useStateđể xử lý chuyển hướng. Phần rắc rối là một khi chuyển hướng xảy ra, chúng ta cần thiết lập redirectlại trạng thái false. Bằng cách sử dụng setTimeOutvới 0độ trễ, chúng tôi đang đợi cho đến khi React cam kết Redirectvới DOM rồi lấy lại nút để sử dụng lần sau.

Vui lòng tìm ví dụ của tôi dưới đây:

const [redirect, setRedirect] = useState(false);
const handleRedirect = useCallback(() => {
    let render = null;
    if (redirect) {
        render = <Redirect to="/redirectpush" push={true} />

        // in order wait until commiting to the DOM
        // and get back the button for clicking next time
        setTimeout(() => setRedirect(false), 0);
    }
    return render;
}, [redirect]);

return <>
    {handleRedirect()}
    <button onClick={() => setRedirect(true)}>
        Redirect push
    </button>
</>

Từ <Redirect>tài liệu:

Kết xuất <Redirect>sẽ điều hướng đến một vị trí mới. Vị trí mới sẽ ghi đè vị trí hiện tại trong ngăn xếp lịch sử, giống như các chuyển hướng phía máy chủ (HTTP 3xx).

  1. Sử dụng useHistorymóc:

Trong giải pháp của tôi có một thành phần được gọi là UseHistoryActionđại diện sau:

let history = useHistory();

return <button onClick={() => { history.push('/usehistory') }}>
    useHistory redirect
</button>

Các useHistory móc cho chúng ta tiếp cận với các đối tượng lịch sử giúp chúng ta lập trình các tuyến đường điều hướng hoặc thay đổi.

  1. Sử dụng withRouter, lấy historytừprops :

Tạo một thành phần được gọi là WithRouterAction , hiển thị như dưới đây:

const WithRouterAction = (props:any) => {
    const { history } = props;

    return <button onClick={() => { history.push('/withrouter') }}>
        withRouter redirect
    </button>
}

export default withRouter(WithRouterAction);

Đọc từ withRouter tài liệu:

Bạn có thể có quyền truy cập vào các historythuộc tính của đối tượng và <Route>kết quả khớp gần nhất thông qua thành phần withRouterbậc cao hơn. withRoutersẽ vượt qua được cập nhật match, locationhistory đạo cụ để các thành phần quấn bất cứ khi nào nó ám.

Bản giới thiệu:

Để thể hiện tốt hơn tôi đã xây dựng một kho lưu trữ GitHub với các ví dụ này, vui lòng tìm nó bên dưới:

https://github.com/norbitrial/react-router-programmatically-redirect-examples

Tôi hi vọng cái này giúp được!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.