Skip to content

Commit 8d2f3ed

Browse files
committed
[changed] <Link/>s to take params property
- old behavior is maintained, but logs a deprecation warning - instead of passing in properties to fill in the dynamic segments, we just take it from the params object closes #217
1 parent 1fcf686 commit 8d2f3ed

File tree

8 files changed

+68
-32
lines changed

8 files changed

+68
-32
lines changed

UPGRADE_GUIDE.md

+16
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,22 @@ they refer to.
88
0.5.x -> 0.6.x
99
--------------
1010

11+
### Link params
12+
13+
Links should now pass their params in the `params` property, though the
14+
old behavior will still work, you should update your code soon because
15+
it will be removed by `v1.0`
16+
17+
```js
18+
// 0.5.x
19+
<Link to="user" userId="123"/>
20+
21+
// 0.6.x
22+
<Link to="user" params={{userId: "123"}}/>
23+
```
24+
25+
### Dynamic Segments, keys, and lifecycle methods
26+
1127
If you have dynamic segments and are depending on `getInitialState`,
1228
`componentWillMount`, or `componentDidMount` to fire between transitions
1329
to the same route--like `users/123` and `users/456`, then you have two

docs/api/components/Link.md

+19-7
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,28 @@ Props
1212

1313
The name of the route to link to, or a full URL.
1414

15+
### `params`
16+
17+
Object, the parameters to fill in the dynamic segments of your route.
18+
19+
#### Example
20+
21+
```js
22+
// given a route config like this
23+
<Route name="user" path="/user/:userId"/>
24+
25+
// create a link with this
26+
<Link to="user" params={{userId: "123"}}/>
27+
28+
// though, if your user properties match up to the dynamic segements:
29+
<Link to="user" params={user}/>
30+
```
31+
1532
### `query`
1633

1734
Object, Query parameters to add to the link. Access query parameters in
1835
your route handler with `this.props.query`.
1936

20-
### `[param]`
21-
22-
Any dynamic segments the route defines (like `:userId`) are passed by
23-
name through the link's properties to the resulting url.
24-
2537
### `activeClassName`
2638

2739
The className a `Link` receives when it's route is active. Defaults to
@@ -44,7 +56,7 @@ Example
4456
Given a route like `<Route name="user" path="/users/:userId"/>`:
4557

4658
```xml
47-
<Link to="user" userId={user.id} query={{foo: bar}}>{user.name}</Link>
59+
<Link to="user" params={{userId: user.id}} query={{foo: bar}}>{user.name}</Link>
4860
<!-- becomes one of these depending on your router and if the route is
4961
active -->
5062
<a href="/users/123?foo=bar" class="active">Michael</a>
@@ -54,6 +66,6 @@ active -->
5466
<Link to="/users/123?foo=bar">{user.name}</Link>
5567

5668
<!-- change the activeClassName -->
57-
<Link activeClassName="current" to="user" userId={user.id}>{user.name}</Link>
69+
<Link activeClassName="current" to="user" params={{userId: user.id}}>{user.name}</Link>
5870
```
5971

examples/animations/app.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ var App = React.createClass({
1111
return (
1212
<div>
1313
<ul>
14-
<li><Link to="image" service="kitten">Kitten</Link></li>
15-
<li><Link to="image" service="cage">Cage</Link></li>
14+
<li><Link to="image" params={{service: "kitten"}}>Kitten</Link></li>
15+
<li><Link to="image" params={{service: "cage"}}>Cage</Link></li>
1616
</ul>
1717
<Transition transitionName="example">
1818
{this.props.activeRouteHandler()}

examples/data-flow/app.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ var App = React.createClass({
3333

3434
render: function() {
3535
var links = this.state.tacos.map(function(taco) {
36-
return <li><Link to="taco" name={taco.name}>{taco.name}</Link></li>
36+
return <li><Link to="taco" params={taco}>{taco.name}</Link></li>
3737
});
3838
return (
3939
<div className="App">

examples/dynamic-segments/app.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ var App = React.createClass({
1111
return (
1212
<div>
1313
<ul>
14-
<li><Link to="user" userId="123">Bob</Link></li>
15-
<li><Link to="user" userId="abc">Sally</Link></li>
14+
<li><Link to="user" params={{userId: "123"}}>Bob</Link></li>
15+
<li><Link to="user" params={{userId: "abc"}}>Sally</Link></li>
1616
</ul>
1717
{this.props.activeRouteHandler()}
1818
</div>
@@ -26,8 +26,8 @@ var User = React.createClass({
2626
<div className="User">
2727
<h1>User id: {this.props.params.userId}</h1>
2828
<ul>
29-
<li><Link to="task" userId={this.props.params.userId} taskId="foo">foo task</Link></li>
30-
<li><Link to="task" userId={this.props.params.userId} taskId="bar">bar task</Link></li>
29+
<li><Link to="task" params={{userId: this.props.params.userId, taskId: "foo"}}>foo task</Link></li>
30+
<li><Link to="task" params={{userId: this.props.params.userId, taskId: "bar"}}>bar task</Link></li>
3131
</ul>
3232
{this.props.activeRouteHandler()}
3333
</div>

examples/master-detail/app.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ var App = React.createClass({
105105

106106
render: function() {
107107
var contacts = this.state.contacts.map(function(contact) {
108-
return <li key={contact.id}><Link to="contact" id={contact.id}>{contact.first}</Link></li>
108+
return <li key={contact.id}><Link to="contact" params={contact}>{contact.first}</Link></li>
109109
});
110110
return (
111111
<div className="App">

examples/query-params/app.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ var App = React.createClass({
1010
return (
1111
<div>
1212
<ul>
13-
<li><Link to="user" userId="123">Bob</Link></li>
14-
<li><Link to="user" userId="123" query={{showAge: true}}>Bob With Query Params</Link></li>
15-
<li><Link to="user" userId="abc">Sally</Link></li>
13+
<li><Link to="user" params={{userId: "123"}}>Bob</Link></li>
14+
<li><Link to="user" params={{userId: "123"}} query={{showAge: true}}>Bob With Query Params</Link></li>
15+
<li><Link to="user" params={{userId: "abc"}}>Sally</Link></li>
1616
</ul>
1717
{this.props.activeRouteHandler()}
1818
</div>

modules/components/Link.js

+22-14
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ var withoutProperties = require('../helpers/withoutProperties');
44
var transitionTo = require('../helpers/transitionTo');
55
var hasOwnProperty = require('../helpers/hasOwnProperty');
66
var makeHref = require('../helpers/makeHref');
7+
var warning = require('react/lib/warning');
78

89
function isLeftClickEvent(event) {
910
return event.button === 0;
@@ -14,7 +15,7 @@ function isModifiedEvent(event) {
1415
}
1516

1617
/**
17-
* A map of <Link> component props that are reserved for use by the
18+
* DEPRECATED: A map of <Link> component props that are reserved for use by the
1819
* router and/or React. All other props are used as params that are
1920
* interpolated into the link's path.
2021
*/
@@ -38,12 +39,12 @@ var RESERVED_PROPS = {
3839
*
3940
* You could use the following component to link to that route:
4041
*
41-
* <Link to="showPost" postId="123"/>
42+
* <Link to="showPost" params={{postId: "123"}} />
4243
*
4344
* In addition to params, links may pass along query string parameters
4445
* using the `query` prop.
4546
*
46-
* <Link to="showPost" postId="123" query={{show:true}}/>
47+
* <Link to="showPost" params={{postId: "123"}} query={{show:true}}/>
4748
*/
4849
var Link = React.createClass({
4950

@@ -53,15 +54,29 @@ var Link = React.createClass({
5354

5455
statics: {
5556

57+
// TODO: Deprecate passing props as params in v1.0
5658
getUnreservedProps: function (props) {
59+
warning(
60+
false,
61+
'Passing props for params on <Link>s is deprecated, '+
62+
'please use the `params` property.'
63+
);
5764
return withoutProperties(props, RESERVED_PROPS);
65+
},
66+
67+
/**
68+
* Returns a hash of URL parameters to use in this <Link>'s path.
69+
*/
70+
getParams: function (props) {
71+
return props.params || Link.getUnreservedProps(props);
5872
}
5973

6074
},
6175

6276
propTypes: {
6377
to: React.PropTypes.string.isRequired,
6478
activeClassName: React.PropTypes.string.isRequired,
79+
params: React.PropTypes.object,
6580
query: React.PropTypes.object,
6681
onClick: React.PropTypes.func
6782
},
@@ -78,18 +93,11 @@ var Link = React.createClass({
7893
};
7994
},
8095

81-
/**
82-
* Returns a hash of URL parameters to use in this <Link>'s path.
83-
*/
84-
getParams: function () {
85-
return Link.getUnreservedProps(this.props);
86-
},
87-
8896
/**
8997
* Returns the value of the "href" attribute to use on the DOM element.
9098
*/
9199
getHref: function () {
92-
return makeHref(this.props.to, this.getParams(), this.props.query);
100+
return makeHref(this.props.to, Link.getParams(this.props), this.props.query);
93101
},
94102

95103
/**
@@ -106,7 +114,7 @@ var Link = React.createClass({
106114
},
107115

108116
componentWillReceiveProps: function (nextProps) {
109-
var params = Link.getUnreservedProps(nextProps);
117+
var params = Link.getParams(nextProps);
110118

111119
this.setState({
112120
isActive: Link.isActive(nextProps.to, params, nextProps.query)
@@ -115,7 +123,7 @@ var Link = React.createClass({
115123

116124
updateActiveState: function () {
117125
this.setState({
118-
isActive: Link.isActive(this.props.to, this.getParams(), this.props.query)
126+
isActive: Link.isActive(this.props.to, Link.getParams(this.props), this.props.query)
119127
});
120128
},
121129

@@ -135,7 +143,7 @@ var Link = React.createClass({
135143
event.preventDefault();
136144

137145
if (allowTransition)
138-
transitionTo(this.props.to, this.getParams(), this.props.query);
146+
transitionTo(this.props.to, Link.getParams(this.props), this.props.query);
139147
},
140148

141149
render: function () {

0 commit comments

Comments
 (0)