Skip to content

Commit 94509e7

Browse files
committed
[added] IndexLink
1 parent 304302b commit 94509e7

File tree

6 files changed

+81
-9
lines changed

6 files changed

+81
-9
lines changed

modules/IndexLink.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import React from 'react';
2+
import { component } from './PropTypes';
3+
import Link from './Link';
4+
5+
var IndexLink = React.createClass({
6+
7+
render() {
8+
return <Link {...this.props} onlyActiveOnIndex={true} />
9+
}
10+
11+
});
12+
13+
export default IndexLink;

modules/Link.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import React from 'react';
22
import warning from 'warning';
33

4-
var { object, string, func } = React.PropTypes;
4+
var { bool, object, string, func } = React.PropTypes;
55

66
function isLeftClickEvent(event) {
77
return event.button === 0;
@@ -38,6 +38,7 @@ var Link = React.createClass({
3838
propTypes: {
3939
activeStyle: object,
4040
activeClassName: string,
41+
onlyActiveOnIndex: bool.isRequired,
4142
to: string.isRequired,
4243
query: object,
4344
state: object,
@@ -48,6 +49,7 @@ var Link = React.createClass({
4849
return {
4950
className: '',
5051
activeClassName: 'active',
52+
onlyActiveOnIndex: false,
5153
style: {}
5254
};
5355
},
@@ -81,7 +83,7 @@ var Link = React.createClass({
8183
},
8284

8385
render() {
84-
var { to, query } = this.props;
86+
var { to, query, onlyActiveOnIndex } = this.props;
8587

8688
var props = {
8789
...this.props,
@@ -95,7 +97,7 @@ var Link = React.createClass({
9597
if (history) {
9698
props.href = history.createHref(to, query);
9799

98-
if (history.isActive(to, query)) {
100+
if (history.isActive(to, query, onlyActiveOnIndex)) {
99101
if (props.activeClassName)
100102
props.className += props.className !== '' ? ` ${props.activeClassName}` : props.activeClassName;
101103

modules/State.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ var State = {
2828
history: object.isRequired
2929
},
3030

31-
isActive(pathname, query) {
32-
return this.context.history.isActive(pathname, query);
31+
isActive(pathname, query, indexOnly) {
32+
return this.context.history.isActive(pathname, query, indexOnly);
3333
}
3434

3535
};

modules/__tests__/isActive-test.js

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import expect from 'expect';
22
import React from 'react';
33
import createHistory from 'history/lib/createMemoryHistory';
4+
import IndexRoute from '../IndexRoute';
45
import Router from '../Router';
56
import Route from '../Route';
67

@@ -67,6 +68,7 @@ describe('isActive', function () {
6768
</Router>
6869
), node, function () {
6970
expect(this.history.isActive('/home')).toBe(true);
71+
expect(this.history.isActive('/home', null, true)).toBe(false);
7072
done();
7173
});
7274
});
@@ -82,6 +84,7 @@ describe('isActive', function () {
8284
</Router>
8385
), node, function () {
8486
expect(this.history.isActive('/home', { the: 'query' })).toBe(true);
87+
expect(this.history.isActive('/home', { the: 'query' }, true)).toBe(false);
8588
done();
8689
});
8790
});
@@ -97,6 +100,57 @@ describe('isActive', function () {
97100
</Router>
98101
), node, function () {
99102
expect(this.history.isActive('/home', { something: 'else' })).toBe(false);
103+
expect(this.history.isActive('/home', { something: 'else' }, true)).toBe(false);
104+
done();
105+
});
106+
});
107+
});
108+
});
109+
110+
describe('a pathname that matches an index URL', function () {
111+
describe('with no query', function () {
112+
it('is active', function (done) {
113+
React.render((
114+
<Router history={createHistory('/home')}>
115+
<Route path="/home">
116+
<IndexRoute />
117+
</Route>
118+
</Router>
119+
), node, function () {
120+
expect(this.history.isActive('/home', null)).toBe(true);
121+
expect(this.history.isActive('/home', null, true)).toBe(true);
122+
done();
123+
});
124+
});
125+
});
126+
127+
describe('with a query that also matches', function () {
128+
it('is active', function (done) {
129+
React.render((
130+
<Router history={createHistory('/home?the=query')}>
131+
<Route path="/home">
132+
<IndexRoute />
133+
</Route>
134+
</Router>
135+
), node, function () {
136+
expect(this.history.isActive('/home', { the: 'query' })).toBe(true);
137+
expect(this.history.isActive('/home', { the: 'query' }, true)).toBe(true);
138+
done();
139+
});
140+
});
141+
});
142+
143+
describe('with a query that does not match', function () {
144+
it('is not active', function (done) {
145+
React.render((
146+
<Router history={createHistory('/home?the=query')}>
147+
<Route path="/home">
148+
<IndexRoute />
149+
</Route>
150+
</Router>
151+
), node, function () {
152+
expect(this.history.isActive('/home', { something: 'else' })).toBe(false);
153+
expect(this.history.isActive('/home', { something: 'else' }, true)).toBe(false);
100154
done();
101155
});
102156
});

modules/isActive.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,13 @@ function queryIsActive(query, activeQuery) {
5353
* Returns true if a <Link> to the given pathname/query combination is
5454
* currently active.
5555
*/
56-
function isActive(pathname, query, location, routes, params) {
56+
function isActive(pathname, query, indexOnly, location, routes, params) {
5757
if (location == null)
5858
return false;
5959

60+
if (indexOnly && (routes.length < 2 || routes[routes.length - 2].indexRoute !== routes[routes.length - 1]))
61+
return false;
62+
6063
return pathnameIsActive(pathname, location.pathname, routes, params) &&
6164
queryIsActive(query, location.query);
6265
}

modules/useRoutes.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@ function useRoutes(createHistory) {
1919
return function (options={}) {
2020
var { routes, ...historyOptions } = options;
2121
var history = useQueries(createHistory)(historyOptions);
22-
var state;
22+
var state = {};
2323

24-
function isActive(pathname, query) {
25-
return _isActive(pathname, query, state.location, state.routes, state.params);
24+
function isActive(pathname, query, indexOnly=false) {
25+
return _isActive(pathname, query, indexOnly, state.location, state.routes, state.params);
2626
}
2727

2828
function matchRoutesWithWarning(routes, location, callback) {

0 commit comments

Comments
 (0)