react-router ย้อนกลับหน้าคุณกำหนดค่าประวัติอย่างไร


124

ใครช่วยบอกหน่อยได้ไหมว่าฉันจะกลับไปที่หน้าที่แล้วแทนที่จะเป็นเส้นทางที่เจาะจงได้อย่างไร

เมื่อใช้รหัสนี้:

var BackButton = React.createClass({

 mixins: [Router.Navigation],
  render: function() {
    return (
        <button
            className="button icon-left"
            onClick={this.navigateBack}>
            Back
        </button>
    );
  },

  navigateBack: function(){
    this.goBack();
  }
});

รับข้อผิดพลาดนี้goBack () ถูกละเว้นเนื่องจากไม่มีประวัติเราเตอร์

นี่คือเส้นทางของฉัน:

// Routing Components
Route = Router.Route;
RouteHandler = Router.RouteHandler;
DefaultRoute = Router.DefaultRoute;

var routes = (
 <Route name="app" path="/" handler={OurSchoolsApp}>
     <DefaultRoute name="home" handler={HomePage} />
     <Route name="add-school" handler={AddSchoolPage}  />
     <Route name="calendar" handler={CalendarPage}  />
     <Route name="calendar-detail" path="calendar-detail/:id" handler={CalendarDetailPage} />
     <Route name="info-detail" path="info-detail/:id" handler={InfoDetailPage} />
     <Route name="info" handler={InfoPage} />
     <Route name="news" handler={NewsListPage} />
     <Route name="news-detail" path="news-detail/:id" handler={NewsDetailPage} />
     <Route name="contacts" handler={ContactPage} />
     <Route name="contact-detail" handler={ContactDetailPage} />
     <Route name="settings" handler={SettingsPage} />
 </Route>
 );

 Router.run(routes, function(Handler){
   var mountNode = document.getElementById('app');
   React.render(<Handler /> , mountNode);
 });

หากคุณพบวิธีแก้ปัญหาโปรดแบ่งปันที่นี่ ขอบคุณ
user261002

คำตอบ:


44

ฉันคิดว่าคุณเพียงแค่ต้องเปิดการใช้งาน BrowserHistory บนเราเตอร์ของคุณโดย intializing <Router history={new BrowserHistory}>มันเหมือนว่า:

ก่อนหน้านั้นคุณควรต้องการBrowserHistoryจาก'react-router/lib/BrowserHistory'

หวังว่าจะช่วยได้!

UPDATE: ตัวอย่างใน ES6

const BrowserHistory = require('react-router/lib/BrowserHistory').default;

const App = React.createClass({
    render: () => {
        return (
            <div><button onClick={BrowserHistory.goBack}>Go Back</button></div>
        );
    }
});

React.render((
    <Router history={BrowserHistory}>
        <Route path="/" component={App} />
    </Router>
), document.body);

สวัสดีเรากำลังประสบปัญหาเดียวกัน คุณช่วยอธิบายรายละเอียดเพิ่มเติมได้ไหม ขอบคุณ
user261002

23
นี่คือคำตอบที่ถูกต้องอย่างไร? นี่ไม่ได้ตอบคำถามด้วยซ้ำ @bomber
GN.

15
สำหรับใครที่อ่านเรื่องนี้ หากคุณต้องการทำสิ่งนี้จากองค์ประกอบลูก this.props.historyคุณสามารถค้นหาวัตถุประวัติศาสตร์ที่ ดังนั้นรหัสจึงกลายเป็นthis.props.history.goBack
Sisir

3
แล้ว react-router 4 ล่ะ? ฉันไม่คิดว่ามันรองรับ BrowserHistory อีกต่อไป
Akshay Lokur

1
สำหรับ react-router-dom เวอร์ชัน 5 ประวัติจะถูกสร้างขึ้นโดย BrowserRouter โดยปริยายและพร้อมใช้งานผ่านอุปกรณ์ประกอบฉากคุณสามารถเข้าถึงได้ผ่าน props.history
Srikanth Kyatham

98

อัปเดตด้วย React v16 และ ReactRouter v4.2.0 (ตุลาคม 2017):

class BackButton extends Component {
  static contextTypes = {
    router: () => true, // replace with PropTypes.object if you use them
  }

  render() {
    return (
      <button
        className="button icon-left"
        onClick={this.context.router.history.goBack}>
          Back
      </button>
    )
  }
}

อัปเดตด้วย React v15 และ ReactRouter v3.0.0 (สิงหาคม 2016):

var browserHistory = ReactRouter.browserHistory;

var BackButton = React.createClass({
  render: function() {
    return (
      <button
        className="button icon-left"
        onClick={browserHistory.goBack}>
        Back
      </button>
    );
  }
});

สร้างซอด้วยตัวอย่างที่ซับซ้อนขึ้นเล็กน้อยด้วย iframe แบบฝัง: https://jsfiddle.net/kwg1da3a/

React v14 และ ReacRouter v1.0.0 (10 ก.ย. 2015)

คุณสามารถทำได้:

var React = require("react");
var Router = require("react-router");

var SomePage = React.createClass({
  ...

  contextTypes: {
    router: React.PropTypes.func
  },
  ...

  handleClose: function () {
    if (Router.History.length > 1) {
      // this will take you back if there is history
      Router.History.back();
    } else {
      // this will take you to the parent route if there is no history,
      // but unfortunately also add it as a new route
      var currentRoutes = this.context.router.getCurrentRoutes();
      var routeName = currentRoutes[currentRoutes.length - 2].name;
      this.context.router.transitionTo(routeName);
    }
  },
  ...

คุณต้องระวังว่าคุณมีประวัติที่จำเป็นในการย้อนกลับ หากคุณกดเข้าที่หน้าโดยตรงแล้วกดกลับมันจะนำคุณกลับไปที่ประวัติเบราว์เซอร์ก่อนแอปของคุณ

โซลูชันนี้จะดูแลทั้งสองสถานการณ์ อย่างไรก็ตามจะไม่จัดการ iframe ที่สามารถนำทางภายในเพจได้ (และเพิ่มลงในประวัติเบราว์เซอร์) ด้วยปุ่มย้อนกลับ ตรงไปตรงมาฉันคิดว่านั่นเป็นจุดบกพร่องใน react-router สร้างปัญหาที่นี่: https://github.com/rackt/react-router/issues/1874


จะดีไหมถ้ามีวิธีทำโดยไม่ใช้บริบท
Adam D

1
นอกจากนี้ยังขึ้นอยู่กับการติดตั้งอาจจะใช้ this.props.history.goBack แทน this.context.router.history.goBack
PhoenixB

54
  1. นำเข้า withRouter

    import { withRouter } from 'react-router-dom';
  2. ส่งออกส่วนประกอบของคุณเป็น:

    export withRouter(nameofcomponent) 
  3. ตัวอย่างเมื่อคลิกปุ่มโทรgoBack:

    <button onClick={this.props.history.goBack}>Back</button>

ทดสอบบนreact-router-domv4.3


2
BTW withRouterการทำงานสำหรับฉันแม้จะไม่มีการนำเข้าหรือการใช้ บางทีเราอาจจะใช้ API เนทีฟประวัติเบราว์เซอร์ แต่ไหวมั้ย ??
Gianfranco P.

1
นั่นเป็นทางออกที่ดี ปัญหาเดียวเมื่อผู้ใช้ไปที่หน้าโดยใช้ URL โดยตรง -> แอปจะทำให้แอปเสียหายเนื่องจากไม่มีประวัติ
skryvets

2
คำอธิบายที่ดีที่สุดที่นี่
Z_z_Z

@MichaelFreidgeim ได้โปรดอัปโหลดข้อมูลโค้ดของคุณเพื่อที่ฉันจะได้ตรวจสอบและยืนยัน
gaurav makwana

43
this.context.router.goBack()

ไม่จำเป็นต้องมีการนำทางมิกซ์อิน!


1
สิ่งนี้ยังคงใช้ได้ใน React Router v4 แต่เป็นthis.context.router.history.goBackไฟล์. (+ ประวัติ)
Ben Gotow

13
ด้วย react-router-dom: "v4.2.2" และใช้import { withRouter } from 'react-router-dom';งานได้กับthis.props.history.goBack();
felansu

1
นอกจากความคิดเห็นของ @ felansu แล้วคุณยังต้องส่งออกส่วนประกอบของคุณด้วย Router ตามที่อธิบายไว้ในคำตอบstackoverflow.com/a/49130220/3123338
Mister Q

32

วิธี ES6 โดยไม่มี mixins โดยใช้ react-router, stateless function

import React from 'react'
import { browserHistory } from 'react-router'

export const Test = () => (
  <div className="">
    <button onClick={browserHistory.goBack}>Back</button>
  </div>
)

3
ฉันได้รับคำเตือนจากเบราว์เซอร์เมื่อลองใช้วิธีแก้ปัญหาของคุณ:export 'browserHistory' was not found in 'react-router'
Ralph David Abernathy

2
browserHistory มีอยู่ใน v2 และ v3 เท่านั้น หากคุณใช้ v4 คุณควรอ่านคู่มือการย้ายข้อมูล: github.com/ReactTraining/react-router/blob/…
ptorsson

@Ralp หากคุณได้รับข้อความแสดงข้อผิดพลาดโปรดตรวจสอบสิ่งนี้: stackoverflow.com/questions/49787659/…
Miles M.

14

ใช้ React Hooks

นำเข้า:

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

ในองค์ประกอบไร้สัญชาติ:

  let history = useHistory();

ในกิจกรรม

history.goBack()

<button onClick = {() => history.goBack ()}> ย้อนกลับ </button>
Hunter

ขอบคุณที่พูดถึงเรื่องนี้เพราะฉันชอบตะขอ ฉันใช้กับเราเตอร์จนถึงตอนนี้
newman

10

ตรวจสอบตัวอย่างการทำงานของฉันโดยใช้ปฏิกิริยาตอบสนองกับ 16.0 เตอร์ v4 ตัวอย่างสด ตรวจสอบรหัสGithub

ใช้withRouterและhistory.goBack()

นี่คือแนวคิดที่ฉันกำลังใช้ ...

History.js

import React, { Component } from 'react';
import { withRouter } from 'react-router-dom'
import './App.css'


class History extends Component {

  handleBack = () => {
    this.props.history.goBack()
  }

  handleForward = () => {
    console.log(this.props.history)
    this.props.history.go(+1)
  }

  render() {
    return <div className="container">
      <div className="row d-flex justify-content-between">
        <span onClick={this.handleBack} className="d-flex justify-content-start button">
          <i className="fas fa-arrow-alt-circle-left fa-5x"></i>
        </span>
        <span onClick={this.handleForward} className="d-flex justify-content-end button">
          <i className="fas fa-arrow-alt-circle-right fa-5x"></i>
        </span>
      </div>
    </div>
  }
}

export default withRouter(History)

PageOne.js

import React, { Fragment, Component } from 'react'

class PageOne extends Component {

   componentDidMount(){
      if(this.props.location.state && this.props.location.state.from != '/pageone')
      this.props.history.push({
         pathname: '/pageone',
         state: { 
             from: this.props.location.pathname
         }
       });
   }

   render() {
      return (
         <Fragment>
            <div className="container-fluid">
               <div className="row d-flex justify-content-center">
                  <h2>Page One</h2>
               </div>
            </div>
         </Fragment>
      )
   }
}

export default PageOne

ปล. ขออภัยรหัสใหญ่ต้องโพสต์ทั้งหมดที่นี่


1
นี่ควรเป็นคำตอบที่ยอมรับในปี 19 React Router มีส่วนประกอบลำดับที่สูงกว่า (HOC) ที่เรียกว่า "withRouter" เพื่อให้คุณสามารถรวมส่วนประกอบของคุณเพื่อให้สามารถเข้าถึงอุปกรณ์ประกอบฉากเช่นประวัติและตำแหน่งได้

1
ใช่เช่นเดียวกับเราเตอร์ใน HOC ในการรวมส่วนประกอบของคุณจะให้ประวัติและข้อมูลตำแหน่ง ไม่มีอะไรท้าทายให้อ่านต่อไปและไม่มีวันชำระ
Anupam Maurya

ฉันขอถามว่าทำไมคุณถึงส่งเครื่องหมายบวกไปยังgoฟังก์ชัน: history.go(+1)? history.go(1)ควรจะเพียงพอ
gion_13


8

นี่คือส่วนประกอบ BackButton ที่ใช้งานได้ (React 0.14):

var React = require('react');
var Router = require('react-router');

var History = Router.History;

var BackButton = React.createClass({
  mixins: [ History ],
  render: function() {
    return (
      <button className="back" onClick={this.history.goBack}>{this.props.children}</button>
    );
  }
});

module.exports = BackButton;

คุณสามารถทำบางสิ่งเช่นนี้ได้หากไม่มีประวัติ:

<button className="back" onClick={goBack}>{this.props.children}</button>

function goBack(e) {
  if (/* no history */) {
    e.preventDefault();
  } else {
    this.history.goBack();
  }
}

7

สำหรับ react-router v2.x สิ่งนี้มีการเปลี่ยนแปลง นี่คือสิ่งที่ฉันทำเพื่อ ES6:

import React from 'react';
import FontAwesome from 'react-fontawesome';
import { Router, RouterContext, Link, browserHistory } from 'react-router';

export default class Header extends React.Component {

  render() {
    return (
      <div id="header">
        <div className="header-left">
          {
            this.props.hasBackButton &&
            <FontAwesome name="angle-left" className="back-button" onClick={this.context.router.goBack} />
          }
        </div>
        <div>{this.props.title}</div>
      </div>
    )
  }
}

Header.contextTypes = {
  router: React.PropTypes.object
};

Header.defaultProps = {
  hasBackButton: true
};

Header.propTypes = {
  title: React.PropTypes.string
};

6

กลับไปที่หน้าเฉพาะ :

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

  const history = useHistory();
  
  const routeChange = () => {
    let path = '/login';
    history.push(path);
  };

กลับไปที่หน้าที่แล้ว :

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

  const history = useHistory();
  
  const routeChange = () => {
    history.goBack()
  };

2
ขอบคุณนี่คือคำตอบที่ยอดเยี่ยมในปี 2020! คำตอบที่ได้รับการยอมรับคือในปี 2015
beeftosino

5

ใน react-router v4.x คุณสามารถใช้ได้history.goBackซึ่งเทียบเท่ากับhistory.go(-1) .

App.js

import React from "react";
import { render } from "react-dom";
import { BrowserRouter as Router, Route, Link } from "react-router-dom";
import Home from "./Home";
import About from "./About";
import Contact from "./Contact";
import Back from "./Back";

const styles = {
  fontFamily: "sans-serif",
  textAlign: "left"
};

const App = () => (
  <div style={styles}>
    <Router>
      <div>
        <ul>
          <li><Link to="/">Home</Link></li>
          <li><Link to="/about">About</Link></li>
          <li><Link to="/contact">Contact</Link></li>
        </ul>

        <hr />

        <Route exact path="/" component={Home} />
        <Route path="/about" component={About} />
        <Route path="/contact" component={Contact} />

        <Back />{/* <----- This is component that will render Back button */}
      </div>
    </Router>
  </div>
);

render(<App />, document.getElementById("root"));

Back.js

import React from "react";
import { withRouter } from "react-router-dom";

const Back = ({ history }) => (
  <button onClick={history.goBack}>Back to previous page</button>
);

export default withRouter(Back);

การสาธิต: https://codesandbox.io/s/ywmvp95wpj

โปรดจำไว้ว่าการใช้historyผู้ใช้ของคุณสามารถออกได้เนื่องจากhistory.goBack()สามารถโหลดหน้าเว็บที่ผู้เยี่ยมชมเคยเยี่ยมชมก่อนที่จะเปิดแอปพลิเคชันของคุณ


เพื่อป้องกันสถานการณ์ดังที่อธิบายไว้ข้างต้นฉันได้สร้างไลบรารีแบบง่ายreact-router-last-locationเพื่อดูตำแหน่งสุดท้ายของผู้ใช้ของคุณ

การใช้งานตรงไปตรงมามาก แรกที่คุณจะต้องติดตั้งreact-router-domและจากreact-router-last-locationnpm

npm install react-router-dom react-router-last-location --save

จากนั้นใช้LastLocationProviderดังต่อไปนี้:

App.js

import React from "react";
import { render } from "react-dom";
import { BrowserRouter as Router, Route, Link } from "react-router-dom";
import { LastLocationProvider } from "react-router-last-location";
//              ↑
//              |
//              |
//
//       Import provider
//
import Home from "./Home";
import About from "./About";
import Contact from "./Contact";
import Back from "./Back";

const styles = {
  fontFamily: "sans-serif",
  textAlign: "left"
};

const App = () => (
  <div style={styles}>
    <h5>Click on About to see your last location</h5>
    <Router>
      <LastLocationProvider>{/* <---- Put provider inside <Router> */}
        <div>
          <ul>
            <li><Link to="/">Home</Link></li>
            <li><Link to="/about">About</Link></li>
            <li><Link to="/contact">Contact</Link></li>
          </ul>

          <hr />

          <Route exact path="/" component={Home} />
          <Route path="/about" component={About} />
          <Route path="/contact" component={Contact} />

          <Back />
        </div>
      </LastLocationProvider>
    </Router>
  </div>
);

render(<App />, document.getElementById("root"));

Back.js

import React from "react";
import { Link } from "react-router-dom";
import { withLastLocation } from "react-router-last-location";
//              ↑
//              |
//              |
//
//    `withLastLocation` higher order component
//    will pass `lastLocation` to your component               
//
//                   |
//                   |
//                   ↓
const Back = ({ lastLocation }) => (
  lastLocation && <Link to={lastLocation || '/'}>Back to previous page</Link>
);


//          Remember to wrap
//   your component before exporting
//
//                   |
//                   |
//                   ↓
export default withLastLocation(Back);

การสาธิต: https://codesandbox.io/s/727nqm99jj


คุณจะดึงออบเจ็กต์ LastLocation เข้ามาในส่วนประกอบที่ต้องการได้อย่างไรนั่นคือฉันต้องการใช้มันโดยทางโปรแกรมมากกว่าในผลลัพธ์ที่แสดงเช่นตัวอย่างของคุณ: if (lastLocation == 'about')
dmayo

ไม่แน่ใจว่าฉันเข้าใจคุณถูกต้องหรือไม่ดังนั้นโปรดแก้ไขฉันหากฉันผิด คุณต้องการใช้lastLocationภายนอก React หรืออาจจะพูดว่าI'd like to use it programmaticallyคุณต้องการแค่มีความสามารถในการนำเข้าแบบนั้นimport { lastLocation } from '...'หรือไม่?
hinok

5

สิ่งที่ได้ผลสำหรับฉันคือการนำเข้าด้วย Router ที่ด้านบนของไฟล์ของฉัน

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

จากนั้นใช้มันเพื่อตัดฟังก์ชั่นที่ส่งออกที่ด้านล่างของไฟล์ของฉัน

export default withRouter(WebSitePageTitleComponent)

ซึ่งทำให้ฉันสามารถเข้าถึงเสาประวัติของเราเตอร์ได้ โค้ดตัวอย่างเต็มด้านล่าง!

import React, { Component } from 'react'
import { withRouter } from 'react-router-dom'

import PropTypes from 'prop-types'

class TestComponent extends Component {
  constructor(props) {
    super(props)
    this.handleClick = this.handleClick.bind(this)
  }

  handleClick() {
    event.preventDefault()
    this.props.history.goBack()
  }

  render() {
    return (
      <div className="page-title">
        <a className="container" href="/location" onClick={this.handleClick}>
          <h1 className="page-header">
            { this.props.title }
          </h1>
        </a>
      </div>
    )
  }
}

const { string, object } = PropTypes

TestComponent.propTypes = {
  title: string.isRequired,
  history: object
}

export default withRouter(TestComponent)

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

this.props.history.goBack();

ฉันใช้เวอร์ชันเหล่านี้

"react": "^15.6.1",
"react-dom": "^15.6.1",
"react-router": "^4.2.0",
"react-router-dom": "^4.2.2",

2

ทางออกเดียวที่ได้ผลสำหรับฉันคือวิธีที่ง่ายที่สุด ไม่จำเป็นต้องนำเข้าเพิ่มเติม

<a href="#" onClick={() => this.props.history.goBack()}>Back</a>

Tks, IamMHussain


ดีมาก. เรียบง่ายและถ่อมตัว
Dinesh Kanivu

1

เรียกส่วนประกอบต่อไปนี้ดังนี้:

<BackButton history={this.props.history} />

และนี่คือส่วนประกอบ:

import React, { Component } from 'react'
import PropTypes from 'prop-types'
class BackButton extends Component {
  constructor() {
    super(...arguments)

    this.goBack = this.goBack.bind(this)
  }

  render() {
    return (
      <button
        onClick={this.goBack}>
          Back
      </button>
    )
  }

  goBack() {
    this.props.history.goBack()
  }
}

BackButton.propTypes = {
  history: PropTypes.object,
}

export default BackButton

ฉันกำลังใช้:

"react": "15.6.1"
"react-router": "4.2.0"

1

REDUX

คุณยังสามารถใช้react-router-reduxที่มีgoBack()และpush() .

นี่คือชุดตัวอย่างสำหรับสิ่งนั้น:

ในจุดเริ่มต้นของแอปคุณจำเป็นต้องConnectedRouterมีและบางครั้งการเชื่อมต่อที่ยุ่งยากในการเชื่อมต่อก็คือhistoryวัตถุ มิดเดิลแวร์ Redux รับฟังการเปลี่ยนแปลงประวัติ:

import React from 'react'
import { render } from 'react-dom'
import { ApolloProvider } from 'react-apollo'
import { Provider } from 'react-redux'
import { ConnectedRouter } from 'react-router-redux'
import client from './components/apolloClient'
import store, { history } from './store'
import Routes from './Routes'
import './index.css'

render(
  <ApolloProvider client={client}>
    <Provider store={store}>
      <ConnectedRouter history={history}>
        <Routes />
      </ConnectedRouter>
    </Provider>
  </ApolloProvider>,
  document.getElementById('root'),
)

ฉันจะแสดงวิธีเชื่อมต่อไฟล์history. สังเกตว่าประวัติถูกนำเข้ามาในร้านค้าอย่างไรและยังส่งออกเป็นซิงเกิลตันเพื่อให้สามารถใช้ในจุดเริ่มต้นของแอปได้:

import { createStore, applyMiddleware, compose } from 'redux'
import { routerMiddleware } from 'react-router-redux'
import thunk from 'redux-thunk'
import createHistory from 'history/createBrowserHistory'
import rootReducer from './reducers'

export const history = createHistory()

const initialState = {}
const enhancers = []
const middleware = [thunk, routerMiddleware(history)]

if (process.env.NODE_ENV === 'development') {
  const { devToolsExtension } = window
  if (typeof devToolsExtension === 'function') {
    enhancers.push(devToolsExtension())
  }
}

const composedEnhancers = compose(applyMiddleware(...middleware), ...enhancers)
const store = createStore(rootReducer, initialState, composedEnhancers)

export default store

บล็อกตัวอย่างข้างต้นแสดงวิธีโหลดตัวreact-router-reduxช่วยมิดเดิลแวร์ซึ่งเสร็จสิ้นกระบวนการตั้งค่า

ฉันคิดว่าส่วนต่อไปนี้เป็นส่วนพิเศษอย่างสมบูรณ์ แต่ฉันจะรวมไว้ในกรณีที่มีคนพบประโยชน์ในอนาคต:

import { combineReducers } from 'redux'
import { routerReducer as routing } from 'react-router-redux'

export default combineReducers({
  routing, form,
})

ฉันใช้routerReducerตลอดเวลาเพราะมันช่วยให้ฉันบังคับโหลดส่วนประกอบที่ปกติไม่ได้เกิดจากshouldComponentUpdate. ตัวอย่างที่เห็นได้ชัดคือเมื่อคุณมี Nav Bar ที่ควรจะอัปเดตเมื่อผู้ใช้กดNavLinkปุ่ม ถ้าคุณไปลงที่ถนนที่คุณจะได้เรียนรู้ว่า Redux shouldComponentUpdateของการใช้วิธีการเชื่อมต่อ ด้วยrouterReducerคุณสามารถใช้mapStateToPropsเพื่อแมปการเปลี่ยนแปลงเส้นทางลงในแถบนำทางและสิ่งนี้จะทริกเกอร์ให้อัปเดตเมื่อวัตถุประวัติเปลี่ยนแปลง

แบบนี้:

const mapStateToProps = ({ routing }) => ({ routing })

export default connect(mapStateToProps)(Nav)

ยกโทษให้ฉันในขณะที่ฉันเพิ่มคำหลักพิเศษสำหรับผู้คน: หากส่วนประกอบของคุณอัปเดตไม่ถูกต้องให้ตรวจสอบshouldComponentUpdateโดยการลบฟังก์ชันการเชื่อมต่อและดูว่าสามารถแก้ไขปัญหาได้หรือไม่ หากเป็นเช่นนั้นให้ดึงrouterReducerและส่วนประกอบจะอัปเดตอย่างถูกต้องเมื่อ URL เปลี่ยนไป

ในการปิดท้ายคุณสามารถโทรgoBack()หรือpush()ทุกเวลาที่ต้องการได้!

ลองใช้เลยในองค์ประกอบแบบสุ่ม:

  1. นำเข้า connect()
  2. คุณไม่ต้องการmapStateToPropsหรือmapDispatchToProps
  3. นำเข้าใน goBack และผลักดันจาก react-router-redux
  4. โทร this.props.dispatch(goBack())
  5. โทร this.props.dispatch(push('/sandwich'))
  6. สัมผัสกับอารมณ์เชิงบวก

หากคุณต้องการการสุ่มตัวอย่างเพิ่มเติมโปรดดู: https://www.npmjs.com/package/react-router-redux



1

ตอบสนองเราเตอร์ v6.0

useNavigate ขอแนะนำให้ย้อนกลับไปตอนนี้:

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

function App() {
  const navigate = useNavigate();

  return (
    <>
      <button onClick={() => navigate(-1)}>go back</button>
      <button onClick={() => navigate(1)}>go forward</button>
    </>
  );
}

ตัวอย่างรหัสแซนด์บ็อกซ์

ย้อนกลับ / ส่งต่อรายการสแต็กประวัติหลายรายการ:
<button onClick={() => navigate(-2)}>go two back</button>
<button onClick={() => navigate(2)}>go two forward</button>
ไปที่เส้นทางเฉพาะ:
navigate("users") // go to users route, like history.push
navigate("users", { replace: true }) // go to users route, like history.replace
navigate("users", { state }) // go to users route, pass some state in

useNavigate แทนที่ useHistoryเพื่อรองรับโหมด React Suspense / Concurrent ที่กำลังจะมีขึ้น


ฉันพยายามลองสิ่งนี้ แต่ได้รับข้อผิดพลาด:Attempted import error: 'useNavigate' is not exported from 'react-router-dom'.
Geek

1
@Geek จับดี. ด้วยv6.0.0-beta.0devs ทำให้historyแพคเกจมีการพึ่งพาเพียร์ ดู Codesandbox ที่อัปเดตซึ่งใช้งานได้อีกครั้งในขณะนี้
ford04


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.