diff --git a/packages/react-router/modules/Route.js b/packages/react-router/modules/Route.js index c6bad0485f..f35d31bf93 100644 --- a/packages/react-router/modules/Route.js +++ b/packages/react-router/modules/Route.js @@ -1,5 +1,6 @@ import React from "react"; import PropTypes from "prop-types"; +import PropTypesElementType from "prop-types-elementtype"; import invariant from "invariant"; import warning from "warning"; @@ -127,7 +128,7 @@ class Route extends React.Component { if (__DEV__) { Route.propTypes = { children: PropTypes.oneOfType([PropTypes.func, PropTypes.node]), - component: PropTypes.func, + component: PropTypesElementType, exact: PropTypes.bool, location: PropTypes.object, path: PropTypes.string, diff --git a/packages/react-router/modules/__tests__/Route-test.js b/packages/react-router/modules/__tests__/Route-test.js index 3e8fba0e75..96e5fc4bc4 100644 --- a/packages/react-router/modules/__tests__/Route-test.js +++ b/packages/react-router/modules/__tests__/Route-test.js @@ -127,6 +127,41 @@ describe("A ", () => { }); }); + it("receives { match, location, history } props", () => { + let actual = null; + const Component = props => (actual = props) && null; + + ReactDOM.render( + + + , + node + ); + + expect(actual.history).toBe(history); + expect(typeof actual.match).toBe("object"); + expect(typeof actual.location).toBe("object"); + }); + + it("support forwardRef component", () => { + // Make sure the component PropTypes is not throwing a warning + // forwardRef are generated by React and not a function + const TEXT = "Mrs. Kato"; + const node = document.createElement("div"); + const Component = React.forwardRef((props, ref) => ( +
{TEXT}
+ )); + + ReactDOM.render( + + + , + node + ); + + expect(node.innerHTML).toContain(TEXT); + }); + describe("with `exact=true`", () => { it("renders when the URL does not have a trailing slash", () => { const text = "bubblegum"; diff --git a/packages/react-router/package.json b/packages/react-router/package.json index d08502db7d..730dcef3e3 100644 --- a/packages/react-router/package.json +++ b/packages/react-router/package.json @@ -47,6 +47,7 @@ "loose-envify": "^1.3.1", "path-to-regexp": "^1.7.0", "prop-types": "^15.6.1", + "prop-types-elementtype": "^1.0.0", "warning": "^4.0.1" }, "devDependencies": {