Как использовать редирект в новом react-router-dom Reactjs
Я использую последнюю версию react-router модуль, названный react-router-dom, который стал по умолчанию для разработки веб-приложений. Я хочу знать, как сделать перенаправление после запроса POST. Я делал этот код, но после запроса ничего не происходит. Я просматриваю в интернете, но все данные касаются предыдущих версий маршрутизатора react, а не с последним обновлением.
код:
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;
6 ответов:
вы должны использовать
setState
чтобы установить свойство, которое будет отображать<Redirect>
внутриrender()
метод.например.
class MyComponent extends React.Component { state = { redirect: false } handleSubmit () { axios.post(/**/) .then(() => this.setState({ redirect: true })); } render () { const { redirect } = this.state; if (redirect) { return <Redirect to='/somewhere'/>; } return <RenderYourForm/>; }
вы также можете увидеть пример в официальной документации: https://reacttraining.com/react-router/web/example/auth-workflow
тем не менее, я бы предложил вам поместить вызов API внутри службы или что-то в этом роде. Тогда вы могли бы просто использовать
history
объект для маршрутизации программно. Это как интеграция с redux строительство.но я думаю, у вас есть свои причины делать это таким образом.
вот небольшой пример в качестве ответа на название, поскольку все упомянутые примеры сложны, на мой взгляд, а также официальный.
вы должны знать, как транспилировать es2015, а также сделать ваш сервер в состоянии обрабатывать перенаправление. Вот фрагмент для express. Более подробную информацию об этом можно найти здесь.
убедитесь, что это ниже всех других маршрутов.
const app = express(); app.use(express.static('distApp')); /** * Enable routing with React. */ app.get('*', (req, res) => { res.sendFile(path.resolve('distApp', 'index.html')); });
Это .файл jsx. Обратите внимание, как приходит самый длинный путь сначала и получить более общий. Для наиболее общих маршрутов используйте точный атрибут.
// Absolute imports import React from 'react'; import ReactDOM from 'react-dom'; import { BrowserRouter, Route, Switch, Redirect } from 'react-router-dom'; // Relative imports import YourReactComp from './YourReactComp.jsx'; const root = document.getElementById('root'); const MainPage= () => ( <div>Main Page</div> ); const EditPage= () => ( <div>Edit Page</div> ); const NoMatch = () => ( <p>No Match</p> ); const RoutedApp = () => ( <BrowserRouter > <Switch> <Route path="/items/:id" component={EditPage} /> <Route exact path="/items" component={MainPage} /> <Route path="/yourReactComp" component={YourReactComp} /> <Route exact path="/" render={() => (<Redirect to="/items" />)} /> <Route path="*" component={NoMatch} /> </Switch> </BrowserRouter> ); ReactDOM.render(<RoutedApp />, root);
попробуйте что-то вроде этого.
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: {}, callbackResponse: null, 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 }); } 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({ callbackResponse: {response.data}, }); }).catch((error) => { const errors = error.response.data.errors ? error.response.data.errors : {}; errors.summary = error.response.data.message; this.setState({ errors }); }); } const renderMe = ()=>{ return( this.state.callbackResponse ? <SignUpForm onSubmit={this.processForm} onChange={this.changeClient} errors={this.state.errors} client={this.state.client} /> : <Redirect to="/"/> )} render() { return ( <div className={styles.section}> <div className={styles.container}> <img src={require('./images/lisa_principal_bg.png')} className={styles.fullImageBackground} /> {renderMe()} <Footer /> </div> </div> ); } } export default SignUpPage;
"react": "^16.3.2", "react-dom": "^16.3.2", "react-router-dom": "^4.2.2"
для перехода на другую страницу (страница в моем случае), я установил
prop-types
. Затем я импортирую его в соответствующий компонент.И я использовалthis.context.router.history.push('/about')
.И он получает навигацию.мой код,
import React, { Component } from 'react'; import '../assets/mystyle.css'; import { Redirect } from 'react-router'; import PropTypes from 'prop-types'; export default class Header extends Component { viewAbout() { this.context.router.history.push('/about') } render() { return ( <header className="App-header"> <div className="myapp_menu"> <input type="button" value="Home" /> <input type="button" value="Services" /> <input type="button" value="Contact" /> <input type="button" value="About" onClick={() => { this.viewAbout() }} /> </div> </header> ) } } Header.contextTypes = { router: PropTypes.object };
для перехода к другому компоненту, вы можете использовать
this.props.history.push('/main');
import React, { Component, Fragment } from 'react' class Example extends Component { redirect() { this.props.history.push('/main') } render() { return ( <Fragment> {this.redirect()} </Fragment> ); } } export default Example