Ссылка с роутера обновляет всю страницу, когда не должна

У меня небольшая проблема с React Router, когда я нахожусь в своем первом компоненте под названием WebsiteLoad, все кажется в порядке, но когда я нажимаю <Link />, он обновляет всю страницу для загрузки /portfolio, когда мне просто нужно, чтобы он отображал соответствующие указанные компоненты. к React-маршрутизатору.

Это мой код в WebsiteLoad.js:

import React,{Component} from 'react'
import {Link} from 'react-router-dom'
import Hero from './Home/Hero'

class WebsiteLoad extends Component{
    render(){
      window.initDogma()
        return(
            <div id = "wrapper">
  <div className = "content-holder elem scale-bg2   no-padding">
    <div className = "dynamic-title">Services</div>
    <div className = "content full-height no-padding home-content ">
      <div className = "full-height-wrap">
        <Hero />
        <div className = "overlay" />
        <div className = "enter-wrap-holder cent-holder wht-bg">
          <div className = "enter-wrap">
            <h3>
              <img src = "private_source" alt = "Habitare logo" />
            </h3>
            <Link to = "/portfolio" replace = "false" className = "ajax btn anim-button trans-btn transition ">
              <span>Todos los desarrollos</span>
              <i className = "fa fa-long-arrow-right" />
            </Link>
          </div>
        </div>
      </div>
    </div>
  </div>
</div>

        );
    }
}
export default WebsiteLoad;

И мой RouterConfig.js:

import React from 'react'
import { BrowserRouter as Router, Route } from 'react-router-dom'
import WebsiteLoad from './WebsiteLoad'
import Portfolio from './Portfolio'

function RouteConfigExample() {
  return(
    <Router>
        <Route exact path = "/" component = {WebsiteLoad} />
        <Route path = "/portfolio" component = {Portfolio} />
    </Router>
  )
}

export default RouteConfigExample;

И код внутри Portfolio.js:

import React, {Component} from 'react'
import Header from './Header'
import SubNav from './SubNav'

class Portfolio extends Component{

    Project = (data = []) =>{
        return (
            <div key = {data} className = "gallery-item houses apartments">
                <div className = "grid-item-holder">
                    <div className = "box-item">
                    <div className = "wh-info-box">
                        <div className = "wh-info-box-inner at">
                        <a href = "portfolio-single.html" className = "ajax">
                            Modern house
                        </a>
                        <span className = "folio-cat">Houses design</span>
                        </div>
                    </div>
                    <img src = "images/folio/thumbs/27.jpg" alt = "Alt" />
                    </div>
                </div>
            </div>
        );
    }

    loadProjects = () =>{
        var Projects = []
        for(var c=0;c<4;c++)
            Projects.push(this.Project(c))
        return Projects
    }

    render(){
        return(
            <div>
                <Header />
                <SubNav />
                <div id = "wrapper">
  <div className = "content-holder elem scale-bg2 transition3">
    <div className = "content ">
      <section className = "no-padding no-border">
        <div className = "filter-holder filter-nvis-column">
          <div className = "gallery-filters at">
            <button
              href = "#"
              className = "gallery-filter gallery-filter-active"
              data-filter = "*"
            >
              All
            </button>
            <button
              href = "#"
              className = "gallery-filter "
              data-filter = ".houses"
            >
              Houses
            </button>
            <button
              href = "#"
              className = "gallery-filter"
              data-filter = ".interior"
            >
              Interior
            </button>
            <button
              href = "#"
              className = "gallery-filter"
              data-filter = ".apartments"
            >
              Apartments
            </button>
          </div>
        </div>
        <div className = "filter-button vis-fc">Filter</div>
        <div className = "gallery-items   hid-port-info" >
            {this.loadProjects()}
        </div>
      </section>
    </div>
  </div>
</div>
</div>

        );
    }
}
export default Portfolio

Как я могу заставить React-Router загружать соответствующие компоненты, сохраняя его «одностраничным веб-сайтом», вместо отправки совершенно нового HTTP-запроса?

РЕДАКТИРОВАТЬ

Я добавляю репо с проблемой и рабочей средой, чтобы вы могли воспроизвести проблему. Я все еще ищу исправление, но безрезультатно.

Вот репо: https://github.com/k3llydev/hi_website/tree/react-router-issue

Вот среда приложения: https://hi-website.herokuapp.com

для чего вы используете window.initDogma()?

vitomadio 08.04.2019 20:25

@vitomadio Это вызов внешней функции JavaScript.

k3llydev 08.04.2019 20:33
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
2
246
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы не используете Switch из react-roter-dom в своем коде

Измените файл RouterConfig.js следующим образом.

import React from 'react'
import { Route, Switch, BrowserRouter as Router } from 'react-router-dom';
import WebsiteLoad from './WebsiteLoad'
import Portfolio from './Portfolio'

function RouteConfigExample() {
  return(
    <Router>
      <Switch>
        <Route exact path = "/" component = {WebsiteLoad} />
        <Route path = "/portfolio" component = {Portfolio} />
     </Switch>
    </Router>
  )
}

export default RouteConfigExample;

Спасибо, я не знал, что Switch тоже нужен, где его использовать? Поскольку он говорит, что он все еще не используется в моей консоли разработчика. Где я должен использовать Switch?

k3llydev 08.04.2019 20:38

Можете ли вы поделиться соответствующим кодом из компонента профиля?

vitomadio 08.04.2019 20:42

Я отредактировал и добавил код внутри Portfolio.js @vitomadio

k3llydev 08.04.2019 20:45

Вы должны обернуть все компоненты коммутатором внутри маршрутизатора. Обновлен мой ответ, пожалуйста, проверьте @k3lly.dev

Sumanth Madishetty 08.04.2019 21:12

Можете ли вы создать и поделиться минимальным воспроизводящимся репозиторием?

Sumanth Madishetty 09.04.2019 05:05

Исправление пока не нашел :(

k3llydev 09.04.2019 18:40

@ k3lly.dev Я клонировал ваш репозиторий и проверил, но он не перезагружается .. Каковы ваши требования?

Sumanth Madishetty 09.04.2019 19:06

Проблема в том, что, поскольку что-то перезагружается или вызывается AJAX, мой портфель не загружается. Вы можете понять, что я имею в виду под перезагрузкой /портфолио, когда вы этим занимаетесь. Также возвращаемся в историю браузера к корневому каталогу.

k3llydev 09.04.2019 19:11
Ответ принят как подходящий

Исправить

При импорте HTML-шаблонов в React, что является одной из наших задач, когда мы работаем на кого-то другого, вы должны убедиться, что:

First understand the working environment around the template and its JavaScript code.

Я нашел решение проблемы, просто удалив простой класс ajax в своих элементах, чтобы предотвратить перезагрузку сайта.

А затем добавление вызова функции JavaScipt шаблона внутри моей функции обратного вызова в функции setState(). (Когда документ загрузился.)

componentDidMount(){
    this.setState({
        example: value
    },function(){
        window.initDogma()
    })
}

Это все исправило. Надеюсь, это поможет кому-то еще в будущем!

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