Saya menggunakan modul react-router versi terakhir, bernama react-router-dom, yang telah menjadi default saat mengembangkan aplikasi web dengan React. Saya ingin tahu cara melakukan pengalihan setelah permintaan POST. Saya telah membuat kode ini, tetapi setelah permintaan, tidak ada yang terjadi. Saya mengulas di web, tetapi semua data tentang versi sebelumnya dari router react, dan tidak dengan pembaruan terakhir.
Kode:
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
sumber
sumber
Redirect
tampak seperti JSX, bukan JS.Jawaban:
Anda harus menggunakan
setState
untuk menyetel properti yang akan merender di<Redirect>
dalamrender()
metode Anda .Misalnya
Anda juga dapat melihat contoh di dokumentasi resmi: https://reacttraining.com/react-router/web/example/auth-workflow
Karena itu, saya akan menyarankan Anda untuk menempatkan panggilan API di dalam layanan atau sesuatu. Kemudian Anda bisa menggunakan
history
objek untuk merutekan secara terprogram. Beginilah cara kerja integrasi dengan redux .Tapi saya rasa Anda punya alasan untuk melakukannya dengan cara ini.
sumber
put the API call inside a service or something
?componentDidMount
. Atau lebih baik lagi, buat HOC yang "membungkus" API Anda.Redirect
memanggilhistory.replace
. Jika Anda ingin mengakseshistory
objek, gunakanwithRoutet
/Route
.react-router
> = 5.1 sekarang termasuk hook, jadi Anda bisaconst history = useHistory(); history.push("/myRoute")
Berikut contoh kecil sebagai tanggapan atas judul karena semua contoh yang disebutkan rumit menurut saya dan juga yang resmi.
Anda harus tahu cara memindahkan es2015 serta membuat server Anda dapat menangani pengalihan. Berikut ini cuplikan untuk ekspres. Info lebih lanjut terkait hal ini dapat ditemukan di sini .
Pastikan untuk meletakkan ini di bawah semua rute lainnya.
Ini adalah file .jsx. Perhatikan bagaimana jalur terpanjang didahulukan dan get lebih umum. Untuk rute yang paling umum, gunakan atribut yang tepat.
sumber
home/hello
>home/hello/1
tetapi kemudian pergi kehome/hello
dan tekan enter, itu tidak akan mengalihkan pertama kali. ada ide kenapa ??Cukup panggil di dalam fungsi apa pun yang Anda suka.
sumber
React Router v5 sekarang memungkinkan Anda untuk mengarahkan ulang menggunakan history.push () berkat hook useHistory () :
sumber
Cobalah sesuatu seperti ini.
sumber
Alternatifnya, Anda bisa menggunakan
withRouter
. Anda bisa mendapatkan akses kehistory
properti obyek dan yang paling dekat<Route>
'smatch
melaluiwithRouter
komponen tingkat tinggi.withRouter
akan meneruskan updatematch
,,location
danhistory
props ke komponen yang dibungkus setiap kali dirender.Atau hanya:
sumber
Anda dapat menulis hoc untuk tujuan ini dan menulis pengalihan panggilan metode, berikut kodenya:
sumber
Untuk menavigasi ke halaman lain (Tentang halaman dalam kasus saya), saya menginstal
prop-types
. Kemudian saya mengimpornya di komponen yang sesuai. Dan saya menggunakanthis.context.router.history.push('/about')
. Dan . Dan itu dinavigasi.Kode saya adalah,
sumber
Untuk menavigasi ke komponen lain yang dapat Anda gunakan
this.props.history.push('/main');
sumber
Warning: Cannot update during an existing state transition (such as within
render). Render methods should be a pure function of props and state.
Solusi paling sederhana untuk menavigasi ke komponen lain adalah (Contoh menavigasi ke komponen email dengan mengklik ikon):
sumber
Alternatifnya, Anda dapat menggunakan React conditional rendering.
sumber