रिएक्टर राउटर url बदलता है लेकिन दृश्य नहीं


87

मुझे रूटिंग के साथ प्रतिक्रिया में दृश्य बदलने में परेशानी हो रही है। मैं केवल उपयोगकर्ताओं की एक सूची दिखाना चाहता हूं, और प्रत्येक उपयोगकर्ता पर क्लिक करके विवरण पृष्ठ पर जाना चाहिए। यहाँ राउटर है:

import React from "react";
import ReactDOM from "react-dom";
import { BrowserRouter } from 'react-router-dom';
import Users from "./components/Users";
import { Router, Route } from "react-router";
import Details from "./components/Details";

ReactDOM.render((
  <BrowserRouter>
    <div>
        <Route path="/" component={Users} />
        <Route path="/details" component={Details} />
    </div>
  </BrowserRouter>
), document.getElementById('app'))

जब मैं url / विवरण का उपयोग करता हूं तो मेरा ब्राउज़र उस url पर नेविगेट करता है, लेकिन दृश्य नहीं बदलता है। कोई अन्य मार्ग 404 फेंकता है, इसलिए यह मार्ग को पहचानता है लेकिन अद्यतन नहीं करता है।


मुझे दो त्रुटियां मिल रही हैं: एक यह बताते हुए कि मुख्य प्रतिक्रिया पैकेज से प्रॉपटीज़ का उपयोग करना पदावनत है। React.createClass का उपयोग करते हुए दो चरणों को हटा दिया गया है। मैंने सोचा कि यह असंबंधित है, क्योंकि कोड बिना रूटिंग का उपयोग किए काम करता है।
मरिआन 87

क्या आपका घटक सही ढंग से बढ़ रहा है?
जेरेमी जॉन

जवाबों:


74

आपको exactअपनी अनुक्रमणिका के लिए विशेषता निर्दिष्ट करने की आवश्यकता है , अन्यथा /detailsमार्ग के लिए यह अभी भी साथ मेल खाएगा /। इसके अलावा आयात करने की कोशिश Routeसेreact-router-dom

import React from "react";
import ReactDOM from "react-dom";
import { BrowserRouter, Route } from 'react-router-dom';
import Users from "./components/Users";

import Details from "./components/Details";

ReactDOM.render((
  <BrowserRouter>
    <div>
        <Route exact path="/" component={Users} />
        <Route path="/details" component={Details} />
    </div>
  </BrowserRouter>
), document.getElementById('app'))

अपडेट करें:

एक और चीज जो आपको करने की जरूरत है वह है अपने कंपोनेंट को यूजर्स के साथ जोड़ना withRouter। आपको withRouterकेवल तभी उपयोग करने की आवश्यकता है जब आपका घटक प्राप्त नहीं कर रहा है Router props,

यह उन मामलों में हो सकता है जब आपका घटक राउटर द्वारा प्रदान किए गए घटक का एक नेस्टेड बच्चा है या आपने राउटर प्रॉप्स को पास नहीं किया है या जब घटक राउटर से जुड़ा नहीं है और इसे एक अलग घटक के रूप में प्रस्तुत किया गया है मार्गों।

Users.js में जोड़ें

import {withRouter} from 'react-router';

.........
export default withRouter(Users)

डॉक्स


प्रॉप्टिप्स चेतावनी को npm install -S 'prop-types'React.PropsTypes को PropTypes के साथ स्थापित और प्रतिस्थापित करके हटाया जा सकता है । इसके अलावा अपने पैकेज को अपडेट करें। अन्य पैकेज का उपयोग करने के लिए अपने पैकेज को अपडेट करें क्योंकि अन्य पैकेज अभी भी React.PropTypes और React.createClass का उपयोग कर सकते हैं
शुभम खत्री

इसके अलावा क्या आप पृष्ठ को फिर से लोड करने की कोशिश करते हैं जब url यह देखने के लिए बदल जाता है कि यह लोड होता है या नहीं
शुभम खत्री

मैंने पृष्ठ को पुनः लोड करने का प्रयास किया, इससे दृश्य परिवर्तित नहीं होता है। भले ही यह url / # / विवरण
Maryan87

2
क्या आप Route'प्रतिक्रिया-राउटर-डोम' से आयात किए गए अद्यतन उत्तर की कोशिश कर सकते हैंreact-router
शुभम खत्री

यदि इसका समाधान अभी तक नहीं हुआ है, तो अपने उपयोगकर्ताओं के घटक के साथ बाँधें withRouter, इससे मुझे पहले उसी मुद्दे को हल करने में मदद मिली है। मुझे बताएं। मैंने कोड भी अपडेट कर दिया है।
शुभम खत्री

27

आपको सिर्फ राउटर के अंदर के पुर्ज़ों को लपेटना है

<Route exact path="/mypath" component={withRouter(MyComponent)} />

यहाँ एक नमूना App.js फ़ाइल है:

...
import { BrowserRouter as Router, Route, Switch, withRouter } from "react-router-dom";
import Home from "./pages/Home";
import Profile from "./pages/Profile";

class App extends Component {
  render() {
    return (
      <Router>
        <Switch>
          <Route exact path="/" component={withRouter(Home)} />
          <Route exact path="/profile" component={withRouter(Profile)} />
        </Switch>
      </Router>
    );
  }
}

export default App;

अतिरिक्त

यदि आप प्रतिक्रिया राउटर का उपयोग कर रहे हैं, तो जब भी url बदलता है , तो घटकWillReceiveProps को कॉल किया जाएगा।

componentWillReceiveProps(nextProps) {
    var currentProductId = nextProps.match.params.productId;
    var nextProductId = nextProps.match.params.productId; // from the new url
    ...
}

ध्यान दें

वैकल्पिक रूप से, आप निर्यात से पहले घटक को राउटर में भी लपेट सकते हैं , लेकिन फिर आपको कुछ अन्य चीजों को सुनिश्चित करना होगा। मैं आमतौर पर इस कदम को छोड़ देता हूं।

export default withRouter(Profile)

3
<मार्ग सटीक मार्ग = "/ mypath" घटक = {withRouter (MyComponent)} /> मेरे लिए काम किया
संतोष कुमार

16

मेरे पास एक ही मुद्दा था और पता चला कि यह इसलिए था क्योंकि मेरे पास एक नेस्टेड राउटर था। एक बार जब मैंने नेस्टेड राउटर को हटा दिया, और बस एक स्विच घटक के भीतर अपने घटक-विशिष्ट मार्गों को डाल दिया - समस्या को राउटर का उपयोग किए बिना या कोई अतिरिक्त परिवर्तन किए बिना हल किया गया था।

<Router> // <--Remove nested Router
    <Switch>
      <Route exact path="/workflows" component={ViewWorkflows} />
      <Route path="/workflows/new" component={NewWorkflow} />
    </Switch>
</Router>

युसुफबेक एक ऐसे ही मुद्दे का वर्णन कर रहा है। मुझे लगता है कि घटक संबंधित मार्गों को दृश्य स्तर पर संग्रहीत करने के लिए यह एक बहुत क्लीनर है। इन सभी को एक मुख्य राउटर में संग्रहीत किया जाता है। एक उत्पादन ऐप में, यह बहुत सारे मार्गों को आसानी से पढ़ने और डिबग मुद्दों के माध्यम से रास्ता बनाने वाला है।


मैं क्रिएट-रिएक्शन-ऐप का उपयोग कर रहा हूं और यह मेरे लिए काम कर रहा है। दी मैंने कुछ यूट्यूब ट्यूटोरियल के बाद अपना राउटर सेटअप बनाया है, इसलिए क्रिएट-रिएक्शन-ऐप संबंधित नहीं हो सकता है।
डस्टिन अंग्रेजी

14

मैंने उसी समस्या का सामना किया है लेकिन मैंने इसे ठीक कर लिया है। मैंने आखिरी के रूप में होम पेज रखा है। इससे मेरा काम बनता है। नीचे की तरह।

    import React from "react";
    import ReactDOM from "react-dom";
    import { BrowserRouter } from 'react-router-dom';
    import Users from "./components/Users";
    import { Router, Route } from "react-router";
    import Details from "./components/Details";

    ReactDOM.render((
      <BrowserRouter>
        <div>
            <Route path="/details" component={Details} />
            <Route path="/" component={Users} />
        </div>
      </BrowserRouter>
    ), document.getElementById('app'))


5
exactसंपत्ति का उपयोग करना भी आप के लिए यह हल हो गया होता।
isherwood

8

Redux का उपयोग करते समय और मेरे पास समान मुद्दे थे जहां यूआरएल पता बार में अपडेट हो रहा था लेकिन ऐप संबंधित घटक को लोड नहीं कर रहा था। मैं निर्यात में withRouter को जोड़कर हल करने में सक्षम था:

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

export default withRouter(connect(mapStateToProps)(MyComponentName))

7

मेरे पास एक समान मुद्दा था लेकिन अलग संरचना के साथ। मैंने एक राउटर जोड़ा है जो सभी मार्गों को संभाल लेगा, मैंने दृश्यों को स्विच करने के लिए स्विच घटक का उपयोग किया है। लेकिन वास्तव में, यह नहीं था। केवल URL बदला गया, लेकिन नहीं देखा गया। इसका कारण साइडबार घटक के अंदर प्रयुक्त लिंक घटक था जो राउटर घटक के बाहर था। (हां, मैंने साइडबार को "विथ राउटर" के साथ निर्यात किया है, काम नहीं किया है)। इसलिए, समाधान मेरे साइडबार घटक को स्थानांतरित करने के लिए था, जो सभी लिंक घटकों को मेरे राउटर में रखता है।

समस्या मेरे लिंकर्स में है, वे मेरे राउटर के बाहर हैं

<div className="_wrapper">
  <SideBar /> // Holds my all linkers
  <Router>
     <Switch>
       <Route path="/" component={Home} />
       <Route path="/users" component={Users} />
     </Switch>
  </Router>
 </div>

सॉल्यूशन मेरे लिंकर्स को मेरे राउटर में ले जा रहा था

<div className="_wrapper">
  <Router>
     <SideBar /> // Holds my all linkers
     <Switch>
       <Route path="/" component={Home} />
       <Route path="/users" component={Users} />
     </Switch>
  </Router>
</div>

3
खुद को मेरा दिन बनाने में मदद करना। मैं इसे दो अलग-अलग राउटर्स के साथ आज़मा रहा था। एक नेवबार के भीतर था और एक शरीर के भीतर था। अब मैं मूल घटक में एक ही राउटर के भीतर सब कुछ डाल देता हूं और चीजों को काम करना चाहिए।
मैट्यूस बारबोसा

3
बहुत बढ़िया - मेरा सटीक मुद्दा। धन्यवाद
ज्योफ्री बॉर्न

2
धन्यवाद! तुमने मुझे बचाया!!
AzizStark

1
मैंने सब कुछ करने की कोशिश की है, जिसमें राउटर भी शामिल है, लेकिन केवल इस समाधान ने काम किया ... यह समझने में थोड़ा मददगार होगा कि यह क्यों हो रहा है
जिम

1
@Jim मुझे लगता है कि प्रतिक्रिया रूटर का उपयोग करता है संदर्भ API, और <Router />उर्फ <BrowserRouter /> तरह मार्ग matchers करने के लिए एक संदर्भ प्रदान करता है <Route />, <Switch /> और इस तरह नेविगेशन घटकों <Link />, <Redirect />। समान संदर्भ प्रदान करने के लिए, आपको संदर्भ प्रदाता के भीतर सभी बच्चों के घटकों को लपेटना होगा <Router />
युसुफबेक


5

BrowserRouter आपके मामले में इतिहास को बनाए रखने में विफल है। इसके बजाय "राउटर" का उपयोग करें, प्रॉप्स के रूप में कस्टम इतिहास के साथ इसका उपयोग आपकी समस्या को हल करने में मदद कर सकता है।

import {Router, Route, Switch, withRouter } from "react-router-dom";
import Home from "./pages/Home";
import Profile from "./pages/Profile";
import {createBrowserHistory} from 'history';

export const customHistory = createBrowserHistory();  //This maintains custom history

class App extends Component {
  render() {
    return (
      <Router history={customHistory}>
        <Switch>
          <Route exact path="/" component={Home} />
          <Route exact path="/profile" component={Profile} />
        </Switch>
      </Router>
    );
  }
}

export default App;

फिर अपने घटकों में, 'App' से कस्टमहिस्ट्री आयात करें और नेविगेट करने के लिए इसका उपयोग करें।

customHistory.push('/pathname');

उममीद है कि इससे मदद मिलेगी! :)


1
exactजब आप उपयोग करते हैं तो विशेषता की कोई आवश्यकता नहीं हैSwitch
KBT

4

आप सूचकांक मार्ग के लिए सटीक जोड़ने की जरूरत है और न कि उन enclosing से मार्ग div द्वारा घटकों, उपयोग स्विच से मार्गों के बीच स्विच करने के लिए प्रतिक्रिया रूटर-डोम।

import React from "react";
import ReactDOM from "react-dom";
import { Route, Switch } from 'react-router-dom';
import Users from "./components/Users";

import Details from "./components/Details";

ReactDOM.render((
  <div>
    <Switch>
        <Route path="/" component={Users} exact/>
        <Route path="/details" component={Details} />
    </Switch>
  </div>
), document.getElementById('app'))

3

मैं इसी तरह की प्रतिक्रिया के साथ था रूटर 4 संस्करण:

<Link />घटक पर क्लिक करने से , URL बदल जाएगा लेकिन दृश्य नहीं दिखेंगे।

विचारों में से एक के PureComponentबजाय Component(से आयातित react) का उपयोग कर रहा था और यही कारण था।

सभी मार्ग प्रदान की घटक है कि उपयोग कर रहे थे बदलकर PureComponentकरने के लिए Component, मेरी समस्या का समाधान किया गया था।

(संकल्प स्रोत: https://github.com/ReactTraining/react-router/issues/4975#issuecomment-355393785 )


1
धन्यवाद। उसने मेरे लिए इसे हल कर दिया। लेकिन यह सिर्फ घटक था जिसमें स्विच शामिल था जिसे मुझे काम करने के लिए लाइव दृश्य बदलने के लिए PureComponent के बजाय घटक से विस्तारित करना था।
क्रिस्टियान वेस्टरबेक

1
मैंने अपने शुद्ध घटक को घटक में बदल दिया है, हालांकि यह मेरे लिए काम नहीं कर रहा है।
कोसलराम राम कृष्णन

2

मैं इसी तरह के मुद्दे का सामना कर रहा था, मैं इसे पसंद करने के लिए संकल्प करता हूं, कृपया मुझे देखो कि यह काम कर रहा है।

आपको अपने कंपोनेंट में कंपोनेंटवैलिसेपप्रॉप्स फंक्शन का उपयोग करने की आवश्यकता है ।

पहली बार url www.example.com/content1/ ComponentsDidMount () चलाकर एक लिंक पर क्लिक किया गया।

अब जब आप किसी अन्य लिंक पर क्लिक करते हैं तो कहते हैं कि www.example.com/content2/ समान घटक को कहा जाता है, लेकिन इस बार प्रोप में परिवर्तन होता है और आप इस नए प्रोप को कंपोनेंटलीवरसिवप्रॉप्स (नेक्स्टप्रॉप्स) के तहत एक्सेस कर सकते हैं, जिसका उपयोग आप API या स्टेट को कॉल करने के लिए कर सकते हैं और नया प्राप्त कर सकते हैं डेटा।

componentWillReceiveProps(nextProps){
     //call your API and update state with new props
}

1

हम्म कोई वास्तव में विचारों को स्विच करने के लिए कोई स्विच है।

यह है कि मैं लैंडलाइन पेज से मुख्य साइट पर स्विच करने के लिए राउटर का उपयोग कैसे करता हूं

//index.jsx    
ReactDOM.render( (<BrowserRouter><App/></BrowserRouter>), document.getElementById('root') );


//App.jsx
render()
{
    return <div>
        <Switch>
            <Route exact path='/' component={Lander}/>
            <Route path='/vadatajs' component={Vadatajs}/>
        </Switch>
    </div>
}

https://jsfiddle.net/Martins_Abilevs/4jko7arp/11/

अप मैंने पाया कि आप अलग-अलग राउटर का उपयोग करते हैं..सोर्री तब शायद यह फील आपके लिए उपयोगी हो

https://fiddle.jshell.net/terda12/mana88Lm/

शायद समाधान की कुंजी मुख्य रेंडर फ़ंक्शन के लिए लाइन में hiden है ..

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

1

मुझे एक ही इश्यू मिलता है। मुझे नहीं लगता कि इस मामले में उन्हें प्रो राउटर को जोड़ने की आवश्यकता है, बस अपने नवलिंक में जांचें कि आप विवरण के रूप में अच्छा पथ नाम लिखते हैं। मार्ग के लिए विशिष्ट मार्ग से सामान्य की तरह शुरू करने का प्रयास करें

<Route path="/details" component={Details} />
<Route path="/" component={Users} />

अपने NavLink में यह कुछ इस तरह होना चाहिए

 <NavLink className="nav-link" to="/details">
   details<span className="sr-only">(current)</span>
 </NavLink>

इसके बाद रीटैक्ट से संबंधित सभी सामानों को आयात करने के लिए इसके बेहतर आयात के लिए एक पुनर्खरीद इसके बाद दूसरे मॉड्यूल को इस तरह से आयात करें:

import React from "react";
import ReactDOM from "react-dom";
import { BrowserRouter } from 'react-router-dom';
import Users from "./components/Users";
import { Router, Route } from "react-router";
import Details from "./components/Details";

इस तरह आओ:

import React from "react";
import ReactDOM from "react-dom";
import { BrowserRouter } from 'react-router-dom';
import { Router, Route } from "react-router";

import Users from "./components/Users";    
import Details from "./components/Details";

1

मेरे लिए, मेरे पास था:

export MyClass extends React.Component

साथ में:

export default withRouter(MyClass)

इस बीच, मेरे App.js में, मेरे पास था:

import { MyClass } from './MyClass'

घर का खेल खेलने वाले मेरी समस्या देख सकते हैं। मैं राउटर के साथ आयात नहीं कर रहा था बच्चे कक्षाओं में पारित कर दिया। इसे साफ करने के लिए, मैंने रूट कंपोनेंट घोषणापत्र में withRouter कॉल को स्थानांतरित किया :

<Router exact path={'/myclass'} component={withRouter(MyClass)} />

MyClass में वापस, मैंने इसे डिफ़ॉल्ट निर्यात में बदल दिया:

export default MyClass extends React.Component

और फिर अंत में, App.js में, मैंने अपना आयात निम्न में बदल दिया:

import MyClass from './MyClass'

उम्मीद है कि यह किसी की मदद करता है। यह सुनिश्चित करता है कि एक ही वर्ग को निर्यात करने के लिए मेरे पास दो तरीके नहीं हैं, इस प्रकार राउटर प्रीपेंड को दरकिनार कर दें


0

इसे इस्तेमाल करे,

import React from "react";

import ReactDOM from "react-dom";
import Users from "./components/Users";
import { Router, Route } from "react-router";


import Details from "./components/Details";

ReactDOM.render((
  <Router>
        <Route path="/" component={Wrapper} >
            <IndexRoute component={Users} />
            <Route path="/details" component={Details} />
        </Route>
  </Router>
), document.getElementById('app'))

एक आवरण घटक को परिभाषित करें जो इस प्रस्तुत करेगा। क्रॉपस्पेस। यह ठीक से मार्ग करेगा।
वैभव सिंह

0

आपको इसकी जांच करनी चाहिए: https://github.com/ReactTraining/react-router/blob/master/packages/react-router/docs/guides/blocked-updates.md

इसलिए यह निश्चित रूप से नहीं है Usersया नहीं Details, क्योंकि वे सीधे द्वारा प्रदान किए जाते हैं <Route>, और locationवसीयत पास हो जाएगी props

मैं सोच रहा हूं, आपको और के <div>बीच की आवश्यकता क्यों है ? इसे निकालें और मुझे बताएं कि क्या यह काम करता है।<BrowserRouter><Route>


0

मैं एक सशर्त लेआउट के साथ एक समान मुद्दा था:

class LayoutSwitcher extends Component {
  render () {
    const isLoggedIn = this.props.isLoggedIn
    return (
      <React.Fragment>
        { isLoggedIn
          ? <MainLayout {...this.props} />
          : <Login />
        }
      </React.Fragment>
    )
  }
}

और शर्तों को फिर से लिखना जैसे:

  render () {
    const isLoggedIn = this.props.isLoggedIn
    if (isLoggedIn) {
      return <MainLayout {...this.props} />
    }
    return <Login />
  }

इससे यह हल हो गया। मेरे मामले में, ऐसा लगता है कि संदर्भ खो गया था।


0

मेरे मामले में, BrowserRouter के बजाय HashRouter पर स्विच करने से मेरी समस्या हल हो गई


0

मेरे पास एक ही मुद्दा था और मैंने इसे nt_modules में @types फ़ोल्डर से इतिहास को आयात करने के लिए निर्धारित किया था। मैंने इसे npm से आयात किया (npm i @history)


0

मेरी भी यही समस्या थी। यद्यपि यह बहुत प्रभावी समाधान नहीं है, लेकिन मैंने इसे एक चालाक विधि से हल किया। कॉम्पोनेंटडीडमाउंट विधि हर बार हमारे url में परिवर्तन के लिए काम करती है। विधि के भीतर हम वर्तमान यूआरएल के साथ पिछले यूआरएल की तुलना कर सकते हैं और हम राज्य को बदल सकते हैं या पृष्ठ ताज़ा कर सकते हैं।

componentDidUpdate(prevProps) {
    if (this.props.match.url !== prevProps.match.url) {
        //this.props.history.go(0) refresh Page
        //this.setState(...) or change state
    }
}

-1

मैं मुसीबत से भी मिला।

https://github.com/chengjianhua/templated-operating-system

और मैंने शुभम खत्री द्वारा प्रस्तुत समाधान की कोशिश की है, लेकिन यह काम नहीं करता है।


मैंने इस समस्या को हल कर दिया है, शायद आपकी मदद कर सकता है।

https://github.com/ReactTraining/react-router/blob/master/packages/react-router/docs/guides/blocked-updates.md

उपरोक्त गाइड दस्तावेज़ के अनुसार, जब आप PureComponentराज्य प्रबंधन उपकरणों के साथ उपयोग या उपयोग करते हैं redux, जैसे mobx... यह आपके मार्ग के अद्यतन को अवरुद्ध कर सकता है। अपने मार्ग घटक की जाँच करें, सुनिश्चित करें कि आपने अपने घटक को रेंडरर ब्लॉक नहीं किया है।


-2

BrowserRouter (राउटर) में प्रोप फोर्स रीफ्रेश = {true} जोड़ने की कोशिश करें

import {BrowserRouter as Router} from "react-router-dom";

<Router forceRefresh={true}>
/// your <switch> and <route>
</Router>

इससे मेरा काम बनता है।

btw नहीं एक असली समाधान: डी

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.