Bağlantı tepki yönlendiricisinde destek donanımı


137

Tepki yönlendirici ile tepki kullanıyorum. Reat-router bir "Link" özelliği geçmeye çalışıyorum

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'))
});

"Bağlantı" sayfayı oluşturur, ancak özelliği yeni görünüme geçirmez. Aşağıda görünüm kodu

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;

"Bağlantı" kullanarak verileri nasıl iletebilirim?

Yanıtlar:


123

Bu satır eksik path:

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

Olmalı:

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

Aşağıdaki Link (eski v1) göz önüne alındığında :

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

V4 itibariyle güncel :

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

ve withRouter(CreateIdeaView)bileşenlerde render():

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

Dokümanlara gönderdiğiniz bağlantıdan sayfanın altına doğru:

Gibi bir rota verildi <Route name="user" path="/users/:userId"/>



Bazı stubbed sorgu örnekleriyle güncellenmiş kod örneği:

// 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>

güncellemeleri:

Bkz. Https://github.com/ReactTraining/react-router/blob/0c6d51cd6639aff8a84b11d89e27887b3558ed8a/upgrade-guides/v2.0.0.md#link-to-onenter-and-isactive-use-location-descriptors

1.x'ten 2.x'e yükseltme kılavuzundan:

<Link to>, onEnter ve isActive konum tanımlayıcıları kullan

<Link to>artık dizelere ek olarak konum tanımlayıcı alabilir. Sorgu ve durum desteği kullanımdan kaldırıldı.

// v1.0.x

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

// v2.0.0

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

// 2.x'te hala geçerli

<Link to="/foo"/>

Benzer şekilde, bir onEnter kancasından yeniden yönlendirme artık bir konum tanımlayıcı da kullanıyor.

// 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' } })

Özel bağlantı benzeri bileşenler için aynı şey yönlendirici.isActive, daha önce geçmiş.isActive için de geçerlidir.

// v1.0.x

history.isActive(pathname, query, indexOnly)

// v2.0.0

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

v3'ten v4'e güncellemeler:

gelecek nesiller için "eski göç belgeleri"


3
Test değerlerinin desteklerde saklandığı varsayıldığında, sürüm 2.0'da parametreler desteklenmiyor gibi görünüyor, <Link to = { /ideas/${this.props.testvalue}}> {this.props.testvalue} </Link>
Braulio

1
@ Hidrolik teşekkürler. Cevabımı güncelledim ve v1 ve v2 arasındaki <Link> farkları için dokümanlardan bazılarını dahil ettim
jmunsch

4
@Braulio: Doğru yoludur: <Link to={`/ideas/${this.props.testvalue}`}>{this.props.testvalue}</Link>, ters tırnakların ile
Enoah Netzah

1
Evet, üzgünüm, düzeltecek kodu yapıştırdığımda backticks kayboldu.
Braulio

2
Bu backticks kullanmadan benim için çalışıyor<Link to={'/ideas/'+this.props.testvalue }>{this.props.testvalue}</Link>
svassr

93

birden fazla parametre iletmenin bir yolu vardır. Dize yerine nesne olarak "ila" iletebilirsiniz.

// 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
tam olarak ne istediğimi.
gramcha

9
Bu cevap çok önemsizdir. Belli değil ama belgeler bu reakttraining.com/react-router/web/api/Link/to-object'ten bahsediyor . Verilerin "durum" olarak işaretlenmiş tek bir nesne olarak
iletilmesini önerir

14
Bu sorunun en iyi cevabı bu.
Juan Ricardo

Drama ile çok uzun zamandır uğraşıyorum ve bu tamamen çalıştı! V4
Mike

1
Yol özelliğinde makaleye eşleme yerine "/ category / 595212758daa6810cbba4104" olmamalıdır ???
Camilo

38

Uygulamamdan bir kullanıcı ayrıntısını göstermek için de aynı sorunu yaşadım.

Bunu yapabilirsiniz:

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

veya

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

ve

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

Bunu this.props.match.params.valueCreateIdeaView sınıfınızda almak için.

Bana çok yardımcı olan bu videoyu görebilirsiniz: https://www.youtube.com/watch?v=ZBxMljq9GSE


3
Belgelerin tam olarak söyledikleri. Ancak, DESPITE Güzergahı yukarıdaki gibi tanımlayan ve LINK'i parametre değerini geçecek şekilde yapılandıran bir durumum var, React bileşen sınıfı, URL'den alınan HERHANGİ this.props.params değerlerine sahip değil. Bunun neden olabileceği hakkında bir fikrin var mı? Güzergah bağlaması eksik. Bileşen sınıfındaki render () devreye girer, ancak bileşene veri aktarılmaz.
Peter

Ancak son örneğinizde, CreateIdeaView bileşenindeki 'value' değişkenini nasıl çekersiniz?
Aspen

20

tepki-yönlendirici-dom 4.xx ( https://www.npmjs.com/package/react-router-dom ) gelince yönlendirilecek bileşene param geçirebilirsiniz:

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

üzerinden bağlantı (testValue pervane bağlantıyı oluşturan ilgili bileşene (örn. yukarıdaki Uygulama bileşeni) iletilir)

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

bileşenleri bileşen kurucunuza ileterek değer parametresi

props.match.params.value


7

Kurulumdan sonra react-router-dom

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

ve rotanın yönlendirildiği diğer uç bunu yapın

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

4

Yukarıdaki cevabı çözmek için ( https://stackoverflow.com/a/44860918/2011818 ), nesneleri Nesne içinde, Link nesnesinin içindeki "Alıcı" satırına da gönderebilirsiniz.

<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

daktilo ile yazılmış yazı

Birçok cevapta bu şekilde belirtilen yaklaşım için,

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

Hata alıyordum,

Nesne değişmezi yalnızca bilinen özellikleri belirtebilir ve 'LocationDescriptorObject | türünde' myProps 'yoktur. ((konum: Konum) => LocationDescriptor) '

Sonra aynı amaçla verdikleri resmi belgeleri kontrol ettim state.

Bu yüzden böyle çalıştı,

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

Ve bir sonraki bileşeninizde bu değeri aşağıdaki gibi alabilirsiniz,

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

Teşekkürler @gprathour
Akshay Vijay Jain

0

Rota:

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

Ve sonra bu gibi PageCustomer bileşeninde params erişebilir: this.props.match.params.id.

Örneğin, PageCustomer bileşenindeki bir api çağrısı:

axios({
   method: 'get',
   url: '/api/customers/' + this.props.match.params.id,
   data: {},
   headers: {'X-Requested-With': 'XMLHttpRequest'}
 })
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.