<Link/>
を使わずにreact-routerでクエリパラメータを更新する方法を見つけることができないようです。 hashHistory.Push(url)
はクエリパラメータを登録しているようには見えません。また、クエリオブジェクトなどを2番目の引数として渡すことができるようには見えません。
/shop/Clothes/dresses
を使用せずに、react-routerでどのようにurlを/shop/Clothes/dresses?color=blue
から<Link>
に変更しますか?
そしてonChange
関数は本当にクエリの変更をリッスンする唯一の方法なのでしょうか。クエリの変更が自動的に検出され、パラメータの変更と同じように反応しないのはなぜですか。
Push
のhashHistory
メソッド内で、クエリパラメータを指定できます。例えば、
history.Push({
pathname: '/dresses',
search: '?color=blue'
})
または
history.Push('/dresses?color=blue')
history
の使用に関するその他の例については、--- repository をご覧ください。
React-router v4、redux-thunkおよびreact-router-redux(5.0.0-alpha.6)パッケージの使用例.
ユーザーが検索機能を使用するとき、私は彼が同僚に同じクエリに対するURLリンクを送信できるようにしたいです。
import { Push } from 'react-router-redux';
import qs from 'query-string';
export const search = () => (dispatch) => {
const query = { firstName: 'John', lastName: 'Doe' };
//API call to retrieve records
//...
const searchString = qs.stringify(query);
dispatch(Push({
search: searchString
}))
}
ジョンの答え 正しいです。私がparamsを扱っているとき、私はURLSearchParams
インターフェースも必要です。
this.props.history.Push({
pathname: '/client',
search: "?" + new URLSearchParams({clientId: clientId}).toString()
})
コンポーネントをwithRouter
デコレータでラップする必要があるかもしれません。 export default withRouter(YourComponent);
。
From GitHubのDimitriDushkin :
import { browserHistory } from 'react-router';
/**
* @param {Object} query
*/
export const addQuery = (query) => {
const location = Object.assign({}, browserHistory.getCurrentLocation());
Object.assign(location.query, query);
// or simple replace location.query if you want to completely change params
browserHistory.Push(location);
};
/**
* @param {...String} queryNames
*/
export const removeQuery = (...queryNames) => {
const location = Object.assign({}, browserHistory.getCurrentLocation());
queryNames.forEach(q => delete location.query[q]);
browserHistory.Push(location);
};
または
import { withRouter } from 'react-router';
import { addQuery, removeQuery } from '../../utils/utils-router';
function SomeComponent({ location }) {
return <div style={{ backgroundColor: location.query.paintRed ? '#f00' : '#fff' }}>
<button onClick={ () => addQuery({ paintRed: 1 })}>Paint red</button>
<button onClick={ () => removeQuery('paintRed')}>Paint white</button>
</div>;
}
export default withRouter(SomeComponent);
クエリ文字列を簡単に解析するためのモジュールが必要な場合は、 query-string moduleを使用することをお勧めします。
componentWillMount() {
var query = queryString.parse(this.props.location.search);
if (query.token) {
window.localStorage.setItem("jwt", query.token);
store.dispatch(Push("/"));
}
}
ここでは、成功したGoogleパスポート認証の後、Node.jsサーバーからクライアントにリダイレクトしています。これは、クエリパラメータとしてトークンを使用してリダイレクトされています。
私はそれをquery-stringモジュールで解析し、それを保存し、そして react-router-redux からのプッシュでURLのクエリパラメータを更新しています。
for react-router v4.3,
const addQuery = (key, value) => {
let pathname = props.location.pathname;
// returns path: '/app/books'
let searchParams = new URLSearchParams(props.location.search);
// returns the existing query string: '?type=fiction&author=fahid'
searchParams.set(key, value);
this.props.history.Push({
pathname: pathname,
search: searchParams.toString()
});
};
const removeQuery = (key) => {
let pathname = props.location.pathname;
// returns path: '/app/books'
let searchParams = new URLSearchParams(props.location.search);
// returns the existing query string: '?type=fiction&author=fahid'
searchParams.delete(key);
this.props.history.Push({
pathname: pathname,
search: searchParams.toString()
});
};
```
```
function SomeComponent({ location }) {
return <div>
<button onClick={ () => addQuery('book', 'react')}>search react books</button>
<button onClick={ () => removeQuery('book')}>remove search</button>
</div>;
}
```
// To know more on URLSearchParams from
[Mozilla:][1]
var paramsString = "q=URLUtils.searchParams&topic=api";
var searchParams = new URLSearchParams(paramsString);
//Iterate the search parameters.
for (let p of searchParams) {
console.log(p);
}
searchParams.has("topic") === true; // true
searchParams.get("topic") === "api"; // true
searchParams.getAll("topic"); // ["api"]
searchParams.get("foo") === null; // true
searchParams.append("topic", "webdev");
searchParams.toString(); // "q=URLUtils.searchParams&topic=api&topic=webdev"
searchParams.set("topic", "More webdev");
searchParams.toString(); // "q=URLUtils.searchParams&topic=More+webdev"
searchParams.delete("topic");
searchParams.toString(); // "q=URLUtils.searchParams"
[1]: https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams
私はあなたがES6
スタイルである以下の関数を使うのを好みます:
getQueryStringParams = query => {
return query
? (/^[?#]/.test(query) ? query.slice(1) : query)
.split('&')
.reduce((params, param) => {
let [key, value] = param.split('=');
params[key] = value ? decodeURIComponent(value.replace(/\+/g, ' ')) : '';
return params;
}, {}
)
: {}
};