回答:
react-routerのバージョン1、2、および3の場合、URLマッピングスキームへのルートを設定する正しい方法は、履歴の実装をのhistory
パラメーターに渡すことです<Router>
。履歴ドキュメントから:
簡単に言うと、履歴はブラウザのアドレスバーの変更をリッスンする方法を知っており、URLを解析して、ルーターがルートを照合し、正しいコンポーネントセットをレンダリングするために使用できるロケーションオブジェクトに変換します。
react-router 2および3では、ルート構成コードは次のようになります。
import { browserHistory } from 'react-router'
ReactDOM.render ((
<Router history={browserHistory} >
...
</Router>
), document.body);
バージョン1.xでは、代わりに以下を使用します。
import createBrowserHistory from 'history/lib/createBrowserHistory'
ReactDOM.render ((
<Router history={createBrowserHistory()} >
...
</Router>
), document.body);
次のバージョン4のreact-routerでは、構文が大幅に変更されてBrowserRouter
おり、ルーターのルートタグとして使用する必要があります。
import BrowserRouter from 'react-router/BrowserRouter'
ReactDOM.render ((
<BrowserRouter>
...
<BrowserRouter>
), document.body);
Source Reactルーターバージョン4ドキュメント
history
は、インストールする必要があるスタンドアロンパッケージです。
browserHistory
はv2.xでを変更しました。react -routerアップグレードガイドをimport { browserHistory } from 'react-router' <Router history={browserHistory} />
チェックしてください
hashHistory
、最後にこのクエリパラメータを削除する方法はありますか?http://localhost:8080/#/dashboard?_k=yqwtyu
Router.run(routes, Router.HistoryLocation, function (Handler) {
React.render(<Handler/>, document.body);
});
現在のバージョン0.11以降では、に追加Router.HistoryLocation
する必要がありますRouter.run()
。<Routes>
廃止されました。0.12.x HistoryLocationの実装については、アップグレードガイドを参照してください。
IE8をサポートする必要がない場合は、ブラウザーの履歴を使用できますwindow.pushState
。ハッシュを設定する代わりに、react-routerが使用します。
これを正確に行う方法は、使用しているReact Routerのバージョンによって異なります。
<Routes location="history">
途中でブラウザーを更新するまで、つまりlocalhost:3000/about
404エラーが発生するまで、すべて正常に機能するように追加しました。それは期待されていpython -m SimpleHTTPServer 3000
ますか、私は使っていますか?
/about
実際にルートページが読み込まれます/
。それ以外の場合、サーバーは一致/about
して何も見つからないルートを探します(404)。私は個人的にpythonを使用していませんが、通常は手動ルート/*
または/.*
->のいずれかが見つかります。/
またはhtml5Mode
、サーバー設定でURL と呼ばれるものである可能性があります。
実際に.htaccessを使用してこれを実現できます。ブラウザは通常、クエリ文字列の区切り文字を?
必要#
とするか、クエリ文字列の始まりとディレクトリパスの終わりを決定する必要があります。最終的な結果は次のとおりですwww.mysite.com/dir
。Webサーバーが要求したと思うディレクトリをWebサーバーが検索する前に、問題をキャッチする必要があります/dir
。したがって.htaccess
、プロジェクトのルートにファイルを配置します。
# Setting up apache options
AddDefaultCharset utf-8
Options +FollowSymlinks -MultiViews -Indexes
RewriteEngine on
# Setting up apache options (Godaddy specific)
#DirectoryIndex index.php
#RewriteBase /
# Defining the rewrite rules
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^.*$ ./index.html
次にwindow.location.pathnameでクエリパラメータを取得します
その後、必要に応じてリアクションルートの使用を回避し、必要に応じてURLとブラウザの履歴を操作することもできます。これが誰かを助けることを願っています...
履歴パッケージをインストールする
npm install history --save
次に、履歴からcreateHistoryとuseBasenameをインポートします
import { createHistory, useBasename } from 'history';
...
const history = useBasename(createHistory)({
basename: '/root'
});
アプリのURLがwww.example.com/myAppの場合、/ rootは/ myAppにする必要があります。
履歴変数をルーターに渡す
render((
<Router history={history}>
...
</Router>
), document.getElementById('example'));
すべてのリンクタグについて、すべてのパスの前に「/」を追加します。
<Link to="/somewhere">somewhere</Link>
ソリューションのインスピレーションは、 残念ながらAPIに適切に文書化されていないReact-Router Exampleからきています。
ハッシュの後に何を表示するかを処理する別の方法(つまり、pushStateを使用しない場合!)は、CustomLocationを作成し、ReactRouterの作成時にロードすることです。
たとえば、クロールに関するGoogleの仕様に準拠するためにハッシュバンのURL(#を使用)が必要な場合は、主に次のような元のHashLocationをコピーするHashbangLocation.jsファイルを作成できます。
'use strict';
var LocationActions = require('../../node_modules/react-router/lib/actions/LocationActions');
var History = require('../../node_modules/react-router/lib/History');
var _listeners = [];
var _isListening = false;
var _actionType;
function notifyChange(type) {
if (type === LocationActions.PUSH) History.length += 1;
var change = {
path: HashbangLocation.getCurrentPath(),
type: type
};
_listeners.forEach(function (listener) {
listener.call(HashbangLocation, change);
});
}
function slashToHashbang(path) {
return "!" + path.replace(/^\//, '');
}
function ensureSlash() {
var path = HashbangLocation.getCurrentPath();
if (path.charAt(0) === '/') {
return true;
}HashbangLocation.replace('/' + path);
return false;
}
function onHashChange() {
if (ensureSlash()) {
// If we don't have an _actionType then all we know is the hash
// changed. It was probably caused by the user clicking the Back
// button, but may have also been the Forward button or manual
// manipulation. So just guess 'pop'.
var curActionType = _actionType;
_actionType = null;
notifyChange(curActionType || LocationActions.POP);
}
}
/**
* A Location that uses `window.location.hash`.
*/
var HashbangLocation = {
addChangeListener: function addChangeListener(listener) {
_listeners.push(listener);
// Do this BEFORE listening for hashchange.
ensureSlash();
if (!_isListening) {
if (window.addEventListener) {
window.addEventListener('hashchange', onHashChange, false);
} else {
window.attachEvent('onhashchange', onHashChange);
}
_isListening = true;
}
},
removeChangeListener: function removeChangeListener(listener) {
_listeners = _listeners.filter(function (l) {
return l !== listener;
});
if (_listeners.length === 0) {
if (window.removeEventListener) {
window.removeEventListener('hashchange', onHashChange, false);
} else {
window.removeEvent('onhashchange', onHashChange);
}
_isListening = false;
}
},
push: function push(path) {
_actionType = LocationActions.PUSH;
window.location.hash = slashToHashbang(path);
},
replace: function replace(path) {
_actionType = LocationActions.REPLACE;
window.location.replace(window.location.pathname + window.location.search + '#' + slashToHashbang(path));
},
pop: function pop() {
_actionType = LocationActions.POP;
History.back();
},
getCurrentPath: function getCurrentPath() {
return decodeURI(
// We can't use window.location.hash here because it's not
// consistent across browsers - Firefox will pre-decode it!
"/" + (window.location.href.split('#!')[1] || ''));
},
toString: function toString() {
return '<HashbangLocation>';
}
};
module.exports = HashbangLocation;
slashToHashbang関数に注意してください。
それからあなたは正義をしなければなりません
ReactRouter.create({location: HashbangLocation})
以上です :-)
HashHistory
iso を使用するためBrowserHistory
です。また、このSOに関する質問も参照してください。この問題に関する多くの背景情報を提供します。