gpt4 book ai didi

javascript - 如何防止相同的组件在导航时重新渲染? react 路由器 v6

转载 作者:行者123 更新时间:2023-12-05 02:34:03 27 4
gpt4 key购买 nike

我是 React 新手,当我导航到另一个页面时,我无法阻止组件重新呈现。我正在尝试导航到我的注册和登录页面,该页面只有一行文本,这是我唯一想要显示的内容。

问题是每次我浏览链接时,导航栏都会重新呈现。我为 react-router v6 尝试了不同的时间,但是当我导航时,导航栏总是在下面重新呈现。我只是希望文本只显示在屏幕上,但导航栏仍然显示

我没有在我的代码中将 Navbar 作为路由包含在内,但每次我导航到不同的链接以及带有 React bootstrap carousel 的图像 slider 时都会显示它。

App.js

import React from 'react';
import Navbar from './Components/Navbar/Navbar';
import ImageSlider from './Components/Slideshow/ImageSlider';
import {BrowserRouter as Router, Route, Routes, Switch} from 'react-router-dom';
import Signup from './Components/Navbar/Signup';
import Login from './Components/Navbar/Login';
import './App.css';

function App() {
return (
<div className="App">
<Router>
<Navbar></Navbar>
<Routes>
<Route path='/Signup' element={<Signup />}></Route>
<Route path='/Login' element={<Login />}></Route>
</Routes>
</Router>
<ImageSlider></ImageSlider>
</div>
);
}

export default App;

导航栏.js

import React from 'react';
import { MenuItems } from "./MenuItems";
import {Link,NavLink} from "react-router-dom";


class Navbar extends React.Component {

render() {
return(
<nav className="NavbarItems">
<ul className={this.state.clicked ? 'nav-menu active' : 'nav-menu'}>
{MenuItems.map((item,index) => {
return (
<li key={index}>
<NavLink to={item.url} activeClassName="is-active" className={item.cName} style={{position: 'relative', right: 0, top: 13}}>
{item.title}
</NavLink>
</li>
)
})}
</ul>
</nav>
)
}
}

export default Navbar

菜单项.js

export const MenuItems = [
{
title: 'Home',
url: '/',
cName: 'nav-links'
},
{
title: 'Sign Up',
url: '/Signup',
cName: 'nav-links'
},
{
title: 'Login',
url: '/Login',
cName: 'nav-links'
}
]

ImageSlider.js

import React from 'react';
import "bootstrap/dist/css/bootstrap.css";
import Carousel from 'react-bootstrap/Carousel';

export default function ImageSlider() {
return (
<div className='slideshow' style={{ height:120}}>
<Carousel controls={false}>
<Carousel.Item interval={1500}>
<img
className="d-block w-100"
src="https://cdn.suwalls.com/wallpapers/nature/beautiful-sunset-in-grand-canyon-47489-1920x1080.jpg"
alt="Image One"
/>
</Carousel.Item>
<Carousel.Item interval={1500}>
<img
className="d-block w-100"
src="https://wallpaperaccess.com/full/284466.jpg"
alt="Image Two"
/>
</Carousel.Item>
<Carousel.Item interval={1500}>
<img
className="d-block w-100"
src="https://i.pinimg.com/originals/09/6a/35/096a35453660aa9b83ba4ab6d9182d61.jpg"
alt="Image Two"
/>
</Carousel.Item>
<Carousel.Item interval={1500}>
<img
className="d-block w-100"
src="https://www.teahub.io/photos/full/2-29537_hd-nature-wallpapers-landscape-green-cute-desktop-waterfall.jpg"
alt="Image Two"
/>
</Carousel.Item>
<Carousel.Item interval={1500}>
<img
className="d-block w-100"
src="https://wallpaperaccess.com/full/825200.jpg"
alt="Image Two"
/>
</Carousel.Item>
<Carousel.Item interval={1500}>
<img
className="d-block w-100"
src="https://wallpaperaccess.com/full/825194.jpg"
alt="Image Two"
/>
</Carousel.Item>
<Carousel.Item interval={1500}>
<img
className="d-block w-100"
src="https://hikinglovers.files.wordpress.com/2014/02/high-mountain-hiking-trail-1920x1080-wallpaper-jjr5fr.jpg"
alt="Image Two"
/>
</Carousel.Item>
<Carousel.Item interval={1500}>
<img
className="d-block w-100"
src="https://wallpaperaccess.com/full/1859582.jpg"
alt="Image Two"
/>
</Carousel.Item>
<Carousel.Item interval={1500}>
<img
className="d-block w-100"
src="https://cdn.suwalls.com/wallpapers/nature/mountain-shadowing-upon-the-lake-54621-1920x1200.jpg"
alt="Image Two"
/>
</Carousel.Item>
</Carousel>
</div>
);
}

最佳答案

启动react-router-dom v6,你可以拆分你的组件,让它们只在特定的路由上呈现。

你的 App.js 应该是这样的

<Router>
<Routes>
<Route element={
<>
<Navbar />
<Outlet />
<ImageSlider />
</>
}>
// routes for authenticated users where navbar & image slider should be displayed
<Route path='/home' element={<Home />}> </Route>
</Route>

<Route element={<Outlet />}>
// routes where navbar & image slider is not rendered
<Route path='/Signup' element={<Signup />}> </Route>
<Route path='/Login' element={<Login />}> </Route>
</Route>
</Routes>
</Router>

通过这样做,您的 /home 路由将始终具有 NavbarImageSlider 组件,而访客路由将只有该元素作为 prop 传递给路由。


随着您的应用程序的增长,我建议将其拆分到 Layouts 文件夹中以包含

  1. Auth Layout - 为经过身份验证的用户呈现所有常用组件的组件
  2. Guest Layout - 为 guest 用户呈现所有常用组件的组件

这样您就可以利用异步代码,例如 useEffect 或任何其他 Hook 。

我已经起草了一个演示来展示如何通过拆分成单独的组件来实现这一点。

https://codesandbox.io/s/multiple-layouts-react-7r8qu

关于javascript - 如何防止相同的组件在导航时重新渲染? react 路由器 v6,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70819354/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com