You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在react-router v6中实现点击按钮渲染全新独立页面而非嵌套渲染

问题根因

你当前把<Router>和路由匹配规则都写在了Intro组件内部,匹配/login路径时,Login组件只会渲染在Intro内部的<Routes>占位位置,外层的Header、Shelf组件都会保留,自然就出现了嵌套渲染的效果。要实现独立登录页,只需要把路由配置提到应用最外层,和首页路由平级即可。

改造步骤

步骤1:调整App.js,全局配置路由

import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
import Header from "./components/Header";
import Intro from "./components/Intro";
import Shelf from "./components/Shelf";
import Login from "./components/Login";
import Signup from "./components/Signup";

function App() {
  return (
    <Router>
      <Routes>
        {/* 首页路由,渲染完整落地页内容 */}
        <Route path="/" element={
          <div>
            <Header />
            <Intro />
            <Shelf />
          </div>
        } />
        {/* 独立登录、注册页路由,和首页平级,不会渲染首页其他内容 */}
        <Route path="/login" element={<Login />} />
        <Route path="/signup" element={<Signup />} />
      </Routes>
    </Router>
  );
}

export default App;

步骤2:精简Intro组件,移除内部路由配置

现在全局已经配置了路由规则,Intro组件只需要保留跳转链接即可:

import React from 'react';
import { Link } from 'react-router-dom';

function Intro() {
  return (
    <div className="hero">
        <div className="overlay column ai-center js-center">
            <h1 className="m-0 fs-large"><em>Welcome to Furns</em></h1>
            <hr />
            <p className="m-0 fs-small">Worlwide known company serves the best furnitures</p>
            <div className="row mt-4">
                <Link to="/login">
                    <button className="login-btn-large px mx-3">Login</button>
                </Link>
                <Link to="/signup" >
                    <button className="sign-up-btn">Sign-up</button>
                </Link>
            </div>
        </div>
    </div>
  );
}

export default Intro;

可选优化:给登录页添加取消跳转逻辑

点击Login组件的取消按钮可以直接跳转回首页:

import React from 'react';
import { useNavigate } from 'react-router-dom';

function Login() {
  const navigate = useNavigate();
  const handleCancel = () => {
    navigate('/');
  }

  return (
        <div className="float shadow bg-light px-3 py-3 ai-center js-between">
            <h2 className="brand color-olive">Furns</h2>
            <h1 className="color-olive">Login</h1>
            <form className="column">
                <label htmlFor="username" className="color-olive my-1"> Username</label>
                <input id="username" type="text" className="txt-box" />

                <label htmlFor="password" className="color-olive my-1">Password </label>
                <input id="password" type="password" className="txt-box" />


                <button type="submit" className="mt-4 olive login-btn-large">Login</button>
                <button type="button" className="my-1 olive bg-light btn-cancel" onClick={handleCancel}>Cancel</button>
            </form>
        </div>
  );
}

export default Login;

内容的提问来源于stack exchange,提问作者weak-coder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 23:36:04