Проблема с LinkContainer в React-Bootstrap

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


Я получаю следующую ошибку: «Ошибка: не удалось выполнить инвариант: не следует использовать <withRouter (LinkContainer) /> за пределами». Я уже искал решение и в другом вопросе о переполнении стека, который кто-то написал в качестве ответа, я должен поместить свои компоненты, которые находятся в моем App.js, в маршрутизатор, но когда я это сделаю, я получаю следующую ошибку: «Ошибка: React Ожидается, что .Children получит только один дочерний элемент React ". (div - это потому, что кто-то сказал, что это будет «решение» последней проблемы.

App.js:

      import logo from './logo.svg';
import Header from './Components/header.js';
import Routings from './Components/Routings.js';
import SessionStorage from './API/sessionstorage.js';
import Login from './Components/login.js'
import {BrowserRouter as Router} from 'react-router-dom';
import './App.css';

function App() {
 let href = ((window.location.href == 'http://localhost:3000/login') || (window.location.href == 'http://localhost:3000/register'));
 let component1;
 if(!href) component1 = <Header/>


  return (
    <Router>
      <div>
        <SessionStorage/>
        {/* {component1} */}
        {component1}
         <Routings/>
         </div>
    </Router>
  );
}

export default App;

index.js:

      import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
import {Container, Card, Button, Alert, CardGroup, CardDeck, FormControl, Form} from 'react-bootstrap';
import {getMovies2} from './API/callAPI';
import reactDom from 'react-dom';
import { isCompositeComponentWithType } from 'react-dom/test-utils';
import 'bootstrap/dist/css/bootstrap.min.css';
import testpicture from './imgs/maxresdefault.jpg';
import Movies from './Components/movies';


class RenderMovies extends React.Component {
  constructor(props) {
    super(props);
    this.state = {arr: [], arrTitle: [], renderedOutput: [], lastsearch: {value: '', succeed: true}};
    this.handleChange = this.handleChange.bind(this);
  }

  componentDidMount() {
    this.props.movies.then((movies) => {
      // this.setState({arr: movies.map((item) => {
      //  console.log(item.title);
      //  return item.title, item.description;
      //  })});
      this.setState({arr: movies.map((item) => {
        return [item.title, item.description];
        })});
        console.log(this.state.arr);
        this.setState({arrTitle: this.state.arr}, (() =>   {
          console.log(this.state.arrTitle);
          let item3 = this.state.lastsearch;
          console.log(item3.succeed);
          item3.succeed = false;
          console.log(item3.succeed);
          //console.log(item4);
        }));
      this.progress2()
     });
  }




  
  handleChange(event) {
    let search = (event.target.value).trim();
    let length = search.length;
    let last = this.state.lastsearch;
    let lastsearch = (last.value).trim();

   if(!length==0 && (lastsearch === '' || !(lastsearch.length <= length && search.substring(0, lastsearch.length).toUpperCase() === lastsearch.toUpperCase() && last.succeed === false))) {
     console.log("Aufruf***********************************************************************************************************************************************");
     this.setState({arrTitle: this.state.arr.filter((item, index) => {
       let temp = item[0];
        if(!temp.length<length && search.toUpperCase() === temp.trim().substring(0, length).toUpperCase()) {
          return item;
        }
    })}, (() =>  {
    last.value = search;
    last.succeed = (this.state.arrTitle.length > 0 ? true : false);
    this.progress2();
    }));
  } else if(length==0) {
    this.setState({arrTitle: this.state.arr}, (() => {
        this.progress2();
    }));
  }
  }

  progress2() {
    let rows = [];
    let movies = this.state.arrTitle;
    for(let i=0; i<this.state.arrTitle.length; i+=3) {
      rows.push(movies.slice(i, i+3));
    }
    console.log(rows);

    this.setState({renderedOutput: rows.map((item) => {
      return(<CardDeck>
        {item.map((item2, index) => {
          return (
          <Card> 
            <img src={testpicture}></img>
               <Card.Body>
           <Card.Title>{item2[0]}</Card.Title>
           <Card.Subtitle className="mb-2 text-muted">Card Subtitle</Card.Subtitle>
          <Card.Text>
           {item2[1]}  
           </Card.Text>
           <Card.Link href="#">Card Link</Card.Link>
           <Card.Link href="#">Another Link</Card.Link>
         </Card.Body>
      </Card>);
        })}
      </CardDeck>);
    })});
  }
  
  render() {
    //const element = [this.state.searchbar, this.state.renderedOutput];
    return(
      <><Form.Control type="input" placeholder="Search for a specific movie" onChange={this.handleChange}/>
       <div>{this.state.renderedOutput} </div>
      </>
    );
  }
}
//let element = [main(),  <RenderMovies movies={getMovies2()}/>];
ReactDOM.render(
 <React.StrictMode>
  <App/>
</React.StrictMode>,
document.getElementById("root")
);
reportWebVitals();

header.js:


routings.js:

      import React from 'react';
import { Navbar,Nav,NavDropdown,Form,FormControl} from 'react-bootstrap';
import { LinkContainer } from 'react-router-bootstrap';
import { BrowserRouter } from 'react-router-dom';
import 'bootstrap/dist/css/bootstrap.min.css';

function Header() {
    return(
        <Navbar bg="dark" variant="dark" expand="lg" sticky="top">
        <Navbar.Brand to="/">React Bootstrap Navbar</Navbar.Brand>
        <Navbar.Toggle aria-controls="basic-navbar-nav" />
        <Navbar.Collapse id="basic-navbar-nav">
            <Nav className="mr-auto">
            <LinkContainer exact to="/"><Nav.Link>Home</Nav.Link></LinkContainer>
            <LinkContainer exact to="/movies"> <Nav.Link>Movies</Nav.Link></LinkContainer>
            <LinkContainer exact to="/contact-us"><Nav.Link>About Us</Nav.Link></LinkContainer>
            </Nav>
        </Navbar.Collapse>
    </Navbar>
    )
}

export default Header;

sessionStorage только вызывает API и сохраняет результат в sessionStorage.

0 ответов

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