https://cdnjs.cloudflare.com/ajax/libs/react-router/4.0.0-2/react-router.min.js
の使用からhttps://cdnjs.cloudflare.com/ajax/libs/react-router/3.0.1/ReactRouter.min.js
の使用に移行するにはどうすればよいですか?
以下の3.xを使用した例。
HTML
<script src="https://unpkg.com/[email protected]/dist/react.min.js"></script>
<script src="https://unpkg.com/[email protected]/dist/react-dom.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-router/3.0.1/ReactRouter.min.js"></script>
JS
let { Router, IndexRoute, Redirect, Route, Link, browserHistory } = ReactRouter;
history.replaceState(0,0,'/');
const Main = () =>
<Router history={browserHistory}>
<Route path='/' component={App}>
<IndexRoute component={Home}/>
<Route path='map' component={Map}/>
<Route path='settings' component={Settings}/>
<Redirect from='foo' to='/' />
<Route path='*' component={NotFound}/>
</Route>
</Router>
const App = props =>
<div>
<Navigation>
<Link to='/map'>Map</Link>
<Link to='/settings'>Settings</Link>
<Link to='/foo'>Foo</Link>
</Navigation>
{props.children}
</div>
const Navigation = props => <nav {...props} />
const Home = () => <h1>Home</h1>
const Map = () => <h1>Map</h1>
const Settings = () => <h1>Settings</h1>
const NotFound = (props) => <h1>404 - Not Found</h1>
ReactDOM.render(<Main />, document.body);
動作をご覧ください: https://jsfiddle.net/developit/nvpr63eg/
CDNでホストされている4.xバージョンのいずれかに移動すると、動作しません(returnステートメントの後の到達不能コード)。
いくつかの点を変更することで、reduxで構成できました。
まず、browserHistory
はreact-router
で定義されなくなりました。戻す方法の1つは、パッケージhistory
を使用することです。
インストールする必要があります(オプションのredux):
npm i -S history react-router react-router-redux
browserHistory
をインポートしようとする代わりに:
import { createBrowserHistory } from 'history';
Reduxを使用する場合は、これをインポートして、組み合わせたレデューサーに追加します。
import { routerReducer as routing } from 'react-router-redux';
combineReducers({
home, about,
routing, // new
});
次に、history
オブジェクトを作成します
// redux
import { syncHistoryWithStore } from 'react-router-redux';
const history = syncHistoryWithStore(createBrowserHistory(), store);
// regular
const history = createBrowserHistory();
次に、新しいhistory
オブジェクトを使用するようにルーターを変更します
<Router history={ history } children={ Routes } />
他のすべては同じでなければなりません。
誰かがThe prop history is marked as required in Router, but its value is undefined.
に遭遇した場合
browserHistory
がreact-routerで使用できなくなったためです。代わりに履歴パッケージを使用する投稿を参照してください。
関連する
これは、上記のPaul Sに対する補足的な回答です。クレジットはまだそれを投稿するためにポールに行く必要があります。
答えを補足する理由mはbcozです:-
糸のステップ:
yarn add react-router
yarn add react-router-dom
package.json:
"react": "^15.6.1",
"react-dom": "^15.6.1",
"react-router": "^4.1.1",
"react-router-dom": "^4.1.1"
index.js:
import React from 'react';
import ReactDOM from 'react-dom';
import { Switch, Redirect, Route} from 'react-router';
import {BrowserRouter, Link} from 'react-router-dom';
//let { BrowserRouter, Switch, Redirect, Route, Link } = ReactRouter;
const Main = () =>
<BrowserRouter>
<App>
<Switch>
<Route exact path='/' component={Home}/>
<Route path='/map' component={Map}/>
<Route path='/settings' component={Settings}/>
<Route path='/foo' component={Foo}/>
<Route component={NotFound}/>
</Switch>
</App>
</BrowserRouter>
const App = props =>
<div>
<Navigation>
<Link to='/map'>Map</Link>
<Link to='/settings'>Settings</Link>
<Link to='/foo'>Foo</Link>
</Navigation>
{props.children}
</div>
const Navigation = props => <nav {...props} />
const Home = () => <h1>Home</h1>
const Map = () => <h1>Map</h1>
const Settings = () => <h1>Settings</h1>
const Foo = () => <Redirect to='/' />
const NotFound = (props) => <h1>404 - Not Found</h1>
ReactDOM.render(<Main />, document.body);
完全なリリースに近いアップグレードガイドがあるはずです。現在のアルファではなく、今後のベータ用にコードを適合させました。ベータ版はまだリリースされていないため、残念ながらReact Routerをホストするバージョンはありません。これを使用してこれをテストできます。
let { BrowserRouter, Switch, Redirect, Route, Link } = ReactRouter;
const Main = () =>
<BrowserRouter>
<App>
<Switch>
<Route exact path='/' component={Home}/>
<Route path='/map' component={Map}/>
<Route path='/settings' component={Settings}/>
<Route path='/foo' component={Foo}/>
<Route component={NotFound}/>
</Switch>
</App>
</BrowserRouter>
const App = props =>
<div>
<Navigation>
<Link to='/map'>Map</Link>
<Link to='/settings'>Settings</Link>
<Link to='/foo'>Foo</Link>
</Navigation>
{props.children}
</div>
const Navigation = props => <nav {...props} />
const Home = () => <h1>Home</h1>
const Map = () => <h1>Map</h1>
const Settings = () => <h1>Settings</h1>
const Foo = () => <Redirect to='/' />
const NotFound = (props) => <h1>404 - Not Found</h1>
ReactDOM.render(<Main />, document.body);
確かにできますが、現在のようにコードが実行されないため、コンポーネントとアプリケーションロジックの一部を書き換える必要があります。
公式ドキュメント here を読んでください。これらの変更についても良いFAQがあります here 。抜粋は次のとおりです。
なぜ大きな変化があるのですか?
tl; dr宣言的な構成可能性。
Reactルーターについてこれほど興奮したことはありません。皆さんのように、最初に取り上げてからReactについて多くのことを学びました。私たちは、途中で知っている限り最高のルーターを構築しました。私たちが最も学んだことは、宣言的構成可能性のためにReactが大好きだということです。
公式ソースによると、アップグレードする場合は、近日中にアップグレードガイドが提供されます。
アプリケーションの書き換えではなく、反復的な移行を非常に強く信じています。移行ガイドに取り組んでいますが、基本的な戦略は、両方のバージョンを並行して実行できるようにすることです(npmの制限により、両方をインストールできるように以前のバージョンを個別に公開します)。
ルートを1つずつ取得して、新しいAPIに移行できます。また、上記の構成アドオンが役立つ場合があります。
それを念頭に置いて、元の問題に戻ります。App
コンポーネントを適切に実行するには、次のようになります。
const App = props =>
<div>
<Navigation>
<Link to='/map'>Map</Link>
<Link to='/settings'>Settings</Link>
<Link to='/foo'>Foo</Link>
</Navigation>
{props.children}
</div>
<Match exactly pattern="/" component={Home} />
<Match pattern="/map" component={Map} />
<Match pattern="/settings" component={Settings} />
<Match pattern="/topics" component={Topics} />
お役に立てれば。がんばろう。
編集:どうやら@PaulSには、React-Router v4の将来のバージョンの例があります。投稿が正確な場合、上記のコードは今後機能しません。使用可能な現在のバージョンでのみ機能します。 RRv4が公開されたときの情報については、上記のリンクページに注目してください。
Jsfiddleに関して、v4の最近のリリースで注意すべき点がいくつかあります。最初のことは、ライブラリ全体が分離されていることです:Web、ネイティブ、およびコア(どこでも使用)。 Web専用のreact-router-domを使用します。
2:ルートをネストする方法はまったく異なります。実際にはできない親コンポーネントにルートをネストする代わりに、親コンポーネント(この場合はBrowserRouter)を定義するだけで、コンポーネント全体でルートを自由に定義できます。コンポーネントが階層を定義します。たとえば、メインコンポーネントとアプリコンポーネントを次のように整理できます。
const Main = () => (
<BrowserRouter>
<App />
</BrowserRouter>
)
const App = props => (
<div>
<Navigation>
<Link to='/'>Home</Link>
<Link to='/map'>Map</Link>
<Link to='/settings'>Settings</Link>
<Link to='/foo'>Foo</Link>
</Navigation>
<Route exact path='/' component={Home}/>
<Route path='/map' component={Map}/>
<Route path='/settings' component={Settings}/>
<Route path='/foo' render={() => (
<Redirect to="/"/>
)}/>
</div>
)
お役に立てれば。以下のjsfiddleの修正をご覧になり、質問がある場合はお知らせください。
https://jsfiddle.net/bagofcole/kL6m8pjk/12/
詳細については、チェックアウトしてください: https://reacttraining.com/react-router/web/guides/quick-start