Как перенаправить на новую страницу из функции в React?

Прямо сейчас у меня есть эта функция, и я использую ее, чтобы вернуться к входу в систему, а также для проверки сброса значения localStorage, для которого я использую функцию, а с тех пор, как с ее помощью я не могу сбросить значение локального хранилища. Функция ниже: -

logout(){
    localStorage.clear();
    console.info("cliasdk");
    return(
        <Redirect to = "/login"/>
    )
  }

Это выполняется при нажатии на div, но я не могу перейти на страницу / login. Как это сделать?

Похожий
Anurag Awasthi 11.06.2018 10:26
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
18
1
59 313
13

Ответы 13

logout(){
    localStorage.clear();
    this.setState({redirect: true})
  }

//inside Render
render(){
    const {redirect} = this.state;
   if (redirect){
    return <Redirect push to = "/login"/> 
}
}

это единственный способ сделать это? Я пробовал это уже в других местах

hearty 11.06.2018 10:20

вы также можете добавить <Link /> к кнопке выхода.

Deee 11.06.2018 10:23

Вы можете использовать переменную истории в реквизитах или, если у них нет истории в реквизитах, вы можете использовать withRouter HOC (https://reacttraining.com/react-router/web/api/withRouter)

history.push("/login") 

или же

history.replace("/login")

Если вы используете пакет react-router-dom, вы можете обернуть свой компонент маршрутизатором, и тогда у вас будет возможность программно перенаправить пользователя, например this.props.history.push('/login').

Например:

import {withRouter} from 'react-router-dom';

class Component extends React.component {

    constructor(props){

    }

    componentDidMount(){
        this.props.history.push('/login');
    }

}

export default withRouter(Component);

См .: https://www.npmjs.com/package/react-router-dom.

Вы можете изменить маршрут программно с такой историей:

export default class Logout extends Component {
  logout = () => {
    this.props.history.push("login");
  };

  render() {
    return (
      <div>
        <h1>Logout</h1>
        <button onClick = {this.logout}>Logout</button>
      </div>
    );
  }
}

Если вам нужен localStorage.clear();, просто введите его в функцию выхода. Вы можете увидеть полный (рабочий) пример кода здесь: https://codesandbox.io/s/py8w777kxj

Вам нужно импортировать Redirect из react-router-dom, например:

import { Redirect } from 'react-router-dom';

Это не имеет ничего общего с вопросом, ничто не означает, что OP уже не импортировал. Я знаю, потому что у меня такая же проблема, а не импорт.

MattSom 28.11.2020 20:24

вы можете использовать этот пример для перенаправления после рендеринга функции

import React from 'react';
import { Redirect } from 'react-router-dom';

class MyComponent extends React.Component {
  state = {
    redirect: false
  }
  setRedirect = () => {
    this.setState({
      redirect: true
    })
  }
  renderRedirect = () => {
    if (this.state.redirect) {
      return <Redirect to='/target' />
    }
  }
  render () {
    return (
       <div>
        {this.renderRedirect()}
        <button onClick = {this.setRedirect}>Redirect</button>
       </div>
    )
  }
}

Для справки в будущем, если вы не заинтересованы в использовании React Router, вы можете попробовать то же самое, что я использую прямо сейчас, который использует местоположение браузера (URL):

logout(){
    // stuff...
    location.href = "/login/"
  }

Если вы пытаетесь выйти из приложения React (которое использует шаблон URL /#/page) через функцию очистки локального хранилища / перенаправления, попробуйте использовать go:

import { createHashHistory } from "history";

const history = createHashHistory();

history.go("/login");

go загружает конкретный URL из списка истории, его можно использовать для возврата в историю, а также для продолжения, в этом случае «вперед» будет использовать /login и абсолютный путь для перенаправления.

Обновлять

На React Router 6 вы можете использовать useNavigate для программной навигации.

Попробуй это


import React from "react";
const createHistory = require("history").createBrowserHistory;

class Logout extends React.Component {
    constructor(props) {
        super(props);
        let history = createHistory();
        history.push("/login");
        let pathUrl = window.location.href;
        window.location.href = pathUrl;   

    }

    render() {

        return (
            <div>
            </div>
        );
    }
}

export default Logout;

очень хорошее решение для структуры «экспорт функций по умолчанию». Большое спасибо :)

kira 29.03.2020 20:23

Со всеми предыдущими ответами я опишу здесь этот вариант использования:

on `/login` page, I would like to go to `/` when login is OK:

Добавить импорт:

import { Redirect } from 'react-router-dom';

Добавьте в состояние вашего компонента по умолчанию перенаправление на false:

state = {
  redirect: false,
}

Добавьте в свою бизнес-логику (например, onLoginOk()) изменение состояния перенаправления

this.setState({ redirect: true })

Добавьте где-нибудь в корневой элемент render:

 { this.state.redirect ? (<Redirect push to = "/"/>) : null }

Вот и все.

Как насчет функциональности? Вы не отвечаете на вопрос. Вопрос по функциям, а не по классам, лол?

Edison Pebojot 21.03.2021 04:14

@EdisonPebojot, вы также можете добавить свою собственную бизнес-логику, используя мой образец: в дополнение к обновлению состояния в вашей функции «onLoginOk» вы можете добавить другие директивы. С другой стороны, вы могли бы избежать использования промежуточного состояния, вызвав напрямую window.location.href= '/';.

boly38 21.03.2021 13:18

В React router 6 перенаправление выглядит так:

const navigate = useNavigate();
const goToLoginPage = () => navigate('/login');

Весь код можно увидеть здесь: https://github.com/anmk/redirect/blob/redirect/src/App.js

Вы также можете написать компонент для этого: https://github.com/anmk/redirect/tree/redirect_to_component

Это самый простой вариант, если вы не хотите иметь дело с response-router-dom.
Вот пример, написанный в функциональных компонентах React

const Page = () => {
   const redirect = () => {
      window.location.href = '/anotherPagePath'
   }
   return (
      <button onClick = {redirect}>go to another page</button>
   )
}
import React from "react"
import { useHistory } from "react-router-dom";

export const Component = ( props ) => {
  const history = useHistory()
  const handler = () => {
    //Redirect to another route
    history.push("/route-link") 
  }
}

Может это то, что вы ищете.

Другие вопросы по теме