Uncaught TypeError: useContext(...) is undefined
Uncaught TypeError: useContext(...) is undefined
我正在使用 react-router-dom 5.3.0。我想尝试新的挂钩方法,但我收到一条错误消息
Uncaught TypeError: useContext(...) is undefined
我有一个组件 BasicRouting 如下:
import {React} from "react";
import { BrowserRouter as Router,Link, useRouteMatch} from "react-router-dom";
export default function BasicRouting() {
let home = useRouteMatch("/");
let about = useRouteMatch("/about");
let users = useRouteMatch("/users");
return (
<Router>
<div>
<nav>
<ul>
<li>
<Link to="/">Home</Link>
</li>
<li>
<Link to="/about">About</Link>
</li>
<li>
<Link to="/users">Users</Link>
</li>
</ul>
</nav>
{home && <Home match={home}/>}
{about && <About match={about}/>}
{users && <Users match={users}/>}
</div>
</Router>
);
}
function Home() {
return <h2>Home</h2>;
}
function About() {
return <h2>About</h2>;
}
function Users() {
return <h2>Users</h2>;
}
和index.js如下:
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import reportWebVitals from './reportWebVitals';
import BasicRouting from './BasicRouting';
ReactDOM.render(
<React.StrictMode>
< BasicRouting/>
</React.StrictMode>,
document.getElementById('root')
);
// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint.
reportWebVitals();
如何解决这个错误,这是使用 useRouteMatch
hook 的正确方法吗
我认为问题出在 useRouteMatch
上,它需要 Router 上下文(在您的情况下,它是在同一组件中定义的,因此无法访问)。
而不是 useRouteMatch
尝试以下操作:
<Switch>
<Route path="/">
<Home />
</Route>
<Route path="/about">
<About />
</Route>
<Route path="/users">
<Users />
</Route>
</Switch>
查看 react-router
以获得更详细的 documentation。
根据@matthiasgiger 的回答,我尝试了一些修复,现在我的代码可以正常工作了。
下面是工作代码
基本路由:
import {React} from "react";
import { BrowserRouter as Router,Link, useRouteMatch} from "react-router-dom";
export default function BasicRouting() {
let home = useRouteMatch({
path: "/",
exact: true
});
let about = useRouteMatch("/about");
let users = useRouteMatch("/users");
return (
<div>
<nav>
<ul>
<li>
<Link to="/">Home</Link>
</li>
<li>
<Link to="/about">About</Link>
</li>
<li>
<Link to="/users">Users</Link>
</li>
</ul>
</nav>
{about && <About match={about}/>}
{users && <Users match={users}/>}
{home && <Home match={home}/>}
</div>
);
}
function Home() {
return <h2>Home</h2>;
}
function About() {
return <h2>About</h2>;
}
function Users() {
return <h2>Users</h2>;
}
索引
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import reportWebVitals from './reportWebVitals';
import BasicRouting from './BasicRouting';
import {BrowserRouter as Router} from 'react-router-dom';
ReactDOM.render(
<React.StrictMode>
<Router>
< BasicRouting/>
</Router>
</React.StrictMode>,
document.getElementById('root')
);
// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint.
reportWebVitals();
我正在使用 react-router-dom 5.3.0。我想尝试新的挂钩方法,但我收到一条错误消息
Uncaught TypeError: useContext(...) is undefined
我有一个组件 BasicRouting 如下:
import {React} from "react";
import { BrowserRouter as Router,Link, useRouteMatch} from "react-router-dom";
export default function BasicRouting() {
let home = useRouteMatch("/");
let about = useRouteMatch("/about");
let users = useRouteMatch("/users");
return (
<Router>
<div>
<nav>
<ul>
<li>
<Link to="/">Home</Link>
</li>
<li>
<Link to="/about">About</Link>
</li>
<li>
<Link to="/users">Users</Link>
</li>
</ul>
</nav>
{home && <Home match={home}/>}
{about && <About match={about}/>}
{users && <Users match={users}/>}
</div>
</Router>
);
}
function Home() {
return <h2>Home</h2>;
}
function About() {
return <h2>About</h2>;
}
function Users() {
return <h2>Users</h2>;
}
和index.js如下:
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import reportWebVitals from './reportWebVitals';
import BasicRouting from './BasicRouting';
ReactDOM.render(
<React.StrictMode>
< BasicRouting/>
</React.StrictMode>,
document.getElementById('root')
);
// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint.
reportWebVitals();
如何解决这个错误,这是使用 useRouteMatch
hook 的正确方法吗
我认为问题出在 useRouteMatch
上,它需要 Router 上下文(在您的情况下,它是在同一组件中定义的,因此无法访问)。
而不是 useRouteMatch
尝试以下操作:
<Switch>
<Route path="/">
<Home />
</Route>
<Route path="/about">
<About />
</Route>
<Route path="/users">
<Users />
</Route>
</Switch>
查看 react-router
以获得更详细的 documentation。
根据@matthiasgiger 的回答,我尝试了一些修复,现在我的代码可以正常工作了。
下面是工作代码
基本路由:
import {React} from "react";
import { BrowserRouter as Router,Link, useRouteMatch} from "react-router-dom";
export default function BasicRouting() {
let home = useRouteMatch({
path: "/",
exact: true
});
let about = useRouteMatch("/about");
let users = useRouteMatch("/users");
return (
<div>
<nav>
<ul>
<li>
<Link to="/">Home</Link>
</li>
<li>
<Link to="/about">About</Link>
</li>
<li>
<Link to="/users">Users</Link>
</li>
</ul>
</nav>
{about && <About match={about}/>}
{users && <Users match={users}/>}
{home && <Home match={home}/>}
</div>
);
}
function Home() {
return <h2>Home</h2>;
}
function About() {
return <h2>About</h2>;
}
function Users() {
return <h2>Users</h2>;
}
索引
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import reportWebVitals from './reportWebVitals';
import BasicRouting from './BasicRouting';
import {BrowserRouter as Router} from 'react-router-dom';
ReactDOM.render(
<React.StrictMode>
<Router>
< BasicRouting/>
</Router>
</React.StrictMode>,
document.getElementById('root')
);
// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint.
reportWebVitals();