javascript - React Router v4 未加载组件

标签 javascript reactjs react-router

出于某种原因,每当我访问参数时,我的网络应用程序都不会定向到该组件。具体来说,它不会进入 Battle 组件。

导航的外观如下:

    import React from 'react';
import Header from './components/Header/Header';
import SelectPlayers from './pages/SelectPlayers/SelectPlayers';
import Popular from './pages/Popular/Popular'
import Battle from './pages/Battle/Battle'

import { BrowserRouter as Router, Route, Link, Switch } from "react-router-dom";

function App() {
  return (
      <Router>
          <div className={'flex flex-column'}>
              <Header />

              <Switch>
                  <Route exact path={'/'} component={Popular}/>
                  <Route exact path={'/battle/select-player'} component={SelectPlayers} />
                  <Route exact path={'/results?playerOne=:playerOne&playerTwo=:playerTwo'} component={Battle} />
              </Switch>

          </div>

      </Router>
  );
}

export default App;

SelectPlayers 组件中,每当用户按下按钮时,它就会运行:

    import React, {useState} from 'react';

function SelectPlayers(props) {


    const [playerOne, setPlayerOne] = useState('');
    const [playerTwo, setPlayerTwo] = useState('');

    function setPlayerName(event, player){

        if (player === 1){
            setPlayerOne(event.target.value)

        } else if (player === 2) {
            setPlayerTwo(event.target.value)
        }
    }


    function goToBattle(event){

        event.preventDefault();

        props.history.push(`/results?playerOne=${playerOne}&playerTwo=${playerTwo}`)

    }


    return (
        <div className={'pa3 mh7-l mh7-m'}>
            <div className="flex flex-column">


                <div className={'mb1'}>
                    <h1 className={'mb0'}>Player One</h1>
                    <input onChange={(e) => setPlayerName(e, 1)} type="text" placeholder={'github username'} className={'input-reset pa1 w-100 h2 ba b--black br2'}/>
                </div>

                <div className="tc dark-red">
                    <h1>Versus</h1>
                </div>

                <div className={'mb3'}>
                    <h1 className={'mb0 mt0 tr'}>Player Two</h1>
                    <input onChange={(e) => setPlayerName(e, 2)}  type="text" placeholder={'github username'} className={'input-reset pa1 w-100 h2 ba b--black br2'}/>
                </div>

                <div>
                    <button onClick={(e) => goToBattle(e)} className={'input-reset pa1 h2 fw1 bg-black white ba w-100 b--black br2'}>Battle</button>
                </div>

            </div>
        </div>
    );
}

export default SelectPlayers;

Battle 组件上,我编写了一些 console.log 内容,只是为了检查组件是否已加载。但是,每当我转到该参数时,我的 componentDidMount 中的代码都没有运行。我在开发者控制台中没有看到我在 componentDidMount 中编写的任何 console.logs。这是组件:

import React, {Component} from 'react';

class Battle extends Component {

    constructor(props){
        super(props)
    }

    componentDidMount() {

        console.log('runngins');


        console.log(this.props);
    }


    render() {
        return (
            <div className={'pa3 mh7-l mh7-m'}>

                <div className="flex flex-column">

                </div>

            </div>
        );
    }
}

export default Battle;

您可以在此存储库中看到代码:https://github.com/tarekgabarin/github_compete

如果有人帮助我,我将不胜感激。

最佳答案

根据您的新评论,代码在没有查询集的情况下也可以工作,看起来您的查询集参数存在一些问题。 正如评论框中的建议,不要使用查询集定义 Router。

<Switch>
              <Route exact path={'/'} component={Popular}/>
              <Route exact path={'/battle/select-player'} component={SelectPlayers} />
              <Route exact path={'/results'} component={Battle} />
          </Switch>

在 SelectPlayers 组件中,使用查询集导航到下一页。

props.history.push("/results?playerOne=" +playerOne+ "&playerTwo=" +playerTwo)

在Battle组件中,使用(query-string)读取参数。例如:

const values = queryString.parse(this.props.location.search);
const player_one = values.playerOne
const player_two = values.playerTwo

请注意,我的上述代码未经测试。

谢谢

关于javascript - React Router v4 未加载组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58205841/

相关文章:

javascript - AngularJS - 使用 md5 密码检查登录服务中的用户/密码

javascript - 使用索引元素 ID 时出现意外错误

reactjs - 创建一个返回 react 组件类的 typescript 函数

javascript - MUI 选择带标签,但选择没有 ID

reactjs - 在reactjs中从搜索表单重定向到结果页面

javascript - 获取 HTML 5 音频控制文件位置并更新 src,而不使用 id 选择器

javascript - 我想调用另一个组件的方法

reactjs - 从按钮单击 React 获取名称

reactjs - react 如何在 redux-saga 中导航路由器?

go - 如何使用 go 服务(正确地)一个 react-router?