React Router 2.0.0
github.com
github.com
My project broke the other day because when you provide multiple child components it used to create an object that was "this.props.children.component1" but now it just does "this.props.component1". But when you only pass one component it is still named "this.props.children" in spite of there only being one component. I was unable to find any convincing reasoning for making this change. Does exactly the same thing. Makes the interface less sensible in my opinion. Caused me to do unnecessary work to achieve exactly the same result.
I get that changes are necessary when they change functionality but a lot of times it seems things have just changed with no reasoning other than just changing for the sake of changing. Maybe I'm being unreasonable and overly picky but I wish they would just keep the API stable and make the changes behind the scenes.
Fast paced innovation is good. If you don't like life on the edge, it's not like these problems were unsolved last year. Use those solutions.
https://facebook.github.io/react/docs/top-level-api.html#rea...
As for the change to the case with using multiple named child components - we made that change because React upstream made it no longer valid to pass objects into this.props.children. It wasn't that we decided one way or the other that it was nicer to spread named children into top-level props; the old way that we did it (which for this case was arguably cleaner) was literally no longer supported by React, so we had no choice.
https://github.com/facebook/react/issues/5371
What am I missing?
A lot of the motivations from 0.13 to 1.0 were around the APIs very liberally mixing React conventions with plain Javascript conventions, with a dash of callback hell thrown in for good measure. In addition, getting access to a lot of the internal APIs for integrations with things like redux and relay was very difficult. So, there was a very large rewrite to better modularize the code and improve the semantics of the API. I think they got pretty close to a good goal, but obviously there was room for improvement.
2.0's motivations have been around further simplifying a lot of the API surface area, particularly in relation to the history sub-project (which is a wrapper around location.hash, HTML5 pushState, and pure memory location state histories). history (which was a peerDep) was a big problem because we tried to stay hands off from that API as much as possible. This ended up putting a lot of mental load on the user, because they now had to be aware of and learn two libraries. So, we're now wrapping things up under a single API provided via `this.context.router` and provided pre-built history objects so you can choose what kind of history (hash or pushstate) you want with much less code and overhead.
Another important thing in this upcoming version is backwards compatibility. We want to avoid the hassles you're having with things breaking all the time. If this version doesn't work with your code built for 1.0, then that's a bug and a blocker for release. We're following React's lead for post-1.0 versioning: https://gist.github.com/zpao/6e12ee0f46ce87af2287#versioning That is, we will release new APIs with each major version and deprecate but support any upcoming API removals. You'll have a chance to test against those removals by looking for dev-only warnings, but everything should work drop-in. As a bonus, we're also shipping a series of jscodeshift codemods to automatically upgrade your existing code to the newer APIs: https://github.com/rackt/rackt-codemod Check those out, because they're really cool and Jimmy Jia worked to make them a part of our upgrade path.
Now, as for your mentioned issue, that was actually a change in a rc version. Yes, changing an API in a release candidate is bad. No way around it: that's our mistake. There was a good reason for this, as it caused bugs with React.Children.map: https://github.com/rackt/react-router/issues/1968 The 1.0 release process was super-rocky and we're looking to avoid that in the future. For 2.0, our API is stable and works to the best of our knowledge. No additions or removals will happen before the final version, so the rc badge is being properly used this time.
We're also making sure our documentation for upgrades and general use are up-to-date and super-clear. The 2.0 API actually came about because Ryan Florence went to go make a screencast series and ran into many of the common problems with the 1.0 API. So, documentation drives our development pretty hard now. We still have a LOT to do, but we are working on it in earnest and my personal goal is to have some of the best documentation out there when all is said and done.
If you have any other suggestions, criticisms, or questions about the APIs, please get in touch on Github via an issue or hop on the Reactiflux chat on Discord. We're all nice, reasonable guys who want to help and make this a great library for both power users and beginners alike. We need more feedback like this so we can make sure we're moving in the right direction. I promise we won't bite!
This problem is endemic in the JS world these days. Sure breaking things up into independent modules is a good thing up to a point. But having dozens of little dependencies for every library with their own compatibility issues gets unmanageable very quickly.
import { useRouterHistory, hashHistory } from 'react-router'
// useRouterHistory creates a composable higher-order function
const appHistory = useRouterHistory(hashHistory)({ queryKey: false })
<Router history={appHistory}/>
if i wanted to change the scroll behavior of router, then i'd have to do something like this: import useScroll from 'scroll-behavior/lib/useStandardScroll'
const appHistory = useScroll(useRouterHistory(hashHistory))({ queryKey: false })
how does this make using router/history any clearer?i LIKE react-router, i think it's pretty damn good, but I just don't understand the rationale for their API choices. combine that with the velocity at which they're changing the APIs, it makes me wish that they'd just take their time with the design
import { Router, browserHistory } from 'react-router';
const router = <Router history={browserHistory} />;
One perk is that you can then navigate using the singleton if you want, e.g. with browserHistory.push('/foo');
The scroll behavior stuff is definitely messy; I haven't had time to clean it up. The nice thing about OSS, though, is that the rest of you are all free to contribute changes.Most projects already have their own ways to pass dependencies (through DI or whatnot), and I can't help but feel like providing those singletons is going to end up messy.
Of course, that API is quite opaque and doesn't give you a history object you work with. It's really just a boilerplate reducer or macro for SSR. You can copy out what's going on inside of the function, but that's pretty crappy for you to have to manage.
I think, in addition to the docs sucking, we need to come up with a better API for SSR. If you're using redux-simple-router or other integrations that rely on history, it's entirely unusable. We need to fix this.
I dont think you need to do a lot of explanatory docs - if you have canonical examples, that would be more than enough.
I'm also happy to see codemods and other AST manipulations (such as babel plugins) gaining popularity. Similar to eslint's --fix, codemods are making repetitive changes easier across large codebases.
This was in response to
> Why not just use a templating language?
React is a templating language...or maybe more specifically has a templating language, JSX. You can even run it server side. http://reactjs.net/guides/server-side-rendering.html
The problem isn't using React in that situation per se but just that server side templating (React or not) would be a better choice. I assume that's what the commenter meant.
It's easy when you use webpack and a static renderer: https://github.com/markdalgleish/static-site-generator-webpa...
It has been extremely difficult to build something on top of it and keep current. Pre-1.0 I can understand the API thrash but 1.0->2.0 in a couple months?
Facebook should carry the torch here and write a standard router. This is a core component critical to the success of React for any applications more complicated than a dashboard.
They thought they had the API figured out for various use cases beyond the core routing functionality, but it turns out they didn't.
In addition, 2.0 is supposed to be backwards-compatible for end users and they're providing codemods to help you update when it's convenient to do so.
Also a fan of https://github.com/relay-tools/react-router-relay, because Relay is great.
If anything, working on react-router-relay has only made me appreciate React Router's design more.
A lot of the changes in 2.x are specifically from lessons we've learned in building react-router-relay and other integrations, but they're closer to refactorings and code reorganization than to wholesale rewrites.
Specifically I didn't like it when named routes were removed.
But hey—it's open source. Sometimes I get worked up about this or that, but then I remember that all of this I'm getting for free and I must be grateful.
4.0.0 -> 5.0.0 - 7 weeks
3.0.0 -> 4.0.0 - 5 weeks
2.0.0 -> 3.0.0 - 3 months
Semver will do that :)> It's hard to imagine the top-level API changing much after this.
Very glad to hear that and hope it will indeed become stable after this