লিঙ্ক প্রতিক্রিয়া-রাউটারে প্রপসগুলি পাস করুন


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 (পুরানো ভি 1) :

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

ভি 4 হিসাবে আপ টু ডেট :

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/upgrade-guides/v2.0.0.md#link-to-onenter-and-isactive-use-location-descripttors

1.x থেকে 2.x আপগ্রেড গাইড থেকে:

<Link to>, onEnter, এবং isactive ব্যবহারের অবস্থান বর্ণনাকারী

<Link to>স্ট্রিং ছাড়াও এখন কোনও অবস্থানের বিবরণী নিতে পারে। ক্যোয়ারী এবং রাষ্ট্রীয় প্রপসগুলি হ্রাস করা হয়েছে।

// ভি 1.0.x

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

// ভি 2.0.0

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

// এখনও বৈধ 2.x

<Link to="/foo"/>

একইভাবে, অন্টর হুক থেকে পুনঃনির্দেশ করা এখন একটি অবস্থান বর্ণনাকারী ব্যবহার করে।

// ভি 1.0.x

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

// ভি 2.0.0

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

কাস্টম লিঙ্ক-জাতীয় উপাদানগুলির জন্য, একইটি রাউটার.আইএসটিভ, পূর্ববর্তী ইতিহাস.আইস্যাকটিভের জন্য প্রযোজ্য।

// ভি 1.0.x

history.isActive(pathname, query, indexOnly)

// ভি 2.0.0

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

v3 থেকে v4 এর জন্য আপডেট:

উত্তরসূরির জন্য "লিগ্যাসি মাইগ্রেশন ডকুমেন্টেশন"


3
দেখে মনে হচ্ছে যে সংস্করণ ২.০ সংস্করণগুলিতে প্যারামগুলি সমর্থিত নয়, প্রচলিত পরীক্ষার মানগুলি প্রপগুলিতে সঞ্চিত রয়েছে, এটি <লিঙ্ক = = { /ideas/${this.props.testvalue}}>। This.prop.testvalue like </Link>
ব্র্যালিও

1
ব্রাওলিও ধন্যবাদ আমি আমার উত্তর আপডেট করেছি এবং <লিঙ্ক> ভি 1 এবং ভি
জুমুনস

4
@ ব্রাওলিও: সঠিক উপায়টি হ'ল: <Link to={`/ideas/${this.props.testvalue}`}>{this.props.testvalue}</Link>ব্যাকটিক্স সহ
এনোহ নেটজাচ

1
হ্যাঁ, দুঃখিত, আমি কোডটি সংশোধন করতে যাবার সময় পেস্টিকগুলি হারিয়ে গেছে।
ব্র্যালিও

2
ব্যাকটিক্স ব্যবহার না করে এটি আমার পক্ষে কাজ করে<Link to={'/ideas/'+this.props.testvalue }>{this.props.testvalue}</Link>
সুইসার

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
এই উত্তরটি খুব আন্ডাররেটেড। এটি সুস্পষ্ট নয় তবে ডকুমেন্টেশনগুলিতে এই রিঅ্যাক্ট্রাইনেডিং / রিঅ্যাক্ট্রাইনিং / ওয়েবে / এপি / লিঙ্ক / টো-অবজেক্টের উল্লেখ রয়েছে । এটি একক অবজেক্ট হিসাবে চিহ্নিত 'স্টেট' হিসাবে ডেটা পাস করার পরামর্শ দেয়
সেরভেদেবিল

13
এটি এই প্রশ্নের সেরা উত্তর।
জুয়ান রিকার্ডো

নাটকটির সাথে অনেক দীর্ঘ সময় ধরে কাজ করা হয়েছে এবং এটি সম্পূর্ণ কার্যকর! ভি 4
মাইক 15

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আপনার ক্রিয়েটিআইভিউ ক্লাসের মাধ্যমে এটি পেতে ।

আপনি এই ভিডিওটি দেখতে পেয়েছেন যা আমাকে অনেক সাহায্য করেছে: https://www.youtube.com/watch?v=ZBxMljq9GSE


3
ডকুমেন্টেশন ঠিক কী বলে। যাইহোক, আমার একটি মামলা রয়েছে যেখানে উপরের মতো রুটটি নির্ধারণ করা এবং প্যারামিটারের মানটি পাস করার জন্য লিঙ্কটি কনফিগার করা হয়েছে, প্রতিক্রিয়া উপাদান শ্রেণীর কোনও এটি নেই this কোন ধারণা কেন এমন হতে পারে? এটি যেমন রুট বাইন্ডিংটি কেবল অনুপস্থিত। কম্পোনেন্ট শ্রেণিতে রেন্ডার () দেয় তবে এটি উপাদানটিতে কোনও ডেটা পাস হয়নি।
পিটার

তবে তারপরে আপনার শেষ উদাহরণে আপনি কীভাবে তৈরি আইডিভিউ উপাদানটিতে 'মান' পরিবর্তনশীলটি টানবেন?
অ্যাস্পেন

20

রিঅ্যাক্ট-রাউটার-ডম ৪.০ xxx ( 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>

আমি ত্রুটি পাচ্ছিলাম,

অবজেক্ট আক্ষরিক কেবল পরিচিত বৈশিষ্ট্যগুলি নির্দিষ্ট করতে পারে এবং 'মাইপ্রোপস' টাইপটিতে উপস্থিত নেই 'অবস্থানের বিবরণীঅবজেক্ট | ((অবস্থান: অবস্থান) => অবস্থানের বিবরণী) '

তারপরে আমি একই উদ্দেশ্যে তারা যে অফিশিয়াল ডকুমেন্টেশন সরবরাহ করেছি তা পরীক্ষা করেছিলাম 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 উপাদানের প্যারাম অ্যাক্সেস করতে পারে: this.props.match.params.id

উদাহরণস্বরূপ পৃষ্ঠা কাস্টমারের উপাদানটিতে একটি এপিআই কল:

axios({
   method: 'get',
   url: '/api/customers/' + this.props.match.params.id,
   data: {},
   headers: {'X-Requested-With': 'XMLHttpRequest'}
 })
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.