प्रतिक्रिया-राउटर को यह मिल रहा है। बाल घटकों में रिप्लेसेशन


85

मैं समझता हूँ के रूप में <Route path="/" component={App} />इच्छाशक्ति देता है Appकी तरह मार्ग से संबंधित रंगमंच की सामग्री locationऔर params। यदि मेरे Appघटक में कई नेस्टेड चाइल्ड घटक हैं, तो मुझे बिना इन प्रॉप्स के एक्सेस के लिए चाइल्ड कंपोनेंट कैसे मिलेगा:

  • अनुप्रयोग से गुजरता है
  • विंडो ऑब्जेक्ट का उपयोग करना
  • नेस्टेड बाल घटकों के लिए मार्ग बनाना

मैंने सोचा था this.context.routerकि मार्गों से संबंधित कुछ जानकारी होगी, लेकिन this.context.routerलगता है कि मार्गों में हेरफेर करने के लिए केवल कुछ कार्य हैं।


अनुप्रयोग घटक में, प्रत्यक्ष नेस्टेड बच्चे घटक this.props.children पर मिल जा सकती है
gu mingfeng

जवाबों:


143

(अपडेट) V5.1 और हुक (प्रतिक्रिया की आवश्यकता है = = 16.8)

आप उपयोग कर सकते हैं useHistory, useLocationऔर useRouteMatchअपने घटक में प्राप्त करने के लिए match, historyऔर location

const Child = () => {
  const location = useLocation();
  const history = useHistory();
  const match = useRouteMatch("write-the-url-you-want-to-match-here");

  return (
    <div>{location.pathname}</div>
  )
}

export default Child

(अपडेट) V4 & V5

आप withRouterइंजेक्षन करने के लिए match, historyऔर locationअपने घटक सहारा में HOC का उपयोग कर सकते हैं ।

class Child extends React.Component {
  static propTypes = {
    match: PropTypes.object.isRequired,
    location: PropTypes.object.isRequired,
    history: PropTypes.object.isRequired
  }

  render() {
    const { match, location, history } = this.props

    return (
      <div>{location.pathname}</div>
    )
  }
}

export default withRouter(Child)

(अपडेट) V3

आप उपयोग कर सकते हैं withRouterइंजेक्षन करने के लिए अस्थायी router, params, location, routesअपने घटक रंगमंच की सामग्री में।

class Child extends React.Component {

  render() {
    const { router, params, location, routes } = this.props

    return (
      <div>{location.pathname}</div>
    )
  }
}

export default withRouter(Child)

मूल उत्तर

यदि आप प्रॉपर का उपयोग नहीं करना चाहते हैं, तो आप संदर्भ का उपयोग कर सकते हैं जैसा कि रिएक्ट राउटर प्रलेखन में वर्णित है

सबसे पहले, आपको अपना childContextTypesऔर सेट करना होगाgetChildContext

class App extends React.Component{

  getChildContext() {
    return {
      location: this.props.location
    }
  }

  render() {
    return <Child/>;
  }
}

App.childContextTypes = {
    location: React.PropTypes.object
}

फिर, आप इस तरह के संदर्भ का उपयोग करके अपने बच्चे के घटकों में स्थान ऑब्जेक्ट तक पहुंच पाएंगे

class Child extends React.Component{

   render() {
     return (
       <div>{this.context.location.pathname}</div>
     )
   }

}

Child.contextTypes = {
    location: React.PropTypes.object
 }

सूचक के लिए धन्यवाद। मैंने प्रलेखन के उस हिस्से को नहीं पढ़ा। मैंने सोचा था कि केवलcontext.router
xiaofan2406


3
मैं रिएक्ट करने के लिए नया हूं। इस प्रकार, मुझे माफ कर दो अगर मैं गलत हूं, लेकिन उपयोग करने में क्या गलत है window.location.pathname?
आर्टुर बरसेघन

1
window.location म्यूट है इसलिए इसे अपरिवर्तनीय संस्करण का उपयोग करना पसंद करते हुए इसे एक्सेस न करना सबसे अच्छा अभ्यास माना जाता है। इसके अलावा, मुझे लगता है कि यह उन तार्किक स्थानों का उपयोग करना संभव है जो विंडो से भिन्न होते हैं। कम से कम (अगली बार में यह सच है) इसलिए यह आपके विंडो से प्रत्यक्ष रूटर के इतिहास से अलग स्थान प्राप्त करना संभव है
चानोच

@ArturBarseghyan windowऑब्जेक्ट मौजूद नहीं है यदि रिएक्ट कोड सर्वर पर चलाया जाता है जैसे कि सर्वर-साइड रूटिंग को लागू करने के लिए।
क्रिस डब्ल्यूडब्ल्यू

5

यदि उपरोक्त समाधान आपके लिए काम नहीं करता है, तो आप उपयोग कर सकते हैं import { withRouter } from 'react-router-dom';


इसके उपयोग से आप अपने बच्चे को निम्न के रूप में निर्यात कर सकते हैं -

class MyApp extends Component{
    // your code
}

export default withRouter(MyApp);

और राउटर के साथ आपकी कक्षा -

// your code
<Router>
      ...
      <Route path="/myapp" component={MyApp} />
      // or if you are sending additional fields
      <Route path="/myapp" component={() =><MyApp process={...} />} />
<Router>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.