Кнопка реакции на странице перенаправления щелчка

Я работаю над веб-приложением, используя React и bootstrap. Когда дело доходит до применения кнопки onClick, мне трудно разрешить перенаправление моей страницы на другую. если после href, я не могу перейти на другую страницу.

Не могли бы вы сказать мне, есть ли необходимость в использовании реакции-навигации или чего-то еще для навигации по странице с помощью кнопки onClick?

import React, { Component } from 'react';
import { Button, Card, CardBody, CardGroup, Col, Container, Input, InputGroup, InputGroupAddon, InputGroupText, Row, NavLink  } from 'reactstrap';

class LoginLayout extends Component {

  render() {
    return (
 <div className = "app flex-row align-items-center">
        <Container>
     ...
                    <Row>
                      <Col xs = "6">                      
                        <Button color = "primary" className = "px-4">
                            Login
                         </Button>
                      </Col>
                      <Col xs = "6" className = "text-right">
                        <Button color = "link" className = "px-0">Forgot password?</Button>
                      </Col>
                    </Row>
               ...
        </Container>
      </div>
    );
  }
}

увидеть это stackoverflow.com/questions/31079081/…

aravind_reddy 01.06.2018 15:58
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
89
1
342 521
14
Перейти к ответу Данный вопрос помечен как решенный

Ответы 14

Простой обработчик щелчка по кнопке и настройка window.location.hash сделают свое дело, если ваш пункт назначения также находится в приложении.

Вы можете прослушать событие hashchange на window, проанализировать полученный URL, вызвать в this.setState(), и у вас будет собственный простой маршрутизатор библиотека не нужна.

class LoginLayout extends Component {
    constuctor() {
      this.handlePageChange = this.handlePageChange.bind(this);
      this.handleRouteChange = this.handleRouteChange.bind(this);
      this.state = { page_number: 0 }
    }

  handlePageChange() {
    window.location.hash = "#/my/target/url";
  }

  handleRouteChange(event) {
    const destination = event.newURL;
    // check the URL string, or whatever other condition, to determine
    // how to set internal state.
    if (some_condition) {
      this.setState({ page_number: 1 });
    }
  }

  componentDidMount() {
    window.addEventListener('hashchange', this.handleRouteChange, false);
  }

  render() {
    // @TODO: check this.state.page_number and render the correct page.
    return (
      <div className = "app flex-row align-items-center">
        <Container>
          ...
                <Row>
                  <Col xs = "6">                      
                    <Button 
                       color = "primary"
                       className = "px-4"
                       onClick = {this.handlePageChange}
                    >
                        Login
                     </Button>
                  </Col>
                  <Col xs = "6" className = "text-right">
                    <Button color = "link" className = "px-0">Forgot password </Button>
                  </Col>
                </Row>
           ...
        </Container>
      </div>
    );
  }
}

использование window.location не является предпочтительным для тех, кто хочет поддерживать какую-либо форму SPA (одностраничное приложение). Вы изменили URL-адрес браузера, удалили все состояния и т. д.

Acts7Seven 20.02.2019 21:42

Когда вы говорите «уничтожить любое государство», что конкретно вы имеете в виду? Я использую location.hash, который не вызывает перезагрузки страницы.

ouni 20.02.2019 21:47

Обновить:

React Router v5 с хуками:

import React from 'react';
import { useHistory } from "react-router-dom";
function LoginLayout() {

  const history = useHistory();

  const routeChange = () =>{ 
    let path = `newPath`; 
    history.push(path);
  }

  return (
      <div className = "app flex-row align-items-center">
        <Container>
          ...
          <Row>
            <Col xs = "6">                      
              <Button color = "primary" className = "px-4"
                onClick = {routeChange}
                  >
                  Login
                </Button>
            </Col>
            <Col xs = "6" className = "text-right">
              <Button color = "link" className = "px-0">Forgot password?</Button>
            </Col>
          </Row>
          ...
        </Container>
      </div>
  );
}
export default LoginLayout;

с React Router v5:

import { useHistory } from 'react-router-dom';
import { Button, Card, CardBody, CardGroup, Col, Container, Input, InputGroup, InputGroupAddon, InputGroupText, Row, NavLink  } from 'reactstrap';

class LoginLayout extends Component {

  routeChange=()=> {
    let path = `newPath`;
    let history = useHistory();
    history.push(path);
  }

  render() {
    return (
      <div className = "app flex-row align-items-center">
        <Container>
          ...
          <Row>
            <Col xs = "6">                      
              <Button color = "primary" className = "px-4"
                onClick = {this.routeChange}
                  >
                  Login
                </Button>
            </Col>
            <Col xs = "6" className = "text-right">
              <Button color = "link" className = "px-0">Forgot password?</Button>
            </Col>
          </Row>
          ...
        </Container>
      </div>
    );
  }
}

export default LoginLayout;

с React Router v4:

import { withRouter } from 'react-router-dom';
import { Button, Card, CardBody, CardGroup, Col, Container, Input, InputGroup, InputGroupAddon, InputGroupText, Row, NavLink  } from 'reactstrap';

class LoginLayout extends Component {
  constuctor() {
    this.routeChange = this.routeChange.bind(this);
  }

  routeChange() {
    let path = `newPath`;
    this.props.history.push(path);
  }

  render() {
    return (
      <div className = "app flex-row align-items-center">
        <Container>
          ...
          <Row>
            <Col xs = "6">                      
              <Button color = "primary" className = "px-4"
                onClick = {this.routeChange}
                  >
                  Login
                </Button>
            </Col>
            <Col xs = "6" className = "text-right">
              <Button color = "link" className = "px-0">Forgot password?</Button>
            </Col>
          </Row>
          ...
        </Container>
      </div>
    );
  }
}

export default withRouter(LoginLayout);

После использования приведенного выше кода я все еще на той же странице. Нужна ли мне дополнительная работа, кроме этой?

Rohit Sawai 09.12.2019 12:49

я полагаю, нет .. вы обернули свой компонент withRouter?

aravind_reddy 09.12.2019 12:58

Я обернул свой компонент withRouter. Он отлично работает, если я использую один ресурс, например. он работает для маршрута /MyProfile. Но это не сработало, когда я использовал /MyProfile/edit. Как я могу перенаправить на вложенный ресурс?

Rohit Sawai 09.12.2019 13:29

Можете ли вы добавить его в песочницу и предоставить мне ссылку, чтобы я мог лучше решить вашу проблему

aravind_reddy 09.12.2019 14:11

В версии 5.1.2 этого нельзя сделать с хуками. React Hook "useHistory" is called in function "routeChange" which is neither a React function component or a custom React Hook function. Edit: переместите const history = useHistory() за пределы обработчика, если вы столкнулись с этой проблемой.

carkod 07.05.2020 01:28

@carkod спасибо за отзыв обновил ответ !! с крючками ...

aravind_reddy 07.05.2020 07:32

та же ошибка Неверный вызов ловушки. Хуки могут быть вызваны только внутри тела функционального компонента. "При использовании React Router v5.

Johann 03.02.2021 22:12

Я пытался найти способ с помощью Redirect, но потерпел неудачу. Перенаправление onClick проще, чем мы думаем. Просто поместите следующий базовый JavaScript в свою функцию onClick, без обезьяньих дел:

window.location.href = "pagelink"

Внимание: это перезагрузит страницу.

James Poulose 22.03.2020 05:19

да, это противоречит цели использования реакции для создания одностраничного приложения, заставит весь ваш код реакции повторно отправить и т.д. и т.д. (такие вещи, как история, вероятно, будут сброшены)

E.Serra 13.11.2020 12:42
Ответ принят как подходящий

Не используйте кнопку как ссылку. Вместо этого используйте ссылку, стилизованную под кнопку.

<Link to = "/signup" className = "btn btn-primary">Sign up</Link>

Я получил ошибку, не уверен, связано ли это с ней, link is a void element tag and must neither have `children` nor use `dangerouslySetInnerHTML`.

Jason Liu 11.05.2021 22:47

Очень простой способ сделать это:

onClick = {this.fun.bind(this)}

и для функции:

fun() {
  this.props.history.push("/Home");
}

Finlay вам нужно импортировать с помощью Router:

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

и экспортировать как:

export default withRouter (comp_name);

Это можно сделать очень просто, вам не нужно использовать для этого другую функцию или библиотеку.

onClick = {event =>  window.location.href='/your-href'}

Внимание: это перезагрузит страницу.

James Poulose 22.03.2020 05:19

@JamesPoulose именно так! Какой рекомендуемый способ сделать это без перезагрузки всей страницы? Я про маршрутизацию по клику. Например, когда я нажимаю на значок деталей. заранее спасибо

Shahriar Rahman Zahin 05.09.2020 21:15

Это немного медленнее по сравнению с перехватом useHistory для функционального компонента. Перезагрузка может быть причиной

Rushikesh 01.01.2021 16:36

С React Router v5.1:

import {useHistory} from 'react-router-dom';
import React, {Component} from 'react';
import {Button} from 'reactstrap';
.....
.....
export class yourComponent extends Component {
    .....
    componentDidMount() { 
        let history = useHistory;
        .......
    }

    render() {
        return(
        .....
        .....
            <Button className = "fooBarClass" onClick = {() => history.back()}>Back</Button>

        )
    }
}

React Router v5.1.2:

import { useHistory } from 'react-router-dom';
const App = () => {
   const history = useHistory()
   <i className = "icon list arrow left"
      onClick = {() => {
        history.goBack()
   }}></i>
}

Я уже потерпел неудачу в строке «const history = useHistory ()» из-за «TypeError: Cannot read property« history »of undefined». Вы использовали что-нибудь от response-router-dom в своем index.js?

ostmond 24.01.2020 11:16

У меня также были проблемы с переходом к другому виду с помощью navlink.

Моя реализация была следующей и работает отлично;

<NavLink tag='li'>
  <div
    onClick = {() =>
      this.props.history.push('/admin/my- settings')
    }
  >
    <DropdownItem className='nav-item'>
      Settings
    </DropdownItem>
  </div>
</NavLink>

Оберните его в div, назначьте ему обработчик onClick. Используйте объект истории, чтобы отправить новое представление.

Сначала импортируйте его:

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

Затем в функции или классе:

const history = useHistory();

Наконец, вы помещаете его в функцию onClick:

<Button onClick = {()=> history.push("/mypage")}>Click me!</Button>

useHistory() от react-router-dom может решить вашу проблему

import React from 'react';
import { useHistory } from "react-router-dom";
function NavigationDemo() {
  const history = useHistory();
  const navigateTo = () => history.push('/componentURL');//eg.history.push('/login');

  return (
   <div>
   <button onClick = {navigateTo} type = "button" />
   </div>
  );
}
export default NavigationDemo;

Если все вышеперечисленные методы не работают, используйте что-то вроде этого:

    import React, { Component } from 'react';
    import { Redirect } from "react-router";
    
    export default class Reedirect extends Component {
        state = {
            redirect: false
        }
        redirectHandler = () => {
            this.setState({ redirect: true })
            this.renderRedirect();
        }
        renderRedirect = () => {
            if (this.state.redirect) {
                return <Redirect to='/' />
            }
        }
        render() {
            return (
                <>
                    <button onClick = {this.redirectHandler}>click me</button>
                    {this.renderRedirect()}
                </>
            )
        }
    }

если вы хотите перенаправить на маршрут по событию Click.

Просто сделай это

В функциональном компоненте

props.history.push('/link')

В компоненте класса

this.props.history.push('/link')

Пример:

<button onClick = {()=>{props.history.push('/link')}} >Press</button>

Проверено на:

реагировать-маршрутизатор-дом: 5.2.0,

реагировать: 16.12.0

Если вы уже создали класс для определения свойств вашей кнопки (если у вас уже есть класс кнопки), и вы хотите вызвать его в другом классе и связать его с другой страницей с помощью кнопки, созданной в этом новом классе, просто импортируйте вашу «кнопку» (или имя вашего класса кнопок) и используйте приведенный ниже код:

import React , {useState} from 'react';
import {Button} from '../Button';

function Iworkforbutton() {
const [button] = useState(true);

return (
    <div className='button-class'>
        {button && <Button onClick = {()=> window.location.href='/yourPath'}
            I am Button </Button>
    </div>
    )
}

export default Iworkforbutton

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