React with react-router
version 4.ブラウザでURLを直接入力するとルーティングが機能しますが、リンクをクリックすると、ブラウザでURLが変更されます(例 http:// localhost:8080/categories )、コンテンツは更新されません(ただし、更新すると更新されます)。
以下は私のセットアップです:
Routes.jsセットアップは次のとおりです。
import { Switch, Route } from 'react-router-dom';
import React from 'react';
// Components
import Categories from './containers/videos/Categories';
import Videos from './containers/videos/Videos';
import Home from './components/Home';
const routes = () => (
<Switch>
<Route exact path="/" component={Home}/>
<Route path="/videos" component={Videos}/>
<Route path="/categories" component={Categories}/>
</Switch>
);
export default routes;
Nav.jsで使用するリンクは次のとおりです。
<Link to="/videos">Videos</Link>
<Link to="/categories">Categories</Link>
App.jsは次のとおりです。
import React from 'react';
import './app.scss';
import Routes from './../routes';
import Nav from './Nav';
class AppComponent extends React.Component {
render() {
return (
<div className="index">
<Nav />
<div className="container">
<Routes />
</div>
</div>
);
}
}
AppComponent.defaultProps = {
};
export default AppComponent;
コンポーネントをwithRouter
でラップすることで、作業を行うことができます。 withRouter
は、Link
または他のRouter
小道具を使用し、Route
から直接Router props
を受け取らないコンポーネントに必要です。 Parent Component
から
Router Propsは、次のように呼び出されたときにコンポーネントで使用できます。
<Route component={App}/>
または
<Route render={(props) => <App {...props}/>}/>
またはLinks
をRouterタグの直接の子として配置している場合
<Router>
<Link path="/">Home</Link>
</Router>
Router内の子コンテンツをコンポーネントとして記述したい場合、次のように
<Router>
<App/>
</Router>
ルーターの小道具はアプリで利用できないため、次のようなルートを使用して呼び出しを渡すことができます
<Router>
<Route component={App}/>
</Router>
ただし、高度にネストされたコンポーネントにルーターの小道具を提供する場合は、withRouterが便利です。このソリューションを確認してください
import {withRouter} from 'react-router'
class AppComponent extends React.Component {
render() {
return (
<div className="index">
<Nav />
<div className="container">
<Routes />
</div>
</div>
);
}
}
AppComponent.defaultProps = {
};
export default withRouter(AppComponent);
コンポーネントを調べて、1つだけであることを確認します<Router> ... </Router>
。また-<Router>...</Router>
複数を使用する場合がありますが、誤ってルーターをネストしている場合(すべての種類の場所に移動するときにすばやくハッキングし、削除するのを忘れたためです;-) -それは問題を引き起こす可能性があります。
しようと思います
import {
BrowserRouter as Router,
} from 'react-router-dom'
// Other Imports
...
return (
<Router>
<div className="index">
<Nav /> <!-- In this component you have <Links> -->
<div className="container">
<Routes />
</div>
</div>
</Router>
);
一番上のコンポーネント(App.js)で。
私はまったく同じ問題を抱えていましたが、私の原因はもっと簡単でした。
私の場合、URL文字列の最後にスペースがありました。
<Link to={ "/myentity/" + id + "/edit " } >Edit</Link>
リンクをクリックしても機能しませんが、URLはアドレスバーで更新されます。ブラウザーのアドレスバーをタップしてenter
キーを押すと、正しく動作します。
スペースを削除すると修正されました:
<Link to={ "/myentity/" + id + "/edit" } >Edit</Link>
かなり明らかですが、見落としがちです。私が気づく前にいくつかの髪が引っ張られました(そして明らかに私はここに行き着きました)、それが他の誰かにいくつかの髪を救うことを願っています。
アプリケーション(package.json)の依存関係にreact-router
をインストールしていないため、これに直面していました...
コンポーネントを含める順序は、index.js
ファイル。 BrowserRouter、プロバイダー、そしてアプリ。
ReactDOM.render(
<BrowserRouter>
<Provider store={store}>
<App />
</Provider>
</BrowserRouter>,
document.getElementById('app')
);
おそらく2つのこと:
インポートしましたか{ Link } from 'react-router-dom'
あなたのNav.jsファイルに?
スペル/大文字小文字の間違いの可能性:エクスポートexport default routes
(小文字)がimport Routes from './../routes
(大文字)。