Witam ponownie, niedawno napisałam zajawkę pytania, teraz rozwinę po całości.
Mam apkę, która pobiera z inputu ciąg, na podstawie tego ciągu pobiera zasób, na podstawie tego zasobu renderuje treść w ścieżce '/city'.
Niektóre fragmenty są wykomentowane, o nich będzie póxniej.
App.js: (fragment)
<Router>
<Search /*getPath= {getPath}*/ />
<Switch>
<Route exact path="/">
<StartPage />
</Route>
<Route path="/city">
{/* <Route path = {path}>*/}
<ContentPage />
</Route>
<Route path="/404">
<ErrorPage />
</Route>
</Switch>
</Router>
Ten router jest elegancko osadzony w providerze
ReactDOM.render(
<Provider store={store}>
{/* <GlobalStyle /> */}
<App />
</Provider>, document.getElementById('root'));
Pobieranie inputa realizowane jest przez komponent search zawierający linię
const redirectCities= ()=>{ console.log('ide do miasta'); history.push("/City");
Ta funkcja jest z niego wysyłana dalej o tak
const mapDispatchToProps = (dispatch) => ({
onSubmit: (data, failureFunction, successFunction) => dispatch(getWeather(data, failureFunction, successFunction)),
});
const Search = connect(mapStateToProps, mapDispatchToProps)(_Search);
Tworzona jest akcja związana z pobieraniem treści, jeżeli jest sukces
export function getWeather(city, redirectFailure, redirectSuccess) {
...
if (validate.weather(data)){
dispatch(getCityDataReceived(createResults.weather(data, city, redirectSuccess)));
}
Akcja idzie do Reducera i wszystko śmiga.
Natomiast założenie jest takie, aby ścieżka tworzyła się dynamicznie (tj. nie '/city' ale np. "/Kutno')
I tu zrobily się schody. Apka nie zawiera linków, a użycie params jest dobrze opisane, jeżeli przełączanie jest oparte na linku. Na razie wypróbowałam dwie metody obie z tym samym efektem - i owszem adres w pasku był własciwy, ale za to nie renderowała się treść - wręcz nie wyświetlało się to, co w switchu..
Pierwsza metoda:
W komponencie App utworzyłam hooka stanu
const [path, setPath] = useState("/city");
const getPath =(value)=>{setPath(value); console.log("from function", value)}
Zmodyfikował komponent Search tak, że przyjmuje propsa - w ten sposób, niezależnie od reduxa, ale działa i przekazuje
<Search getPath= {getPath} />
<Route path = {path}>
I to działa, ale jak napisałam, nie przekazuje treści, a nawet nie renderuje się nic poza komponentem search (czyli nic, co jest w switchu).
Drugie podejście to przepuszczenie funkcji redirectSuccess przez store, pobranie w propsach przez app i wykonanie (jako funkcja wywolywana przez hooka efektów (czyli po udate strony). Efekt dokładnie taki sam.
Macie pomysł jak to ugryźć? To moje pierwsze podejście do Reacta więc może jest coś super oczywistego, czego nie widzę. Jeszcze jedno podejście, które mi przysło do głowy, ale wygląda i brzmi rozpaczliwie to wygenerowanie niewidocznego elelemntu link i oprogramowanie go tak, żeby kliknięcie guzik submitu danych z inputa wywołało zdarzenie onclick tego linka (ale to brzmi jak krzyk rozpaczy).