Вы не должны использовать Link вне маршрутизатора с помощью response-router-dom

Я пытаюсь выполнить маршрутизацию с помощью response-router-dom. Я получил ошибку, как будто вы не должны использовать за пределами этого. Ниже я прикрепляю свой код, пожалуйста, проверьте.

index.js

import React from 'react'
import { render } from 'react-dom'
import { Provider } from 'react-redux'
import { createLogger } from 'redux-logger'
import App from './containers/App';




render(
  <Provider>
     <App/>
  </Provider>,
  document.getElementById('root')
)

App.js

import React from 'react';
import Dropdown from './dropdown';
import './styles.css';
import { BrowserRouter as Router, Switch, Route, Link } from 'react-router-dom';
import Home from './Home';
import Addatttemp from './Addatttemp';

const options = [
    {label: 'One' },
    {label: 'Two'},
    {label: 'Three'},
    {label: 'Four' }
]
const AgentValues=[
    {label: 'Add Att/temp', value:'Addatttemp' },
    {label: 'Mod prof LVL',value:'Modproflvl'},
    {label: 'Override Attr',value:'Overrideattr'},
    {label: 'Temp',value:'temp'}
]
const defaultOption = options[0]
export default class App extends React.Component {
    constructor (props) {
        super(props)
    }
    render() {
        return (
            <div>
                <div className="navbar">
                    <div className="align">
                        <div className="dropdown">
                            <Dropdown options={AgentValues} name='Agent'/>
                        </div>
                        <div className="dropdown">
                            <Dropdown options={options} name='Templete'/>
                        </div>
                        <div className="dropdown">
                            <Dropdown options={options} name='Report'/>
                        </div>
                        <div className="dropdown">
                            <Dropdown options={options} name='Search'/>
                        </div>
                    </div>
                </div>
                <Router>
                <Switch>
                    <Route exact path='/' component={Home} />
                    <Route exact path='/Agent/Addatttemp' component={Addatttemp} />
                </Switch>
            </Router>
            </div>
        );
    }
}

Dropdown.js

import React, { Component, PropTypes } from "react";
import { Link } from 'react-router-dom';

class dropdown extends Component {
    constructor (props) {
        super(props)
    }
    render(){
        var dropdownList = []
        this.props.options.map((res)=>{
            dropdownList.push(<Link to={'/'}>{res.label}</Link>)
        })
        return(
            <div>
                <button className="dropbtn"><Link to={'/'}>{this.props.name}</Link>
                </button>
                <div className="dropdown-content">
                    {dropdownList}
                </div>
            </div>
        )
    }
}


export default dropdown;

Home.js

import React from 'react'

const Home = () => (
    <div>
        <h1>Welcome to the Tornadoes Website!</h1>
    </div>
)

export default Home

Addatttemp.js

import React from 'react'

const AddTemp = () => (
    <div>
        <h1>Welcome to the Add att/temp!</h1>
    </div>
)

export default AddTemp

Вот так я написал свой код, но когда я запускаю этот код, он выдает ошибку типа Неперехваченная ошибка: вы не должны использовать ссылку вне маршрутизатора. Я не могу решить эту проблему, пожалуйста, дайте мне предложения о том, что я сделал не так, любая помощь очень ценится.


person Hussian Shaik    schedule 02.04.2018    source источник
comment
Похоже, вы вообще забыли использовать Router, кроме импорта BrowserRouter as Router. Вы пользуетесь линтером? Он должен предупредить вас о неиспользуемых переменных.   -  person Yury Tarabanko    schedule 02.04.2018
comment
@YuryTarabanko, спасибо за ответ, не могли бы вы его уточнить, пожалуйста, проверьте мой код и дайте мне предложения, где я ошибся   -  person Hussian Shaik    schedule 02.04.2018
comment
Следуя сообщению об ошибке, я предлагаю вам использовать Router :)   -  person Yury Tarabanko    schedule 02.04.2018


Ответы (2)


Как говорится в сообщении об ошибке, у вас нет Router вверх по дереву компонентов.

Вы можете использовать его в App компоненте, подобном этому

export default class App extends React.Component {
    render() {
        return (
            <Router>
              <div>
            <div className="navbar">
                <div className="align">
                    <div className="dropdown">
                        <Dropdown options={AgentValues} name='Agent'/>
                    </div>
                    <div className="dropdown">
                        <Dropdown options={options} name='Templete'/>
                    </div>
                    <div className="dropdown">
                        <Dropdown options={options} name='Report'/>
                    </div>
                    <div className="dropdown">
                        <Dropdown options={options} name='Search'/>
                    </div>
                </div>
            </div>
            <Switch>
                <Route exact path='/' component={Home} />
                <Route exact path='/Agent/Addatttemp' component={Addatttemp} />
            </Switch>
            </div>
          </Router>
        );
    }
}

Также

Вам не нужен конструктор, который просто вызывает super

// this is noop
constructor (props) {
    super(props)
}

При использовании map не нужно отправлять данные во внешний массив.

var dropdownList = this.props.options.map(res => (
   <Link to={'/'}>{res.label}</Link>
))
person Yury Tarabanko    schedule 02.04.2018
comment
Спасибо за ответ. В соответствии с вашим предложением я добавил маршрутизатор над переключателем в App.js, но получаю ту же ошибку. И я написал карту для выпадающего списка в файле dropdown.js - person Hussian Shaik; 02.04.2018
comment
@HussianShaik Не над переключателем, но прежде всего над всем контентом, включая заголовок с выпадающими списками. Все компоненты, относящиеся к маршрутизатору, включая (Link, Switch и т. Д.), Требуют предоставления router prop через context. Итак, вам нужно разместить Router (который заполняет контекст w / router) где-нибудь вверх по дереву компонентов. - person Yury Tarabanko; 02.04.2018
comment
не могли бы вы подсказать мне это в моем коде, где мне это делать. я борюсь с этим. - person Hussian Shaik; 02.04.2018
comment
@HussianShaik Я выложил почти полный код. Для начала вам нужно прочитать базовое руководство по реакции. - person Yury Tarabanko; 02.04.2018

Если вы пытаетесь отобразить Link на странице или любом элементе за пределами BrowserRouter, вы получите эту ошибку. В этом сообщении об ошибке говорится, что любой компонент, не являющийся дочерним по отношению к маршрутизатору, не может содержать какие-либо react-router-dom связанные компоненты.

Для эффективной разработки на React вам нужно изучить иерархию компонентов.

В вашем случае родительский компонент наверху иерархии - App, откуда мне знать? потому что вы сказали это прямо здесь, в своем index.js файле:

render(
  <Provider>
     <App/>
  </Provider>,
  document.getElementById('root')
)

Итак, при работе с react-router-dom следующим на диаграмме иерархии должен быть ваш BrowserRouter. Здесь вы начинаете терять меня и React, поскольку мы оба ищем BrowserRouter внутри вашего App компонента и не видим его.

Вот что мы должны видеть прямо сейчас:

const App = () => {
  return (
    <div className="ui container">
      <BrowserRouter>
        <div>
          <Route path="/" exact component={Home} />
          <Route path="/Agent/Addatttemp" exact component={Addattemp} />
        </div>
      </BrowserRouter>
    </div>
  );
};

Обратите внимание, что я использую ключевое слово exact? Я использую ключевое слово exact, чтобы случайно не сопоставить ни один из этих маршрутов, которые собираюсь реализовать.

Так что, пожалуйста, продолжайте и добавьте свой BrowserRouter или, в вашем случае, ваш Router, который действует как BrowserRouter выше в этой иерархии ниже App, он должен быть следующим по иерархии, все остальное является дочерним элементом этого BrowserRouter и должно входить в Это.

И поскольку вы никогда не собираетесь использовать Link из react-router-dom внутри вашего App компонента, продолжайте и очищайте его следующим образом:

import { BrowserRouter, Route } from "react-router-dom";

Как только вы выполните указанные выше действия, эта ошибка исчезнет.

person Daniel    schedule 16.03.2019