UNPKG

twreporter-react

Version:

React-Redux site for The Reporter Foundation in Taiwan

373 lines (284 loc) 11.2 kB
## [HEAD] ## [v1.0.2] > Dec 8, 2015 - Pinned peer dependency on History to `1.13.x` to avoid console warnings. ## [v1.0.1] > Dec 5, 2015 - Support IE8 ([#2540]) - Add ES2015 module build ([#2530]) [HEAD]: https://github.com/rackt/react-router/compare/latest...HEAD [#2530]: https://github.com/rackt/react-router/pull/2530 [#2540]: https://github.com/rackt/react-router/pull/2540 ## [v1.0.0] > Nov 9, 2015 Thanks for your patience :) Big changes from v0.13.x to 1.0. While on the surface a lot of this just looks like shuffling around API, the entire codebase has been rewritten to handle some really great use cases, like loading routes and components on demand, session-based route matching, server rendering, integration with libs like redux and relay, and lots more. But for now, here's how to translate the old API to the new one. ### Importing The new `Router` component is a property of the top-level module. ```js // v0.13.x var Router = require('react-router'); var Route = Router.Route; // v1.0 var ReactRouter = require('react-router'); var Router = ReactRouter.Router; var Route = ReactRouter.Route; // or using ES Modules import { Router, Route } from 'react-router'; ``` ### Rendering ```js // v0.13.x Router.run(routes, (Handler) => { render(<Handler/>, el); }) // v1.0 render(<Router>{routes}</Router>, el) // looks more like this: render(( <Router> <Route path="/" component={App}/> </Router> ), el); // or if you'd rather render(<Router routes={routes}/>, el) ``` ### Locations Locations are now called histories (that emit locations). You import them from the [`history` package](https://github.com/rackt/history), not react router. ```js // v0.13.x Router.run(routes, Router.BrowserHistory, (Handler) => { render(<Handler/>, el); }) // v1.0 import createBrowserHistory from 'history/lib/createBrowserHistory' let history = createBrowserHistory() render(<Router history={history}>{routes}</Router>, el) ``` If you do not specify a history type (as in the example above) then you will notice some unusual behaviour after updating to 1.0.0. With the default hash based routing a querystring entry not defined by yourself will start appearing in your URLs called `_k`. An example of how it looks is this: `?_k=umhx1s` This is intended and part of [createHashHistory](https://github.com/rackt/react-router/blob/master/docs/guides/basics/Histories.md#createhashhistory) (which is the default history approach used if one is not specified). You can read more about the feature [here](https://github.com/rackt/react-router/blob/master/docs/guides/basics/Histories.md#what-is-that-_kckuvup-junk-in-the-url) and how to opt out [here](https://rackt.github.io/history/stable/HashHistoryCaveats.html). ### Route Config You can still nest your routes as before, paths are inherited from parents just like before but prop names have changed. ```js // v0.13.x <Route name="about" handler={About}/> // v1.0 <Route path="about" component={About}/> ``` Named routes are gone (for now, [see discussion](https://github.com/rackt/react-router/issues/1840)) ### NotFound route Not found really confused people, mistaking not finding resources from your API for not matching a route. We've removed it completely since it's simple with a `*` path. ```js // v0.13.x <NotFoundRoute handler={NoMatch}/> // v1.0 <Route path="*" component={NoMatch}/> ``` ### Redirect route ```js // v0.13.x <Redirect from="some/where/:id" to="somewhere/else/:id" params={{id: 2}}/> // v1.0 // Works the same as before, except no params, just put them in the path <Redirect from="/some/where/:id" to="/somewhere/else/2"/> ``` ### Links #### path / params ```js // v0.13.x <Link to="user" params={{userId: user.id}}>Mateusz</Link> // v1.0 // because named routes are gone, link to full paths, you no longer need // to know the names of the parameters, and string templates are quite // nice. Note that `query` has not changed. <Link to={`/users/${user.id}`}>Mateusz</Link> ``` #### "active" class In 0.13.x links added the "active" class by default which you could override with `activeClassName`, or provide `activeStyle`s. It's usually just a handful of navigation links that need this behavior. Links no longer add the "active" class by default (its expensive and usually not necessary), you opt-in by providing one; if no `activeClassName` or `activeStyle`s are provided, the link will not check if it's active. ```js // v0.13.x <Link to="about">About</Link> // v1.0 <Link to="/about" activeClassName="active">About</Link> ``` #### Linking to Index routes Because named routes are gone, a link to `/` with an index route at `/` will always be active. So we've introduced `IndexLink` that is only active when on exactly that path. ```js // v0.13.x // with this route config <Route path="/" handler={App}> <DefaultRoute name="home" handler={Home}/> <Route name="about" handler={About}/> </Route> // will be active only when home is active, not when about is active <Link to="home">Home</Link> // v1.0 <Route path="/" component={App}> <IndexRoute component={Home}/> <Route path="about" component={About}/> </Route> // will be active only when home is active, not when about is active <IndexLink to="/">Home</IndexLink> ``` This gives you more granular control of what causes a link to be active or not when there is an index route involved. #### onClick handler For consistency with React v0.14, returning `false` from a `Link`'s `onClick` handler no longer prevents the transition. To prevent the transition, call `e.preventDefault()` instead. ### RouteHandler `RouteHandler` is gone. `Router` now automatically populates `this.props.children` of your components based on the active route. ```js // v0.13.x <RouteHandler/> <RouteHandler someExtraProp={something}/> // v1.0 {this.props.children} {React.cloneElement(this.props.children, {someExtraProp: something})} ``` There's a small semantic change with this approach. React validates `propTypes` on elements when those elements are created, rather than when they're about to render. This means that any props with `isRequired` will fail validation when those props are supplied via this approach. In these cases, you should not specify `isRequired` for those props. For more details, see [facebook/react#4494](https://github.com/facebook/react/issues/4494#issuecomment-125068868). ### Navigation Mixin If you were using the `Navigation` mixin, use the `History` mixin instead. ```js // v0.13.x var Assignment = React.createClass({ mixins: [ Navigation ], navigateAfterSomethingHappened () { this.transitionTo('/users', { userId: user.id }, query); // this.replaceWith('/users', { userId: user.id }, query); } }) // v1.0 var Assignment = React.createClass({ mixins: [ History ], navigateAfterSomethingHappened () { // the router is now built on rackt/history, and it is a first class // API in the router for navigating this.history.pushState(null, `/users/${user.id}`, query); // this.history.replaceState(null, `/users/${user.id}`, query); } }) ``` The following `Navigation` methods are now also found on the history object, main difference again is there are no params or route names, just pathnames. | v0.13 | v1.0 | |--------------------------------------|-------------------------------| | `go(n)` | `go(n)` | | `goBack()` | `goBack()` | | `goForward()` | `goForward()` | | `makeHref(routeName, params, query)` | `createHref(pathname, query)` | | `makePath(routeName, params, query)` | `createPath(pathname, query)` | ### State mixin ```js // v0.13.x var Assignment = React.createClass({ mixins: [ State ], foo () { this.getPath() this.getParams() // etc... } }) // v1.0 // if you are a route component... <Route component={Assignment} /> var Assignment = React.createClass({ foo () { this.props.location // contains path information this.props.params // contains params this.props.history.isActive('/pathToAssignment') } }) // if you're not a route component, you need to pass location down the // tree or get the location from context. We will probably provide a // higher order component that will do this for you but haven't yet. // see further down for more information on what can be passed down // via context var Assignment = React.createClass({ contextTypes: { location: React.PropTypes.object }, foo () { this.context.location } }) ``` Here's a table of where you used to get stuff with the `State` mixin, and where you get it now if you're a route component (`this.props`) | v0.13 (this) | v1.0 (this.props) | |-------------------|------------------------------------| | `getPath()` | `location.pathname+location.search`| | `getPathname()` | `location.pathname` | | `getParams()` | `params` | | `getQuery()` | `location.search` | | `getQueryParams()`| `location.query` | | `getRoutes()` | `routes` | | `isActive(to, params, query)` | `history.isActive(pathname, query, onlyActiveOnIndex)` | Here is another table of properties you used to get via the `State` and where you can get it now if you are **not** a route component (`this.context`). | v0.13 (this) | v1.0 (this.context) | |-------------------|------------------------------------| | `getPath()` | `location.pathname+location.search`| | `getPathname()` | `location.pathname` | | `getQuery()` | `location.query` | | `isActive(to, params, query)` | `history.isActive(pathname, query, indexOnly)` | Note not all `State` functionality can be accessed via context in v1.0. For example, `params` is not available via context. ### Scrolling We're developing scroll behaviors separately in the [`scroll-behavior`](https://github.com/rackt/scroll-behavior) library until we have a stable, robust implementation that we're happy with. Currently, scroll behaviors are exposed there as history enhancers: ```js import createHistory from 'history/lib/createBrowserHistory' import useScroll from 'scroll-behavior/lib/useStandardScroll' const history = useScroll(createHistory)() ``` ### `willTransitionTo` and `willTransitionFrom` Routes now define this behavior: ```js // v0.13.x var Home = React.createClass({ statics: { willTransitionTo (transition, params, query, callback) { } willTransitionFrom (component, transition, params, query, callback) { } } }) // v1.0 <Route component={Home} onEnter={(location, replaceWith) => {}} onLeave={() => {}} /> ``` To cancel a "transition from", please refer to the [Confirming Navigation](docs/guides/advanced/ConfirmingNavigation.md) guide. ### We'll keep updating this There's a lot of the old API we've missed, please give the [new docs](/docs) a read and help us fill this guide in. Thanks! [v1.0.0]: https://github.com/rackt/react-router/compare/v0.13.5...v1.0.0