导航在反应路由器 dom 中不起作用。它没有将我重定向到我想要的路线[重复]

问题描述 投票:0回答:1

Navbar.js 文件

import React, { Component } from 'react'
import { Link, Navigate } from "react-router-dom"
export default class Navbar extends Component {
    fetchQuery = (e) => {
        e.preventDefault();
        const formData = new FormData(e.target);
        const searchText = formData.get('search');
        console.log(searchText)
        this.props.setQuery(searchText);
        <Navigate to="/keyword" replace={true}/>
    }
    render() {
        return (
            // <nav className="navbar navbar-expand-lg" style={{ backgroundColor: "#35374B" }} data-bs-theme="dark">
            <nav className="navbar navbar-expand-lg" style={{ backgroundColor: "#820300" }} data-bs-theme="dark">
                <div className="container-fluid">
                    <img src="favicon-32x32.png" alt="Logo" width="30" height="24" className="d-inline-block align-text-top " />
                    <Link className="mx-2 navbar-brand" to="/">KhabarDaar</Link>
                    <button className="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
                        <span className="navbar-toggler-icon"></span>
                    </button>
                    <div className="collapse navbar-collapse" id="navbarSupportedContent">
                        <ul className="navbar-nav me-auto mb-2 mb-lg-0">
                            <li className="nav-item">
                                <Link className="nav-link" aria-current="page" to="/">Home</Link>
                            </li>
                            <li className="nav-item">
                                <Link className="nav-link" to="/business">Business</Link>
                            </li>
                            <li className="nav-item">
                                <Link className="nav-link" to="/entertainment">Entertainment</Link>
                            </li>
                            <li className="nav-item">
                                <Link className="nav-link" to="/health">Health</Link>
                            </li>
                            <li className="nav-item">
                                <Link className="nav-link" to="/science">Science</Link>
                            </li>
                            <li className="nav-item">
                                <Link className="nav-link" to="/sports">Sports</Link>
                            </li>
                            <li className="nav-item">
                                <Link className="nav-link" to="/technology">Technology</Link>
                            </li>
                            <li className="nav-item">
                                <Link className="nav-link" to="/random">Random</Link>
                            </li>
                            <li className="nav-item">
                            </li>
                            {/* <li className="nav-item">
                                <Link className="nav-link" to="/about">About</Link>
                            </li>
                            <li className="nav-item">
                                <Link className="nav-link" to="/contact">Contact</Link>
                            </li> */}
                            <li className="nav-item dropdown">
                                <Link className="nav-link dropdown-toggle" to="/" role="button" data-bs-toggle="dropdown" aria-expanded="false">
                                    Country
                                </Link>
                                <ul className="dropdown-menu">
                                    <li><Link className="dropdown-item" to="/">India</Link></li>
                                    <li><Link className="dropdown-item" to="/">USA</Link></li>
                                    <li><Link className="dropdown-item" to="/">China</Link></li>
                                    <li><Link className="dropdown-item" to="/">Russia</Link></li>
                                </ul>
                            </li>
                            {/* <li className="nav-item">
                                <Link className="nav-link disabled" aria-disabled="true">Disabled</Link>
                            </li> */}
                        </ul>
                        <form onSubmit={this.fetchQuery} className="d-flex" role="search">
                            <input name="search" className="form-control me-2" type="search" placeholder="Search" aria-label="Search" />
                            <button className="btn btn-outline-light" type="submit">Search</button>
                        </form>
                    </div>
                </div>
            </nav>
        )
    }
}

App.js 文件

import './App.css';
import React, { Component } from 'react'
import Navbar from './Components/Navbar';
import News from './Components/News';
import {
  BrowserRouter as Router,
  Route,
  Routes
} from "react-router-dom"

export default class App extends Component {
  constructor() {
    super();
    this.state = {
      country: "in",
      query: ""
    }
  }
  setQuery = (q) => {
    this.setState({ query: q })
  }
  render() {
    return (
      <>
        <Router>
          <Navbar setQuery={this.setQuery} />
          <Routes>
            <Route path="/" element={<News key="general" pageSize={9} country={this.state.country} category="general"></News>} />
            <Route path="/business" element={<News key="business" pageSize={9} country={this.state.country} category="business"></News>} />
            <Route path="/entertainment" element={<News key="entertainment" pageSize={9} country={this.state.country} category="entertainment"></News>} />
            <Route path="/health" element={<News key="health" pageSize={9} country={this.state.country} category="health"></News>} />
            <Route path="/science" element={<News key="science" pageSize={9} country={this.state.country} category="science"></News>} />
            <Route path="/sports" element={<News key="sports" pageSize={9} country={this.state.country} category="sports"></News>} />
            <Route path="/technology" element={<News key="technology" pageSize={9} country={this.state.country} category="technology"></News>} />
            <Route path="/keyword" element={<News key="technology" pageSize={9} country={this.state.country} q={this.state.query}></News>} />
          </Routes>
        </Router>
      </>
    )
  }
}

它没有将我重定向到 /keyword 路线。我不知道这里的确切问题是什么。我也参考了react-router-dom文档,但仍然没有任何线索。我的代码与文档中指定的完全一样。 https://reactrouter.com/en/main/components/navigate 我新添加了这个,因为每当它重定向到某个新路线时,我的网址栏都会显示该路线,但在这里它没有发生。然而 fetchQuery() 函数肯定被调用了

javascript reactjs react-router
1个回答
-1
投票

我看到您正在调用

fetchQuery
,然后使用
Navigate
组件。这是一种错误的事件导航方式。您可以在条件渲染上使用
Navigate
。但是,如果您要导航某个事件,则需要使用名为
useNavigate()
的钩子,如下 -

const navigate = useNavigate();
navigate("/keyword");

参考 - https://reactrouter.com/en/main/hooks/use-navigate

© www.soinside.com 2019 - 2024. All rights reserved.