2016-10-20 13 views
21

Pomocna wskazówka Stackoverflow mówi, że pytanie, które zadaję, wydaje się subiektywne i prawdopodobnie zostanie zamknięte. Nie jestem pewien dlaczego. Nie mogę znaleźć sposobu aktualizowania parametrów zapytania za pomocą routera reagującego bez użycia <Link/>. hashHistory.push (url) nie wydaje się rejestrować parametrów zapytań i nie wydaje się, że możesz przekazać obiekt zapytania lub cokolwiek jako drugi argument.Jak programowo aktualizować parametry zapytania w routerze reagowania?

Jak zmienić adres URL z "/ shop/Clothes/dresses" na "/ shop/Clothes/dresses? Color = blue" w routerze reakcyjnym bez użycia <Link>?

Czy funkcja onChange jest jedynym sposobem na wykrycie zmian w zapytaniu? Dlaczego zmiany zapytania nie są automatycznie wykrywane i reagowane na zmiany w parametrach?

+0

należy używać historii singleton, o których mowa w tym pytaniu [] (http://stackoverflow.com/questions/31079081/programmatically-navigate-using-react-router) –

Odpowiedz

26

W ramach metody push pod numerem hashHistory można podać parametry zapytania. Na przykład,

history.push({ 
    pathname: '/dresses', 
    search: '?color=blue' 
}) 

lub

history.push('/dresses?color=blue') 

Możesz sprawdzić to repository dodatkowe przykłady dotyczące korzystania history

+1

niesamowite! Czy mimo to można przekazać obiekt zapytania {color: blue, size: 10} zamiast ciągu? – claireablani

+1

@claireablani Obecnie, nie sądzę, że jest obsługiwany –

+0

w porządku - czy wiesz, czy zwyczajowo po prostu stringify obiektu zapytania, a następnie przed wywołaniem hashHistory push? – claireablani

1

Od DimitriDushkin on GitHub:

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); 
}; 

lub

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); 
+1

To już nie działa w 'React-Rout' v4. – Neil

13

Przykład użycia pakietu reaktor-router v4, redux-thunk i re- agent-router-redux (5.0.0-alpha.6).

Gdy użytkownik korzysta z funkcji wyszukiwania, chcę, aby mógł wysłać link do tego samego zapytania do kolegi.

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 
    })) 
} 
Powiązane problemy