Мне нужно использовать React Router
с проектом Laravel
.
Но когда я создаю маршрутизатор на React Router
и пытаюсь получить доступ, Laravel
обвиняет Route в отсутствии ошибки.
Как я могу использовать 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'));
Создайте маршрут, который отображает все на один контроллер, например:
Route::get('/{path?}', [ 'uses' => 'ReactController@show', 'as' => 'react', 'where' => ['path' => '.*'] ]);
Затем в вашем контроллере просто покажите HTML-страницу, содержащую отредактированный корневой документ:
class ReactController extends Controller { public function show () { return view('react'); } }
Затем выполняйте все как обычно с помощью маршрутизатора. Кажется, хорошо работает для меня.
Обновление для Laravel 5.5 Если вы являетесь контроллером, возвращаете только представление (как в примере выше), вы можете поменять весь приведенный выше код с этим в файле маршрутов:
Route::view('/{path?}', 'path.to.view') ->where('path', '.*') ->name('react');
На основании ответа Джейка Тейлора (кстати, это правильно): он имеет небольшую ошибку, отсутствует кавычка после '/{path?}'
, Только последняя.
Кроме того, если вам не нужно использовать контроллер и просто перенаправить обратно на свой вид, вы можете использовать его следующим образом:
Route::get( '/{path?}', function(){ return view( 'view' ); } )->where('path', '.*');
Примечание. Обязательно добавьте этот маршрут в конце всех ваших маршрутов в файле маршрутов (web.php для Laravel 5.4), поэтому каждый существующий действующий маршрут может быть уловлен до достижения последнего.
Вы можете вернуть свою индексную страницу, и browserHistory of React будет обрабатывать все остальное.
Route::pattern('path', '[a-zA-Z0-9-/]+'); Route::any( '{path}', function( $page ){ return view('index'); });
Мне кажется, это работает для меня
Route::get('{reactRoutes}', function () { return view('welcome'); // your start view })->where('reactRoutes', '^((?!api).)*$'); // except 'api' word
Route::get('api/whatever/1', function() { return [ 'one' => 'two', 'first' => 'second' ]; }); Route::get('api/something/2', function() { return [ 'hello' => 'good bye', 'dog' => 'cat' ]; });
Если вы используете v4, как насчет использования <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> <div> <div> <ul> <li><Link to="/profile" replace>Profile</Link></li> </ul> </div> <div> <Route path="/profile" component={Profile}/> </div> </div> </HashRouter> ); } }
В маршрутизаторе Laravel …
Route::get('/', function(){ return view('index'); //This view is supposed to have the react app above });
С HashRouter
ваша маршрутизация на стороне клиента выполняется с помощью #
(Идентификатор фрагмента), который не считывается маршрутизацией Laravel (например, маршрутизация на стороне сервера)
По прибытии на эту страницу URL /
.
При нажатии на ссылку появятся URL /#/posts
и компонент.
После этого, если вы обновите страницу, вы не увидите «Ошибка Route not exist
. Это связано с тем, что, с точки зрения Ларавеля, URL-адрес все еще /
. ( Profile
компонента все еще остается там.)
https://reacttraining.com/react-router/web/api/HashRouter
Надеюсь, мои объяснения понятны.