javascript - react-router-dom 重定向导致 : Maximum update depth exceeded

标签 javascript reactjs react-router

我正在尝试从我的应用程序的根 URL 进行重定向,但出现了上述错误。我已经在 SO 上阅读了其他一些引用此错误的答案,但它们以周期性更新状态为中心,我看不到我在路由器中的什么位置:

import React from 'react';
import ReactDOM from 'react-dom';
import {BrowserRouter as Router, Route, Switch, Redirect} from 'react-router-dom'
import BookDetails from './BookDetails'
import NavBar from './NavBar'
import './index.css';
import App from './App';
import * as serviceWorker from './serviceWorker';

ReactDOM.render(
    <>
        <Router>
        <NavBar/>
        <Switch>
            <Redirect from="/" to="/search" component={App} /> {/** */}
            <Route path="/search" component={App} />
            <Route path="/" component={App} /> 
        </Switch>
            <Route path="/book/:bookId" component={BookDetails} />

        </Router>
    </>
    , document.getElementById('root'));

或者在 App.js 文件中,我希望没问题:

import React, {useState, useEffect} from 'react'
import {Link} from 'react-router-dom'
// import debounce from 'lodash'
import noimage from './noimage.png'
import axios from 'axios'
import './App.css';

const App = (props) =>{

  const [books,setBooks] = useState([])
  const [isLoading,setIsLoading] = useState(false)
  const [hasError,setHasError] = useState(false)
  const [searchTerm,setSearchTerm] = useState('')
  console.log("props",(props.history.location.pathname))
  const input = str => {
    console.log(str)
    setSearchTerm(str)
    getData(str)
  }

  const getData = async () => {
    if(searchTerm && searchTerm.length >= 2){
      if(isLoading === false)setIsLoading(true)
      let s = `http://localhost:7000/books/search/${searchTerm}`
      await axios.get(s)
      .then(resp => {
        console.log(resp.data.books)
        if(books === [])setBooks([...resp.data.books])
        //props.history.push(s)
      })
      .catch(error => {
        console.log(error)
        setHasError(true)
        setIsLoading(false)
      })
    }
    if(isLoading === true) setIsLoading(false)
  }

  const img = {
    height : "175px",
    width : "175px"
  }

  // useEffect(() =>{
  //     setTimeout(() => getData(),2250)
  // },[])



  return isLoading ? (
    <div className="App">
      <div className="spinner"></div>
      <div className="App loading">
        <p><i>loading...</i></p>
      </div>
    </div>
  )
  : hasError ? (
    <div className="App loading-error">
      &#x26A0; There is a network issue: Please try again later
    </div>
  )
  :
  (
    <div className="App">
      <div className="search">
        <div className="container">
          <div className="content">
              <input
                type="search"
                placeholder="Search..."
                aria-label="Search"
                className="search-form"
                value={searchTerm}
                onChange={e => input(e.target.value)}
              />
          </div>
        </div>
      </div>

    {
      (books && books.length >= 1) && 
        books.map((b,i) => {
        console.log(typeof b.imageLinks)
        return (
          <div key={`${b.title}-${i}`} className="search-book">
            <Link to={`/book/${b.id}`}>
              {
                (b.imageLinks === undefined || b === undefined || b.imageLinks.thumbnail ===  undefined) ?
                  <img src={noimage} alt ="Missing" style={img}></img>
              :
                  <img src={b.imageLinks.thumbnail} alt={b.title}></img>
              }
            </Link>
            <p>{b.title}</p>
            <hr/>
          </div>
        )}
      )
    }         
    </div>
  )  
}

export default App;

我无法演示代码,因为它涉及我机器本地的 REST Api 服务器。谢谢。

最佳答案

好吧,我的导师建议这样做:https://reacttraining.com/react-router/web/api/Switch 我想我已经试过了但我阅读了文档并尝试了这个 -

    (
        <Router>
            <NavBar/>
            <Switch>
                <Redirect exact from="/" to="/search" component={App} />
                <Route path="/search" component={App} />
                <Route path="/book/:bookId" component={BookDetails} />
            </Switch>
        </Router>
    )

并非所有路由都需要 exact 属性。但我感谢 Kishan 的努力,他绝对是在正确的轨道上。再次感谢。

关于javascript - react-router-dom 重定向导致 : Maximum update depth exceeded,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55788703/

相关文章:

javascript时区怪异: new Date() creating dates in different timezones

javascript - 如果任何地方有 "return"语句,Firefox 插件的内容脚本将不会运行

javascript - 按钮输入类型提交不在 React 中使用 React Router 提交

javascript - HTML 5 Canvas : detect long click

reactjs - 为什么我从另一个组件收到错误?

event-handling - 如何在react.js中从父组件重写子组件的事件处理函数

javascript - 用过去时命名 Flux Action 是一种好习惯吗?

javascript - react 路由器未捕获类型错误 : Cannot read property 'toUpperCase' of undefined

javascript - Meteor - 简单的 react 路由器抛出错误

javascript - Javascript 字符串中的特殊字符无法正确显示