Używam ostatniej wersji modułu React-router, o nazwie React-router-dom, który stał się domyślnym narzędziem podczas tworzenia aplikacji internetowych w React. Chcę wiedzieć, jak wykonać przekierowanie po żądaniu POST. Robiłem ten kod, ale po prośbie nic się nie dzieje. Przeglądam w sieci, ale wszystkie dane dotyczą poprzednich wersji routera reagującego, a nie z ostatnią aktualizacją.
Kod:
import React, { PropTypes } from 'react';
import ReactDOM from 'react-dom';
import { BrowserRouter } from 'react-router-dom';
import { Redirect } from 'react-router'
import SignUpForm from '../../register/components/SignUpForm';
import styles from './PagesStyles.css';
import axios from 'axios';
import Footer from '../../shared/components/Footer';
class SignUpPage extends React.Component {
constructor(props) {
super(props);
this.state = {
errors: {},
client: {
userclient: '',
clientname: '',
clientbusinessname: '',
password: '',
confirmPassword: ''
}
};
this.processForm = this.processForm.bind(this);
this.changeClient = this.changeClient.bind(this);
}
changeClient(event) {
const field = event.target.name;
const client = this.state.client;
client[field] = event.target.value;
this.setState({
client
});
}
async processForm(event) {
event.preventDefault();
const userclient = this.state.client.userclient;
const clientname = this.state.client.clientname;
const clientbusinessname = this.state.client.clientbusinessname;
const password = this.state.client.password;
const confirmPassword = this.state.client.confirmPassword;
const formData = { userclient, clientname, clientbusinessname, password, confirmPassword };
axios.post('/signup', formData, { headers: {'Accept': 'application/json'} })
.then((response) => {
this.setState({
errors: {}
});
<Redirect to="/"/> // Here, nothings happens
}).catch((error) => {
const errors = error.response.data.errors ? error.response.data.errors : {};
errors.summary = error.response.data.message;
this.setState({
errors
});
});
}
render() {
return (
<div className={styles.section}>
<div className={styles.container}>
<img src={require('./images/lisa_principal_bg.png')} className={styles.fullImageBackground} />
<SignUpForm
onSubmit={this.processForm}
onChange={this.changeClient}
errors={this.state.errors}
client={this.state.client}
/>
<Footer />
</div>
</div>
);
}
}
export default SignUpPage;
javascript
reactjs
react-router
maoooricio
źródło
źródło
Redirect
wygląd przypomina JSX, a nie JS.Odpowiedzi:
Musisz użyć,
setState
aby ustawić właściwość, która będzie renderować<Redirect>
wnętrze twojejrender()
metody.Na przykład
Możesz również zobaczyć przykład w oficjalnej dokumentacji: https://reacttraining.com/react-router/web/example/auth-workflow
To powiedziawszy, sugerowałbym, abyś umieścił wywołanie API wewnątrz usługi lub czegoś takiego. Wtedy możesz po prostu użyć
history
obiektu do programowego trasowania. Tak działa integracja z Reduxem .Ale myślę, że masz swoje powody, by to zrobić w ten sposób.
źródło
put the API call inside a service or something
?componentDidMount
. Albo jeszcze lepiej, utwórz HOC, który „otacza” Twoje API.Redirect
dzwonihistory.replace
. Jeśli chcesz uzyskać dostęp dohistory
obiektu, użyjwithRoutet
/Route
.react-router
> = 5.1 zawiera teraz haki, więc możesz po prostuconst history = useHistory(); history.push("/myRoute")
Tutaj mały przykład jako odpowiedź na tytuł, jak wszystkie wspomniane przykłady, jest moim zdaniem skomplikowany, podobnie jak ten oficjalny.
Powinieneś wiedzieć, jak przetransponować es2015, a także umożliwić serwerowi obsługę przekierowania. Oto fragment kodu ekspresowego. Więcej informacji na ten temat można znaleźć tutaj .
Pamiętaj, aby umieścić to poniżej wszystkich innych tras.
To jest plik .jsx. Zwróć uwagę, że najdłuższa ścieżka jest pierwsza, a get jest bardziej ogólna. W przypadku najbardziej ogólnych tras użyj dokładnego atrybutu.
źródło
home/hello
>,home/hello/1
ale przejdź dohome/hello
i naciśnij klawisz Enter, nie przekieruje za pierwszym razem. jakieś pomysły, dlaczego?Po prostu nazwij to w ramach dowolnej funkcji.
źródło
React Router v5 umożliwia teraz po prostu przekierowanie przy użyciu history.push () dzięki hookowi useHistory () :
źródło
Spróbuj czegoś takiego.
źródło
Alternatywnie możesz użyć
withRouter
. Możesz uzyskać dostęp dohistory
właściwości obiektu i najbliższymi<Route>
„smatch
za pośrednictwemwithRouter
komponentu wyższego rzędu.withRouter
przekaże zaktualizowanematch
,location
ihistory
props do opakowanego komponentu za każdym razem, gdy będzie renderowany.Lub tylko:
źródło
możesz w tym celu napisać hoc i napisać przekierowanie wywołania metody, oto kod:
źródło
Aby przejść do innej strony (strona Informacje w moim przypadku), zainstalowałem
prop-types
. Następnie importuję go do odpowiedniego komponentu i użyłemthis.context.router.history.push('/about')
. I jest nawigowany.Mój kod to
źródło
Aby przejść do innego komponentu, którego możesz użyć
this.props.history.push('/main');
źródło
Warning: Cannot update during an existing state transition (such as within
render). Render methods should be a pure function of props and state.
Najprostszym sposobem na przejście do innego komponentu jest (Przykład przechodzi do komponentu mails po kliknięciu ikony):
źródło
Alternatywnie możesz użyć renderowania warunkowego React.
źródło