प्रतिक्रिया-राउटर 2.0.0-आरसी 5 में वर्तमान मार्ग कैसे प्राप्त करें


83

मेरे पास नीचे की तरह एक राउटर है:

<Router history={hashHistory}>
    <Route path="/" component={App}>
        <IndexRoute component={Index}/>
        <Route path="login" component={Login}/>
    </Route>
</Router>

यहाँ मैं क्या हासिल करना चाहता हूँ:

  1. /loginयदि लॉग इन न हो तो उपयोगकर्ता को पुनर्निर्देशित करें
  2. यदि उपयोगकर्ता प्रवेश करने का प्रयास /loginकरते हैं, तो वे पहले से लॉग इन हैं, उन्हें रूट करने के लिए पुनर्निर्देशित करें/

तो अब मैं में उपयोगकर्ता की स्थिति जांचने के लिए कोशिश कर रहा हूँ Appकी componentDidMount, तो कुछ ऐसे कार्य करें:

if (!user.isLoggedIn) {
    this.context.router.push('login')
} else if(currentRoute == 'login') {
    this.context.router.push('/')
}

यहाँ समस्या यह है कि मुझे वर्तमान मार्ग प्राप्त करने के लिए एपीआई नहीं मिल रहा है।

मैंने पाया कि यह बंद मुद्दा Router.ActiveState मिक्सिन और रूट हैंडलर्स का उपयोग करके सुझाया गया है, लेकिन ऐसा लगता है कि ये दो समाधान अब अपदस्थ हैं।

जवाबों:


112

कुछ और दस्तावेज़ पढ़ने के बाद, मुझे इसका हल मिला:

https://github.com/ReactTraining/react-router/blob/master/packages/react-router/docs/api/location.md

मुझे बस locationघटक के उदाहरण की इंजेक्टेड संपत्ति तक पहुँचने की आवश्यकता है जैसे:

var currentLocation = this.props.location.pathname

5
यह कुछ बाल घटकों में उपलब्ध नहीं है, लेकिन मैं उन्हें प्रोप के माध्यम से पारित करने में कामयाब रहा।
दमजन पाव्लिका

1
मेरे लिए (v2.8.1), यह this.state.location.pathname(प्रॉप्स के बजाय) के माध्यम से उपलब्ध था ।
इंटरनेट-निको

2
आपको इसे अपने घटक में जोड़ने की आवश्यकता है static contextTypes = { router: React.PropTypes.object }
एलेक्स कॉरी

1
यदि यह आपके बच्चे के घटकों में अनुपलब्ध है, तो आपको बस राउटर () का उपयोग करके लपेटने की आवश्यकता है
माइकल ब्राउन

धन्यवाद, लिंक मददगार है!
एलेक्स युरशा

27

आप वर्तमान मार्ग का उपयोग कर प्राप्त कर सकते हैं

const currentRoute = this.props.routes[this.props.routes.length - 1];

... जो आपको सबसे निचले स्तर के सक्रिय <Route ...>घटक से प्रॉप्स तक पहुंच प्रदान करता है ।

दिया हुआ...

<Route path="childpath" component={ChildComponent} />

currentRoute.pathरिटर्न 'childpath'और currentRoute.componentरिटर्न function _class() { ... }


1
यह एक शानदार तरीका है, क्योंकि यह मार्ग पर परिभाषित किसी भी कस्टम गुण को बरकरार रखता है। this.props.locationइन कस्टम गुणों को खो देता है।
XtraSimplicity

और (एक वापस बटन लेबल के लिए यानी) पिछले मार्ग पाने के लिए आप उपयोग कर सकते हैंthis.props.routes.length - 2
devonj

10

यदि आप इतिहास का उपयोग करते हैं, तो राउटर ने इतिहास से हर चीज को लोकेशन में डाल दिया, जैसे:

this.props.location.pathname;
this.props.location.query;

उसे ले लो?


13
हो सकता है कि आप अधिक इनपुट और कुछ संदर्भों के लिए आपको उत्तर दे सकें? अभी यह बहुत सामान्य है
फ़ार्साइड

8

संस्करण 3.0.0 के अनुसार, आप कॉल करके वर्तमान मार्ग प्राप्त कर सकते हैं:

this.context.router.location.pathname

नमूना कोड नीचे है:

var NavLink = React.createClass({
    contextTypes: {
        router: React.PropTypes.object
    },

    render() {   
        return (
            <Link {...this.props}></Link>
        );
    }
});

7

2017 में समान समस्या वाले किसी भी उपयोगकर्ता के लिए, मैंने इसे निम्न तरीके से हल किया:

NavBar.contextTypes = {
    router: React.PropTypes.object,
    location: React.PropTypes.object
}

और इसे इस तरह उपयोग करें:

componentDidMount () {
    console.log(this.context.location.pathname);
}

1
जैसा PropTypesकि अब एक स्टैंडअलोन निर्भरता है, जोड़ने के लिए सोचा गया: import PropTypes from 'prop-types'; ... NavBar.contextTypes = { router: PropTypes.object, location: PropTypes.object };
तार्किक


2

आप 'इस प्रकार सक्रिय' प्रोप का उपयोग कर सकते हैं:

const { router } = this.context;
if (router.isActive('/login')) {
    router.push('/');
}

isActive एक सही या गलत लौटाएगा।

प्रतिक्रिया-राउटर 2.7 के साथ परीक्षण किया गया


0

मेरे लिए उसी तरह काम करता है:

...
<MyComponent {...this.props}>
  <Route path="path1" name="pname1" component="FirstPath">
  ...
</MyComponent>
...

और फिर, मैं MyComponent फ़ंक्शन में "this.props.location.pathname" तक पहुंच सकता हूं।

मैं भूल गया था कि मैं यह था ...))) निम्नलिखित लिंक नेविगेशन बार आदि के लिए और अधिक वर्णन करता है।: इस रूटर रूटर।


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