我正在使用 React Router 6.4.3 和新的数据路由器。
第三方身份验证库通过挂钩公开身份验证上下文和登录函数,例如:
const { AuthenticationContext, login } = useAuthentication();
Run Code Online (Sandbox Code Playgroud)
我已经设法AuthenticationContext通过使用 中的无路径路由将路由包装到 中createBrowserRouter。
但是,我无法理解如何利用路由操作来执行登录并随后重定向用户。由于配置和操作现在位于功能组件之外,因此我无法使用该useAuthentication钩子。
我的配置如下:
import { createBrowserRouter, RouterProvider } from 'react-router-dom';
import { AuthProvider } from 'auth';
import Login, { action as loginAction } from './routes/login';
const router = createBrowserRouter([
{
element: <AuthProvider />,
children: [
{
path: '/login',
element: <Login />,
action: loginAction,
},
],
},
]);
function App() {
return (
<RouterProvider router={router} />
);
}
Run Code Online (Sandbox Code Playgroud)
目前loginAction …
我有以下组件作为主要布局。当我单击菜单项时,我希望它们导航到主页、假日日历和活动页面。我可以用这个水平菜单做什么?下面的代码显示了围绕上述页面的主要布局。我正在使用 AntD 和反应路由器。这个主要布局围绕着所有其他路由器。
import { Layout, Menu, Button, Avatar, Row, Col, Space, Dropdown } from "antd";
import React, { useState } from "react";
import { Outlet } from "react-router-dom";
const navigation = [
{ label: "Home", key: 1 },
{ label: "Holiday Calendar", key: 2 },
{ label: "Event", key: 3 },
];
const MainLayout = () => {
const [open, setOpen] = useState(false);
const showDrawer = () => {
setOpen(true);
};
const onClose = () => {
setOpen(false);
window.dispatchEvent(new …Run Code Online (Sandbox Code Playgroud) 任何大型应用程序都会有可能需要路由器重定向用户的一般上下文。由于RouterProvider只能在根级别使用。如何将它与应用程序上下文一起使用。
例如,ApiContext如果用户无权访问 API,我会重定向到 403 路由/组件。
如何将此上下文包装在 中,而RouterProvider不必在每次路由更改时重新渲染它。换句话说。我怎样才能拥有使用路由器的父上下文?
如果我使用 ,它工作得很好BrowserRouter,但在 v6.8 中卸载之前使用任何类型的提示的唯一方法是使用数据 api 和方法createBrowserRouter。
标题导航也是如此。我不希望我的标头出现在每个路由组件和路由的一部分中。我希望我的标头是静态的,而路由组件是动态的。
// Aplication Context
export const ApiContext = React.createContext({});
export const ApiProvider = memo((p: { children: React.ReactNode; }) => {
const navigate = useNavigate();
const [token, setToken] = useState<string>()
if (!token) {
navigate('/403');
}
const value = useMemo(() => ({}), []);
return (
<ApiContext.Provider value={value}>
{p.children}
</ApiContext.Provider>
);
});
Run Code Online (Sandbox Code Playgroud)
// Index
const router = createBrowserRouter([
{
path: …Run Code Online (Sandbox Code Playgroud) 我有一个react + django + webpack的项目。我在我的上定义了路线App.js
<NavBar />
<Router>
<Routes>
<Route exact path="/" element={<Home />} />
<Route path="/about" element={<About />} />
</Routes>
</Router>
Run Code Online (Sandbox Code Playgroud)
Links我在我的组件中定义NavBar.js:
import React from "react";
import { Link } from "react-router-dom";
export default function NavBar() {
return (
<nav>
<Link to="/">Home</Link>
<Link to="/about">About</Link>
</nav>
);
}
Run Code Online (Sandbox Code Playgroud)
如果我Link在其中使用App.js它可以正常工作,但是当我在组件中使用它时NavBar.js我会收到此错误:
网络包配置:
<NavBar />
<Router>
<Routes>
<Route exact path="/" element={<Home />} />
<Route path="/about" element={<About />} />
</Routes>
</Router>
Run Code Online (Sandbox Code Playgroud)
我Switch也尝试使用,但它只能使用超链接 …
自 v5 以来,我一直在使用 的redirect方法react-router-dom,但现在它不起作用。我尝试过useNavigate钩子,但无法通过useParams钩子获取参数。它只是不会对路由中定义的组件进行任何重定向。我的应用程序是使用创建的create-react-app。这是我的配置:
索引.js
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
import { BrowserRouter } from 'react-router-dom';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<React.StrictMode>
<BrowserRouter>
<App />
</BrowserRouter>
</React.StrictMode>
);
reportWebVitals();
Run Code Online (Sandbox Code Playgroud)
应用程序.js
import './App.css';
import { Route, Routes } from 'react-router-dom';
import Person from './entities/person/Person';
import UpdatePerson from './entities/person/UpdatePerson';
function App() {
return (
<Routes>
<Route path='/' element={<Person />} …Run Code Online (Sandbox Code Playgroud) 我在redux应用程序中使用react-router-dom.
这是我在index.js中的初始设置:
ReactDOM.render(
<Provider store={store}>
<BrowserRouter>
<App />
</BrowserRouter>
</Provider>
, document.getElementById('root'));
Run Code Online (Sandbox Code Playgroud)
然后在我的App.js中我有:
render() {
return (
<div className="App">
<Route exact path="/" render={ () => {
return (
<div>
{
this.props.categories.map((category)=>{
console.log('category', category)
return (
<Link key={category.name} to="/category" >{category.name}</Link>
)
})
}
</div>
)
}}
/>
<Route path="/category" render={ () => {
console.log('category path this.props', this.props)
return (<p>Category is whatever</p>)
}}
/>
</div>
);
}
Run Code Online (Sandbox Code Playgroud)
我认为每当我点击显示的任何链接时,浏览器会自动知道如何呈现新的路径路径/类别,但由于某种原因它不会.
我究竟做错了什么?
我正在使用React-router-dom开发一个React应用程序。
我有一个带有一些react-router-dom的菜单<NavLink />,每个菜单都将我带到不同的路线。
在我的主要路线中,path="/"我的chartComponent具有一个图表,该图表会随着随机数据而不断变化,如下所示:this.chartChangeId = setInterval(()=> this.setState(data), 1500)。
在我添加以下内容之前:
componentWillUnmount(){
clearInterval(this.chartChangeId);
}
Run Code Online (Sandbox Code Playgroud)
到chartComponent我的应用程序没有中断,但是出现了以下错误:
警告:只能更新已安装或正在安装的组件。这通常意味着您在未安装的组件上调用了setState,replaceState或forceUpdate。这是无人值守。请检查BrainWaveChart组件的代码。
所以我将其添加到生命周期中。
但是现在,当我单击其中一个<NavLink />转到另一条路线时,我的应用程序中断了,并且出现此错误:
未捕获到的TypeError错误:timeout.close不是在BrainWaveChart.componentWillUnmount(brainwaveChart.jsx:116x)处的export.clearTimeout.exports.clearInterval(main.js:14)处,在HTMLUnknownElement.call处的callComponentWillUnmountWithTimer(vendor_f02cab182c1842c98837.js:45235)处的export.clearTimeout.exports.clearInterval(main.js:14) vendor_f02cab182c1842c98837.js:37015)在Object.invokeGuardedCallbackDev(vendor_f02cab182c1842c98837.js:37054)在invokeGuardedCallback(vendor_f02cab182c1842c98837.js:36911)在safelyCallComponentWillUnmount(vendor_f02cab182c1842c98837.js:45242)在commitUnmount(vendor_f02cab182c1842c98837.js:45368)在commitNestedUnmounts(vendor_f02cab182c1842c98837.js :45404)在unmountHostComponents(vendor_f02cab182c1842c98837.js:45687)
我做错了吗?
我有一个称为Dashboard的父组件,该组件被渲染为Route,如下所示:
const Routes = ({ authenticated }: { authenticated: boolean }) => (
<Switch>
<AuthenticatedRoute path="/home" exact={true} component={Dashboard} authenticated={authenticated} />
<UnauthenticatedRoute path="/login" exact={true} component={Login} authenticated={authenticated} />
<AuthenticatedRoute path="/onboarding" exact={true} component={Onboarding} authenticated={authenticated} />
<AuthenticatedRoute path="/meets" exact={true} component={Meets} authenticated={authenticated} />
<Route component={NotFound} />
</Switch>
)
export default Routes
Run Code Online (Sandbox Code Playgroud)
在Dashboard组件中,我还要呈现路线,该组件如下所示:
class Dashboard extends React.Component<IProps, {}> {
public render() {
return (
<div>
<Navigation />
<Route exact={true} path="/home" component={Home} />
<Route exact={true} path="/home/profile" component={Profile} />
<Route exact={true} path="/home/messages" component={Messages} />
HALLO
</div>
)
} …Run Code Online (Sandbox Code Playgroud) const Create = () => {
console.log('rerender !!')
const [parcelType, setParcelType] = useState('paper')
console.log('parcelType =', parcelType)
return (
<Container onClick={() => setParcelType('plastic')}>
<BookingList />
<Card title="Business">
<p>Header</p>
</Card>
</Container>
)
}
export default Create
Run Code Online (Sandbox Code Playgroud)
单击创建组件中的容器时,我想将parcelType状态更改为“可塑”。我想在更改路线时将parcelType状态重置为“纸”(创建组件重新渲染)。但是当组件重新渲染状态未设置为纸张时
有关更多详细信息:在BookingList组件中更改路线时,将重新渲染CreateComponent
const BookingList = props => {
const { id } = props.match.params
const containerStyle = useTranslateSpring('-100px', '0')
const itemList = items.map((item, idx) => {
const itemStyle = useTranslateSpring('-100px', '0', '0', 200 + 200 * idx)
const url = `/booking/${item.id}/create`
return (
<ItemContainer
onClick={() => …Run Code Online (Sandbox Code Playgroud) 我正在尝试对React + Typescript进行更深入的了解和实践,使用withRouterfrom 时遇到了这种输入错误react-router-dom。
我的代码段非常简单,我尝试找出存在相同问题的人员,并且一些答案指出升级时出错(但它们来自2016年,所以...),其中一些正在使用一条connect()我没有使用的陈述(这导致了一个问题:“由于未使用,我做错了吗?”)。我看到其中一些建议还涉及将“ Props”映射到“ State”,到目前为止,我还没有做过(也没有看到)。我希望有人对我所缺少的内容以及我应该关注的内容提出一些建议。
代码是:
import React from "react";
import { withRouter } from "react-router-dom";
interface ISection {
id: number;
title: string;
imageUrl: string;
size: string;
}
class MenuItem extends React.Component<ISection> {
render() {
return (
<div className={`${this.props.size} menu-item`}>
<div
className="background-image"
style={{ backgroundImage: `url(${this.props.imageUrl})` }}
/>
<div className="content">
<h1 className="title">{this.props.title}</h1>
<span className="subtitle">some subtitle</span>
</div>
</div>
);
}
}
export default withRouter(MenuItem);
Run Code Online (Sandbox Code Playgroud)
从这里我期望可以平稳地工作(我不得不说我首先尝试了一个功能组件,因为我没有任何状态,但是我看到的所有解决方案都涉及一个类组件,因此我将其移入了该组件中。 ),但MenuItem在最后一行的上却出现以下错误:
Argument of type 'typeof MenuItem' is …Run Code Online (Sandbox Code Playgroud) react-router-dom ×10
reactjs ×8
javascript ×5
react-router ×3
typescript ×3
antd ×1
react-hooks ×1
react-redux ×1
setinterval ×1
webpack ×1