Я использую последнюю версию модуля response-router с именем response-router-dom, который стал по умолчанию при разработке веб-приложений с React. Я хочу знать, как сделать перенаправление после запроса POST. Я делал этот код, но после запроса ничего не происходит. Я просматриваю в Интернете, но все данные относятся к предыдущим версиям реактивного маршрутизатора, а не к последнему обновлению.
Код:
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
источник
источник
Redirect
выглядит как JSX, а не JS.Ответы:
Вы должны использовать
setState
для установки свойства, которое будет отображать<Redirect>
внутри вашегоrender()
метода.Например
Вы также можете увидеть пример в официальной документации: https://reacttraining.com/react-router/web/example/auth-workflow
Тем не менее, я бы посоветовал вам поместить вызов API в службу или что-то в этом роде. Тогда вы могли бы просто использовать
history
объект для программной маршрутизации. Так работает интеграция с redux .Но я думаю, у вас есть причины поступать так.
источник
put the API call inside a service or something
?componentDidMount
. Или, что еще лучше, создайте HOC, который «обернет» ваш API.Redirect
звонитhistory.replace
. Если вам нужен доступ кhistory
объекту, используйтеwithRoutet
/Route
.react-router
> = 5.1 теперь включает хуки, так что вы можете простоconst history = useHistory(); history.push("/myRoute")
Вот небольшой пример в ответ на заголовок, поскольку все упомянутые примеры, на мой взгляд, сложны так же, как и официальный.
Вы должны знать, как транспилировать es2015, а также сделать так, чтобы ваш сервер мог обрабатывать перенаправление. Вот отрывок для экспресс. Более подробную информацию об этом можно найти здесь .
Не забудьте поставить это под всеми другими маршрутами.
Это файл .jsx. Обратите внимание, как самый длинный путь идет первым и становится более общим. Для наиболее общих маршрутов используйте точный атрибут.
источник
home/hello
>,home/hello/1
но затем перейдитеhome/hello
и нажмите Enter, перенаправление не произойдет в первый раз. какие идеи почему ??Просто вызовите его внутри любой функции, которая вам нравится.
источник
React Router v5 теперь позволяет вам просто перенаправлять с помощью history.push () благодаря хуку useHistory () :
источник
Попробуйте что-нибудь подобное.
источник
В качестве альтернативы вы можете использовать
withRouter
. Вы можете получить доступ кhistory
свойствам объекта и ближайшим<Route>
«сmatch
черезwithRouter
компоненты более высокого порядка.withRouter
будет передавать обновленныеmatch
,location
иhistory
свойства обернутому компоненту при каждом рендеринге.Или просто:
источник
вы можете написать hoc для этой цели и написать перенаправление вызова метода, вот код:
источник
Для перехода на другую страницу (в моем случае - «О странице») я установил
prop-types
. Затем я импортирую его в соответствующий компонент и использую.this.context.router.history.push('/about')
И он получает навигацию.Мой код,
источник
Для перехода к другому компоненту вы можете использовать
this.props.history.push('/main');
источник
Warning: Cannot update during an existing state transition (such as within
render). Render methods should be a pure function of props and state.
Самым простым решением для перехода к другому компоненту является (Пример позволяет перейти к компоненту почты, щелкнув значок):
источник
В качестве альтернативы вы можете использовать условный рендеринг React.
источник