【问题标题】:Laravel routes with multiple slugs won't work in React具有多个 slug 的 Laravel 路由在 React 中不起作用
【发布时间】:2019-07-02 02:25:01
【问题描述】:

我有一个带有 Laravel 后端/React.js 前端的应用程序。我正在使用反应路由器,以便完成这项工作,我有任何指向控制器的路径,该控制器将视图与其中的组件一起加载。但是,当我在反应端添加嵌套路由时,即“blog/:blogId”,它似乎完全跳过了加载组件的标签,而是向我显示 Laravel 视图中的内容。

我原来有:

`Route::get('/{slug?}', 'ProjectsController@index'`

我试过了:

`Route::any('{path}', function($path){
    $projects = Project::all();
    $posts = Post::all();
    return view('welcome', compact('projects', 'posts'));
})->where('path', '.*');`

这也不行:

`Route::get('/{slug?}/{id?}', 'ProjectsController@index'`

我想要的是 /blog 和 /blog/2 都转到 ProjectsController@index 以加载带有反应标记的视图。

我在ProjectsController中的索引函数中的数据是:

  `$projects = Project::all();
    $posts = Post::all();

    //return $projects;
    return view('welcome', compact('projects', 'posts'));`

以前有人遇到过这种情况吗?谢谢。

更新:

控制器索引方法返回的欢迎视图:

<div id="content"></div> 是我的基本组件正在加载的位置。因此,当导航到路由“/blog”时,我会看到我的组件,当导航到“/blog/anything”时,我会看到 Laravel 的登录和注册链接。

`@extends('layout')

@section('content')

    @if (Route::has('login'))
        <div class="top-right links">
            @if (Auth::check())
                <a href="{{ url('/home') }}">Home</a>
            @else
                <a href="{{ url('/login') }}">Login</a>
                <a href="{{ url('/register') }}">Register</a>
            @endif
        </div>
    @endif

<div id="content"></div>

@include('partials._scripts')

@endsection`

使用链接的组件:

`<a href={`/blog/${item.id}`} target="_blank">View here</a>

                    <Route path="/blog/:blogId" component={Post} />`

我在基础组件中的其他路由:

`<Switch>
<Route exact path="/" render={(props)=> <Home text={text} mobileNavIsOpen={hamburgerOpen} backgroundImage={background}/>} />
<Route path="/projects" component={Projects} />
<Route path="/blog" component={Blog} />
<Route component={NotFound} />
</Switch>`

我已尝试将 /blog/:blogId 路由与其他路由一起放在基础应用程序中 - 仍然没有区别。

更新:

当从 react router 中删除 /blog/ 路由标签并只保留 '/blog/:blogId 时,它具有相同的效果。

更新/部分解决:

(\\d+) 添加到我的反应路由器路径:path={/blog/:id(\\d+)} 正确地将我带到了嵌套组件。但是,它确实也加载了刀片视图内容,因此作为临时修复,我取出了显示的刀片内容。很高兴看看是否有人有其他方法。谢谢。

【问题讨论】:

  • 如果你想通过 laravel 路由处理 blog/:blogId 为什么需要 react 路由?
  • 嗨@aseferov,并不是我希望它由laravel路由处理,而是我需要将任何路径(包括它们的子路径)指向处理我的组件的视图,以便做出反应。因此,如果我想要 blog:/blogId,我需要告诉 laravel 路由也将这些路径指向视图。
  • 请在组件中添加浏览用户 blog/:blogId 的视图部分
  • @aseferov 请参阅上面的更新
  • 您需要更改 /blog/${item.id}} target="_blank">查看此处 以响应链接组件 /blog/${item.id}}

标签: php reactjs laravel react-router laravel-routing


【解决方案1】:

试试这个

Route::get('/{any}', 'ProjectController@index')->where('any', '.*');

这基本上是添加到 routes/web.php 的末尾,因为很可能您正在尝试构建一个 SPA,并且您希望所有 http 请求都由 react 路由器处理。

更新: 根据您的更新,我了解到您希望 /blog/blog/:ID 都以相同的方法处理。可以这样完成

Route::get('blog/{id?}', 'ProjectController@index')->where('id', '[0-9]+');

如果您需要索引方法中的 ID,请将其作为该方法的第一个参数并将其发送到视图。

【讨论】:

  • 这给了我相同的结果,它只在我在控制器方法中返回数据时有效,但在我返回视图时无效。当我返回视图并导航到 /blog/2 时,它会带回 Blade.php 数据。当我返回一个视图并导航到 /blog 时,它会加载前端组件。请参阅上面更新的问题以及我的控制器功能中的内容。
  • 我已经尝试了建议的更新方法 - 结果相同,我什至将 id 传递给组件并明确告诉它导航到 /blog/id,id 是来自控制器的变量但什么都没有。
猜你喜欢
  • 2019-09-19
  • 2019-06-19
  • 2017-10-31
  • 1970-01-01
  • 2018-10-14
  • 2018-10-25
  • 2018-05-11
  • 2021-04-25
  • 2023-04-09
相关资源
最近更新 更多