Truyền đạo cụ trong Link Reac-router


137

Tôi đang sử dụng phản ứng với bộ định tuyến phản ứng. Tôi đang cố gắng vượt qua tài sản trong một "Liên kết" của bộ định tuyến phản ứng

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

"Liên kết" hiển thị trang nhưng không chuyển thuộc tính sang chế độ xem mới. Dưới đây là mã xem

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;

Làm cách nào để truyền dữ liệu bằng "Liên kết"?

Câu trả lời:


123

Dòng này bị thiếu path:

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

Nên là:

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

Cho các mục sau Link (lỗi thời v1) :

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

Cập nhật kể từ v4 :

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

và trong các withRouter(CreateIdeaView)thành phần render():

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

Từ liên kết mà bạn đã đăng trên các tài liệu, về phía dưới cùng của trang:

Đưa ra một lộ trình như <Route name="user" path="/users/:userId"/>



Ví dụ mã được cập nhật với một số ví dụ truy vấn gốc:

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

cập nhật:

Xem: https://github.com/ReactTraining/react-router/blob/0c6d51cd6639aff8a84b11d89e27887b3558ed8a/upTHER-guides/v2.0.0.md#link-to-onenter-and-isactive-use-

Từ hướng dẫn nâng cấp từ 1.x lên 2.x:

<Link to>, on Entry và isActive sử dụng mô tả vị trí

<Link to>bây giờ có thể lấy một mô tả vị trí ngoài chuỗi. Các truy vấn và đạo cụ nhà nước không được chấp nhận.

// v1.0.x

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

// v2.0.0

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

// Vẫn hợp lệ trong 2.x

<Link to="/foo"/>

Tương tự, chuyển hướng từ hook on Entry bây giờ cũng sử dụng bộ mô tả vị trí.

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

Đối với các thành phần giống như liên kết tùy chỉnh, áp dụng tương tự cho bộ định tuyến.isActive, trước đó history.isActive.

// v1.0.x

history.isActive(pathname, query, indexOnly)

// v2.0.0

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

cập nhật cho v3 lên v4:

"tài liệu di sản kế thừa" cho hậu thế


3
Có vẻ như các thông số không được hỗ trợ trong phiên bản 2.0, các giá trị kiểm tra asumming được lưu trữ trong các đạo cụ, nó sẽ giống như <Link to = { /ideas/${this.props.testvalue}}> {this.props.testvalue} </ Link>
Braulio

1
@BAFio cảm ơn. Tôi đã cập nhật câu trả lời của mình và bao gồm thêm một số tài liệu về sự khác biệt cho <Link> giữa v1 và v2
jmunsch

4
@BAFio: cách chính xác là : <Link to={`/ideas/${this.props.testvalue}`}>{this.props.testvalue}</Link>, với backticks
Enoah Netzach

1
Vâng, xin lỗi, backticks bị mất khi tôi dán mã sẽ sửa nó.
Braulio

2
Điều này làm việc cho tôi mà không cần sử dụng backticks<Link to={'/ideas/'+this.props.testvalue }>{this.props.testvalue}</Link>
svassr

91

có một cách bạn có thể vượt qua nhiều hơn một tham số. Bạn có thể truyền "đến" dưới dạng đối tượng thay vì chuỗi.

// 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
chính xác những gì tôi muốn
gramcha

8
Câu trả lời này được đánh giá rất thấp. Điều đó không rõ ràng nhưng tài liệu đề cập đến phản ứng nàyttttining.com/react-router/web/api/Link/to-object . Nó khuyên nên truyền dữ liệu dưới dạng một đối tượng được đánh dấu 'trạng thái'
sErVerdevIL

13
Đây là câu trả lời tốt nhất cho câu hỏi này.
Juan Ricardo

Đã đối phó với kịch quá lâu và điều này hoàn toàn hiệu quả! V4
Mike

1
Trong thuộc tính đường dẫn không nên là "/ category / 595212758daa6810cbba4104" thay vì ánh xạ tới bài viết ???
Camilo

38

Tôi đã có cùng một vấn đề để hiển thị một chi tiết người dùng từ ứng dụng của tôi.

Bạn có thể làm được việc này:

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

hoặc là

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

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

để có được điều này thông qua this.props.match.params.valuelớp CreatIdeaView của bạn.

Bạn có thể xem video này đã giúp tôi rất nhiều: https://www.youtube.com/watch?v=ZBxMljq9GSE


3
Chính xác những gì tài liệu nói. Tuy nhiên, tôi có một trường hợp trong đó DESPITE xác định Tuyến đường như trên và định cấu hình LINK để truyền giá trị tham số, lớp thành phần React không có BẤT K this giá trị this.props.params nào được chọn từ URL. Bất cứ ý tưởng tại sao điều này có thể xảy ra? Nó giống như ràng buộc tuyến đường chỉ đơn giản là thiếu. Kết xuất () trong lớp thành phần DOES tham gia, nhưng không có dữ liệu nào được truyền vào thành phần.
Peter

Nhưng trong ví dụ cuối cùng của bạn, làm thế nào để bạn kéo biến 'value' trong thành phần CreateIdeaView?
Aspen

20

như đối với Reac-router-dom 4.xx ( https://www.npmjs.com/package/react-router-dom ), bạn có thể chuyển params đến thành phần để định tuyến qua:

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

liên kết thông qua (xem xét propValue prop được chuyển đến thành phần tương ứng (ví dụ: thành phần Ứng dụng ở trên) hiển thị liên kết)

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

chuyển các đạo cụ đến hàm tạo thành phần của bạn, giá trị param sẽ có sẵn thông qua

props.match.params.value


7

Sau khi cài đặt react-router-dom

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

và đầu kia nơi tuyến đường được chuyển hướng làm điều này

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

4

Để giải quyết câu trả lời ở trên ( https://stackoverflow.com/a/44860918/2011818 ), bạn cũng có thể gửi các đối tượng nội tuyến "Tới" bên trong đối tượng Liên kết.

<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

Bản đánh máy

Đối với cách tiếp cận được đề cập như thế này trong nhiều câu trả lời,

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

Tôi đã nhận được lỗi,

Đối tượng bằng chữ chỉ có thể chỉ định các thuộc tính đã biết và 'myProps' không tồn tại trong loại 'LocationDescriptorObject | ((vị trí: Vị trí) => LocationDescriptor) '

Sau đó tôi kiểm tra tài liệu chính thức họ đã cung cấpstate cho cùng một mục đích.

Vì vậy, nó hoạt động như thế này,

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

Và trong thành phần tiếp theo của bạn, bạn có thể nhận được giá trị này như sau,

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

Cảm ơn bạn @gprathour
Akshay Vijay Jain

0

Tuyến đường:

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

Và sau đó có thể truy cập các thông số trong thành phần PageCustomer của bạn như thế này: this.props.match.params.id .

Ví dụ: một cuộc gọi api trong thành phần PageCustomer:

axios({
   method: 'get',
   url: '/api/customers/' + this.props.match.params.id,
   data: {},
   headers: {'X-Requested-With': 'XMLHttpRequest'}
 })
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.