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

React Router结合Laravel时组件无法显示的问题求助

嘿,我来帮你解决这个路由问题!

我一眼就发现了核心问题,再结合你的代码细节,咱们一步步把它修好:

1. 路由结构的致命错误:Switch的子元素规则

你的<Switch>组件直接包裹了一个<div className="App">,但React Router的Switch要求直接子元素必须是<Route>或者<Redirect>组件。Switch会遍历自己的直接子元素来匹配路由,嵌套在div里的Route根本不会被它识别,这就是AdminLogin组件死活不显示的原因!

调整你的app.js代码,把div移到Switch外面:

import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';
import AdminLogin from './AdminLogin';

export default class AdminApp extends Component {
  render() {
    return (
      <Router>
        {/* 把App容器放在Switch外层,这样所有路由组件都会继承这个样式容器 */}
        <div className="App">
          <Switch>
            {/* 这里直接放Route,Switch才能正常识别匹配 */}
            <Route path="/" exact component={AdminLogin} />
            {/* 以后加dashboard路由也直接放这里 */}
            {/* <Route path="/dashboard" component={AdminDashboard} /> */}
          </Switch>
        </div>
      </Router>
    );
  }
}

if (document.getElementById('app')) {
  ReactDOM.render(<AdminApp />, document.getElementById('app'));
}

2. 修复AdminLogin里的小bug

你的表单提交方法里,e.preventDefault少了括号!这会导致表单默认提交行为没被阻止,可能引发页面刷新,影响路由跳转:

onSubmit(e){
  e.preventDefault(); // 加上括号,调用这个方法阻止默认行为
  const user = {
    email : this.state.email,
    password : this.state.password
  }
  adminLogin(user).then(res => {
    if(res) {
      this.props.history.push('/dashboard');
    }
  })
}

3. 配置Laravel后端支持前端路由

因为你用的是BrowserRouter,需要让Laravel把所有前端路由请求都指向React的入口页面,避免刷新页面时出现404。在routes/web.php里添加这条路由:

Route::get('/{any}', function () {
    return view('welcome'); // 这里改成你的React入口视图文件名
})->where('any', '.*');

它会捕获所有GET请求,返回你的React页面,让前端路由接管路径匹配。

最后验证

修改完这些后,重新编译React资源(运行npm run dev或者npm run watch),刷新页面就能看到AdminLogin组件的"Login Now"标题啦!

内容的提问来源于stack exchange,提问作者Patrick Obafemi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:06:12