【问题标题】:React router dom: Route and Router not working at all反应路由器dom:路由和路由器根本不起作用
【发布时间】:2021-12-21 20:40:59
【问题描述】:

我对反应和尝试使用 react-router-dom 进行重定向相当陌生,我将所有内容都作为文档进行,但我的代码似乎不起作用。我收到关于未找到元素的错误,我不明白是什么原因造成的。另外,我现在只是尝试使用地址栏而不是任何按钮或链接来访问该页面。

错误

Matched leaf route at location "/" does not have an element. This means it will render an <Outlet /> with a null value by default resulting in an "empty" page.

/register 出现同样的错误

index.js

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
import { Route, BrowserRouter as Router, Routes } from 'react-router-dom';
import Register from "./components/Register";

ReactDOM.render( 
  <Router>
    <React.StrictMode>
      <Routes>
        <Route exact path="/register" component={Register} />
        <Route exact path="/" component={App} />
      </Routes>
      <App />
    </React.StrictMode>
  </Router>,
  document.getElementById('root')
);

reportWebVitals();

App.js

import { Component } from 'react';

class App extends Component {
  render(){
    return (
      <div>
        HELLO WORLD
      </div>
    );
  }
}


export default App;

Register.js

import { useState } from "react";
import { useNavigate } from "react-router-dom";

export default function Register(){
    const history = useNavigate();
    const initialFormData = Object.freeze({
          email: '',
          password: '',
      });

      const [formData, updateFormData] = useState(initialFormData);

    const handleChange = (event) => {
      updateFormData({
              ...formData,
              // Trimming any whitespace
              [event.target.name]: event.target.value.trim(),
          });
    }

    const handleSubmit = (event) => {
      event.preventDefault();
      console.log(event.target.email.value);
      console.log(event.target.password.value);
    }

    return (
      <form onSubmit={handleSubmit}>
        <div>
          <label>
            Email: 
            <input type="text" value={formData.email} name="email" onChange={handleChange} />
          </label>
        </div>
        <div>
          <label>
            Password: 
            <input type="text" value={formData.password} name="password" onChange={handleChange}/>
          </label>
        </div>
        <input type="submit" value="Submit" />
      </form>
  );
}

【问题讨论】:

    标签: javascript reactjs react-native react-router-dom


    【解决方案1】:

    您能否稍微修改一下您的index.js,然后再试一次:

    react-router-dom@5

    import React from 'react';
    import ReactDOM from 'react-dom';
    import './index.css';
    import App from './App';
    import reportWebVitals from './reportWebVitals';
    import {
        Switch,
        Route,
        BrowserRouter as Router,
    } from "react-router-dom";
    import Register from "./components/Register";
    
    ReactDOM.render( 
      <Router>
        <React.StrictMode>
          <Switch>
            <Route exact path="/register" component={Register} />
            <Route exact path="/" component={App} />
          </Switch>
          <App />
        </React.StrictMode>
      </Router>,
      document.getElementById('root')
    );
    
    reportWebVitals();
    

    react-router-dom@6

    import React from 'react';
    import ReactDOM from 'react-dom';
    import './index.css';
    import App from './App';
    import reportWebVitals from './reportWebVitals';
    import {
        Route,
        Routes,
        BrowserRouter as Router,
    } from "react-router-dom";
    import Register from "./components/Register";
    
    ReactDOM.render(
        <Router>
            <React.StrictMode>
                <Routes>
                    <Route path="/register" element={<Register />} />
                    <Route path="/" element={<App />} />
                </Routes>
                <App />
            </React.StrictMode>
        </Router>,
        document.getElementById('root')
    );
    
    reportWebVitals();
    

    这应该可行。

    【讨论】:

    • “开关未导出”错误
    • @RevTpark 你使用的是哪个版本的 react-router-dom?
    • @PradipDhakal 如果Switch 未导出,则 OP 使用的是 v6.x。
    • 它是最新的一个ig
    • 第5版和第6版我都写了,大家可以去看看。
    【解决方案2】:

    您没有正确渲染路由组件。它们应该在 element 属性上呈现为 JSX,而不是对组件的引用。这是react-router-dom 版本 5 和 6 之间的重大更改。另请注意,Route 组件也不再采用 exact 属性,它们现在始终完全匹配。

    ReactDOM.render( 
      <Router>
        <React.StrictMode>
          <Routes>
            <Route path="/register" element={<Register />} />
            <Route path="/" element={<App />} />
          </Routes>
          <App />
        </React.StrictMode>
      </Router>,
      document.getElementById('root')
    );
    

    【讨论】:

      猜你喜欢
      • 2020-12-25
      • 1970-01-01
      • 1970-01-01
      • 2015-11-25
      • 2017-02-24
      • 2022-01-21
      • 2017-12-21
      • 2017-12-30
      相关资源
      最近更新 更多