लिंक प्रतिक्रिया-राउटर में पास प्रॉप्स


137

मैं प्रतिक्रिया-राउटर के साथ प्रतिक्रिया का उपयोग कर रहा हूं। मैं प्रतिक्रिया-राउटर के एक "लिंक" में संपत्ति को पास करने की कोशिश कर रहा हूं

var React  = require('react');
var Router = require('react-router');
var CreateIdeaView = require('./components/createIdeaView.jsx');

var Link = Router.Link;
var Route = Router.Route;
var DefaultRoute = Router.DefaultRoute;
var RouteHandler = Router.RouteHandler;
var App = React.createClass({
  render : function(){
    return(
      <div>
        <Link to="ideas" params={{ testvalue: "hello" }}>Create Idea</Link>
        <RouteHandler/>
      </div>
    );
  }
});

var routes = (
  <Route name="app" path="/" handler={App}>
    <Route name="ideas" handler={CreateIdeaView} />
    <DefaultRoute handler={Home} />
  </Route>
);

Router.run(routes, function(Handler) {

  React.render(<Handler />, document.getElementById('main'))
});

"लिंक" पेज को प्रस्तुत करता है लेकिन संपत्ति को नए दृश्य में पास नहीं करता है। नीचे व्यू कोड है

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

var CreateIdeaView = React.createClass({
  render : function(){
    console.log('props form link',this.props,this)//props not recived
  return(
      <div>
        <h1>Create Post: </h1>
        <input type='text' ref='newIdeaTitle' placeholder='title'></input>
        <input type='text' ref='newIdeaBody' placeholder='body'></input>
      </div>
    );
  }
});

module.exports = CreateIdeaView;

मैं "लिंक" का उपयोग करके डेटा कैसे पास कर सकता हूं?

जवाबों:


123

यह रेखा गायब है path:

<Route name="ideas" handler={CreateIdeaView} />

होना चाहिए:

<Route name="ideas" path="/:testvalue" handler={CreateIdeaView} />

निम्नलिखित को देखते हुए Link (पुरानी v1) :

<Link to="ideas" params={{ testvalue: "hello" }}>Create Idea</Link>

V4 तक की तारीख तक :

const backUrl = '/some/other/value'
// this.props.testvalue === "hello"
<Link to={{pathname: `/${this.props.testvalue}`, query: {backUrl}}} />

और withRouter(CreateIdeaView)घटकों में render():

console.log(this.props.match.params.testvalue, this.props.location.query.backurl)
// output
hello /some/other/value

डॉक्स पर पोस्ट किए गए लिंक से, पृष्ठ के नीचे की ओर:

जैसे मार्ग दिया <Route name="user" path="/users/:userId"/>



कुछ स्टब किए गए क्वेरी उदाहरणों के साथ अद्यतित कोड उदाहरण:

// import React, {Component, Props, ReactDOM} from 'react';
// import {Route, Switch} from 'react-router'; etc etc
// this snippet has it all attached to window since its in browser
const {
  BrowserRouter,
  Switch,
  Route,
  Link,
  NavLink
} = ReactRouterDOM;

class World extends React.Component {
  constructor(props) {
    super(props);
    console.dir(props);      
    this.state = {
      fromIdeas: props.match.params.WORLD || 'unknown'
    }
  }
  render() {
    const { match, location} = this.props;
    return (
      <React.Fragment>
        <h2>{this.state.fromIdeas}</h2>
        <span>thing: 
          {location.query 
            && location.query.thing}
        </span><br/>
        <span>another1: 
        {location.query 
          && location.query.another1 
          || 'none for 2 or 3'}
        </span>
      </React.Fragment>
    );
  }
}

class Ideas extends React.Component {
  constructor(props) {
    super(props);
    console.dir(props);
    this.state = {
      fromAppItem: props.location.item,
      fromAppId: props.location.id,
      nextPage: 'world1',
      showWorld2: false
    }
  }
  render() {
    return (
      <React.Fragment>
          <li>item: {this.state.fromAppItem.okay}</li>
          <li>id: {this.state.fromAppId}</li>
          <li>
            <Link 
              to={{
                pathname: `/hello/${this.state.nextPage}`, 
                query:{thing: 'asdf', another1: 'stuff'}
              }}>
              Home 1
            </Link>
          </li>
          <li>
            <button 
              onClick={() => this.setState({
              nextPage: 'world2',
              showWorld2: true})}>
              switch  2
            </button>
          </li>
          {this.state.showWorld2 
           && 
           <li>
              <Link 
                to={{
                  pathname: `/hello/${this.state.nextPage}`, 
                  query:{thing: 'fdsa'}}} >
                Home 2
              </Link>
            </li> 
          }
        <NavLink to="/hello">Home 3</NavLink>
      </React.Fragment>
    );
  }
}


class App extends React.Component {
  render() {
    return (
      <React.Fragment>
        <Link to={{
          pathname:'/ideas/:id', 
          id: 222, 
          item: {
              okay: 123
          }}}>Ideas</Link>
        <Switch>
          <Route exact path='/ideas/:id/' component={Ideas}/>
          <Route path='/hello/:WORLD?/:thing?' component={World}/>
        </Switch>
      </React.Fragment>
    );
  }
}

ReactDOM.render((
  <BrowserRouter>
    <App />
  </BrowserRouter>
), document.getElementById('ideas'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-router-dom/4.3.1/react-router-dom.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-router/4.3.1/react-router.min.js"></script>

<div id="ideas"></div>

अपडेट:

देखें: https://github.com/ReactTraining/react-router/blob/0c6d51cd6639aff8a84b11d89e27887b3558ed8a/upgrad-guides//2.0.0.md#link-to-onenter-and-isactive-use-descript-descriptors

1.x से 2.x के उन्नयन गाइड से:

<Link to>, ऑनएंटर, और आइसेटिव लोकेशन डिस्क्रिप्टर का उपयोग करें

<Link to>अब तार के अलावा एक स्थान विवरणक ले सकता है। क्वेरी और स्टेट प्रॉप्स को हटा दिया जाता है।

// v1.0.x

<Link to="/foo" query={{ the: 'query' }}/>

// v2.0.0

<Link to={{ pathname: '/foo', query: { the: 'query' } }}/>

// अभी भी 2.x में मान्य है

<Link to="/foo"/>

इसी तरह, ऑनटर हुक से रीडायरेक्ट करने पर अब लोकेशन डिस्क्रिप्टर का भी उपयोग किया जाता है।

// v1.0.x

(nextState, replaceState) => replaceState(null, '/foo')
(nextState, replaceState) => replaceState(null, '/foo', { the: 'query' })

// v2.0.0

(nextState, replace) => replace('/foo')
(nextState, replace) => replace({ pathname: '/foo', query: { the: 'query' } })

कस्टम लिंक जैसे घटकों के लिए, वही रूटर के लिए लागू होता है। सक्रिय, पहले का इतिहास। सक्रिय।

// v1.0.x

history.isActive(pathname, query, indexOnly)

// v2.0.0

router.isActive({ pathname, query }, indexOnly)

v3 से v4 के लिए अपडेट:

"विरासत प्रवासन प्रलेखन" पश्चात के लिए


3
ऐसा लगता है कि संस्करण 2.0 में परमेस का समर्थन नहीं किया गया है, परीक्षण मानों को प्रॉम्प्स में संग्रहीत किया गया है, यह कुछ इस तरह होगा <Link to = { /ideas/${this.props.testvalue}}> {this.props.testvalue} </ Link>
Braulio

1
@ ब्रैलियो धन्यवाद। मैंने अपने उत्तर को अद्यतन किया और v1 और v2 के बीच अंतर के लिए डॉक्स के कुछ और शामिल किए
15

4
@ ब्रैलियो: सही तरीका है <Link to={`/ideas/${this.props.testvalue}`}>{this.props.testvalue}</Link>
:, बैकटिक्स के

1
हां, क्षमा करें, जब मैं इसे ठीक करने जा रहा कोड चिपकाता हूं तो बैकटिक्स खो गया।
ब्रालियो

2
यह मेरे लिए बिना backticks का उपयोग किए काम करता है<Link to={'/ideas/'+this.props.testvalue }>{this.props.testvalue}</Link>
svassr

91

एक तरीका है जिससे आप एक से अधिक पैरामीटर पास कर सकते हैं। आप स्ट्रिंग के बजाय ऑब्जेक्ट के रूप में "से" पास कर सकते हैं।

// your route setup
<Route path="/category/:catId" component={Category} / >

// your link creation
const newTo = { 
  pathname: "/category/595212758daa6810cbba4104", 
  param1: "Par1" 
};
// link to the "location"
// see (https://reacttraining.com/react-router/web/api/location)
<Link to={newTo}> </Link>

// In your Category Component, you can access the data like this
this.props.match.params.catId // this is 595212758daa6810cbba4104 
this.props.location.param1 // this is Par1

2
वास्तव में मुझे क्या चाहिए।
ग्राम्चा

8
यह उत्तर बहुत कम आंका गया है। यह स्पष्ट नहीं है लेकिन दस्तावेज़ीकरण में इस reacttraining.com/react-router/web/api/Link/to-object का उल्लेख है । यह एक एकल वस्तु के रूप में डेटा को 'राज्य' के रूप में पारित करने की सलाह देता है
sErVerdevIL

13
यह इस सवाल का सबसे अच्छा जवाब है।
जुआन रिकार्डो

बहुत लंबे समय के लिए नाटक के साथ काम किया और यह पूरी तरह से काम किया! V4
माइक

1
पथ विशेषता में लेख को मैप करने के बजाय "/ श्रेणी / 595212758daa6810cbba4104" होना चाहिए ???
कैमिलो

38

मुझे अपने आवेदन से उपयोगकर्ता विवरण दिखाने के लिए समान समस्या थी।

तुम यह केर सकते हो:

<Link to={'/ideas/'+this.props.testvalue }>Create Idea</Link>

या

<Link to="ideas/hello">Create Idea</Link>

तथा

<Route name="ideas/:value" handler={CreateIdeaView} />

इसके माध्यम से प्राप्त करने के लिए this.props.match.params.valueअपने CreateIdeaView वर्ग के से ।

आप इस वीडियो को देख सकते हैं जिससे मुझे बहुत मदद मिली: https://www.youtube.com/watch?v=ZBxMljq9GSE


3
वास्तव में प्रलेखन क्या कहता है। हालाँकि, मेरे पास एक ऐसा मामला है जहां DESPITE ऊपर दिए गए रूट को परिभाषित कर रहा है, और पैरामीटर मान को पारित करने के लिए लिंक को कॉन्फ़िगर कर रहा है, प्रतिक्रिया घटक वर्ग में ऐसा कोई भी नहीं है। URL से उठाया गया .props.params मान है। किसी भी विचार क्यों ऐसा हो सकता है? यह ऐसा है जैसे रूट बाइंडिंग बस गायब है। घटक वर्ग में रेंडर () संलग्न होता है, लेकिन घटक में कोई डेटा पारित नहीं होता है।
पीटर

लेकिन फिर अपने अंतिम उदाहरण में, आप CreateIdeaView घटक में 'मान' चर को कैसे खींचेंगे?
एस्पेन

20

प्रतिक्रिया-राउटर-डोम 4.xx के लिए के रूप में ( https://www.npmjs.com/package/react-router-dom ) आप घटकों को मार्ग के माध्यम से पास कर सकते हैं:

<Route path="/ideas/:value" component ={CreateIdeaView} />

लिंकिंग के माध्यम से (टेस्टव्यू प्रॉप पर विचार करके संबंधित कंपोनेंट को पास किया जाता है (जैसे उपरोक्त ऐप कंपोनेंट) लिंक को रेंडर करना)

<Link to={`/ideas/${ this.props.testValue }`}>Create Idea</Link>

अपने घटक कंस्ट्रक्टर के लिए प्रॉपर पासिंग वैल्यू परम के माध्यम से उपलब्ध होगा

props.match.params.value


7

इंस्टॉल करने के बाद react-router-dom

<Link
    to={{
      pathname: "/product-detail",
      productdetailProps: {
       productdetail: "I M passed From Props"
      }
   }}>
    Click To Pass Props
</Link>

और दूसरा छोर जहां मार्ग को पुनर्निर्देशित किया गया है, ऐसा करें

componentDidMount() {
            console.log("product props is", this.props.location.productdetailProps);
          }

4

उपरोक्त उत्तर ( https://stackoverflow.com/a/44860918/2011818 ) पर काम करने के लिए , आप ऑब्जेक्ट को लिंक ऑब्जेक्ट के अंदर "टू" इनलाइन भी भेज सकते हैं।

<Route path="/foo/:fooId" component={foo} / >

<Link to={{pathname:/foo/newb, sampleParam: "Hello", sampleParam2: "World!" }}> CLICK HERE </Link>

this.props.match.params.fooId //newb
this.props.location.sampleParam //"Hello"
this.props.location.sampleParam2 //"World!"

3

टाइपप्रति

कई उत्तरों में इस तरह वर्णित दृष्टिकोण के लिए,

<Link
    to={{
        pathname: "/my-path",
        myProps: {
            hello: "Hello World"
        }
    }}>
    Press Me
</Link>

मुझे त्रुटि हो रही थी,

ऑब्जेक्ट शाब्दिक केवल ज्ञात गुणों को निर्दिष्ट कर सकता है, और 'myProps' में मौजूद नहीं है 'LocationDescriptorObject | ((स्थान: स्थान) => स्थानकलेखक) '

फिर मैंने आधिकारिक दस्तावेज में जाँच की कि वे stateइसी उद्देश्य के लिए प्रदान किए गए हैं ।

तो यह इस तरह काम किया,

<Link
    to={{
        pathname: "/my-path",
        state: {
            hello: "Hello World"
        }
    }}>
    Press Me
</Link>

और अपने अगले घटक में आप निम्न मान प्राप्त कर सकते हैं,

componentDidMount() {
    console.log("received "+this.props.location.state.hello);
}

साभार @gprathour
अक्षय विजय जैन

0

रूट:

<Route state={this.state} exact path="/customers/:id" render={(props) => <PageCustomer {...props} state={this.state} />} />

और फिर इस तरह अपने PageCustomer घटक में params का उपयोग कर सकते हैं this.props.match.params.id:।

उदाहरण के लिए PageCustomer घटक में एक एपीआई कॉल:

axios({
   method: 'get',
   url: '/api/customers/' + this.props.match.params.id,
   data: {},
   headers: {'X-Requested-With': 'XMLHttpRequest'}
 })
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.