如何在 Laravel 中使用 React Router?

IT技术 javascript php laravel reactjs react-router
2021-03-25 17:45:38

我需要React Router与一个Laravel项目一起使用

但是当我在上面创建路由器React Router并尝试访问时,Laravel指责路由不存在错误。

如何使用React Router管理 Laravel 项目路线?

render((
    <Router history={browserHistory}>
        <Route path="/" component={App}/>
        <Route path="/profile" component={Profile}/> // this route I trying access
    </Router>
), document.getElementById('root'));
5个回答

创建一个将所有内容映射到一个控制器的路由,如下所示:

Route::get('/{path?}', [
    'uses' => 'ReactController@show',
    'as' => 'react',
    'where' => ['path' => '.*']
]);

然后在您的控制器中,只显示包含 react 根文档的 HTML 页面:

class ReactController extends Controller {
    public function show () {
        return view('react');
    }
}

然后用react-router做一切正常的事情。似乎对我来说效果很好。


Laravel 5.5 更新 如果您的控制器只返回一个视图(如上例所示),您可以在路由文件中将上述所有代码替换为:

Route::view('/{path?}', 'path.to.view')
     ->where('path', '.*')
     ->name('react');
我如何能够检测到不存在的路径?
2021-05-24 17:45:38
2021-05-31 17:45:38
@Mr.Pyramid{path?}部分意味着它将匹配任何 URL。如果你把它放在你的路由文件的底部,任何与先前定义的 URL 不匹配的东西都会在这个 URL 中匹配。
2021-06-02 17:45:38
@JakeTaylor 使用这种方法,如果您点击/bar/url,它将首先由 Laravel 处理,然后由 React-router 处理并显示其各自的组件?
2021-06-06 17:45:38
对于 React-router v4,您可以/somePath/{path?}在 React 中使用and then :<BrowserRouter basename="somePath">这将使您能够在 React 中动态路由路径,也可以直接链接子路径。
2021-06-17 17:45:38

基于杰克泰勒的回答(顺便说一句,这是正确的):它有一个小错误,在 之后缺少一个引号'/{path?}',只是最后一个。

此外,如果您不需要使用控制器而只需重定向回您的视图,您可以像这样使用它:

Route::get( '/{path?}', function(){
    return view( 'view' );
} )->where('path', '.*');

注意: 只需确保在路由文件(Laravel 5.4 的 web.php )中所有路由的末尾添加此路由,因此在到达最后一个之前,您可能会捕获所有现有的有效路由。

谢谢!这有效,但我收到控制台错误: DevTools failed to parse SourceMap: http://laravelreact.test/js/bootstrap.js.map
2021-06-06 17:45:38

这似乎对我有用

对于任何react路线

Route::get('{reactRoutes}', function () {
    return view('welcome'); // your start view
})->where('reactRoutes', '^((?!api).)*$'); // except 'api' word

对于 Laravel 路线

Route::get('api/whatever/1', function() {
    return [
        'one' => 'two',
        'first' => 'second'
    ];
});

Route::get('api/something/2', function() {
    return [
        'hello' => 'good bye',
        'dog' => 'cat'
    ];
});
效果很好,不错。
2021-06-21 17:45:38

怎么用<HashRouter>

例如

import React from 'react';
import {
    HashRouter,
    Route,
    Link
}from 'react-router-dom';
import Profile from './Profile';

export default class App extends React.Component {
    constructor(props) {
        super(props);
    }

    render() {
        return (
            <HashRouter>
                <Link to="/profile" replace>Profile</Link>
                <Route path="/profile" component={Profile}/>
            </HashRouter>
        );
    }
}

在 Laravel 的路由器中...

Route::get('/', function(){
    return view('index'); //This view is supposed to have the react app above
});

使用HashRouter,您的客户端路由是使用#(Fragment Identifier) 完成的,它不会被 Laravel 的路由读取(即服务器端路由)

到达此页面后,URL 为/

单击该链接将使 URL/#/profile和组件出现。

之后,如果您刷新页面,您将不会看到Route not exist错误。这是因为,从 Laravel 的角度来看,URL 仍然是/. (组件Profile仍然保留在那里。)

https://reacttraining.com/react-router/web/api/HashRouter

希望我的解释清楚。

@imperium2335 但它比点击后端来一次又一次地返回相同的静态视图要好得多,就像这里的所有其他答案一样。
2021-06-12 17:45:38
确实丑 但是,我无法通过任何其他方式使其工作。工作将 Laravel 8。谢谢。
2021-06-12 17:45:38
@Julian 服务器端不会在 react-router 的每次页面更改时调用。新负载将击中服务器,服务器将返回静态视图,然后从那里开始的任何路由/url 更改完全是客户端。
2021-06-13 17:45:38
但它像罪一样丑陋:(
2021-06-16 17:45:38

你可以返回你的索引页面,React 的 browserHistory 将处理其他任何事情。

Route::pattern('path', '[a-zA-Z0-9-/]+');
Route::any( '{path}', function( $page ){   
     return view('index');
});