如何在React Router上使用Laravel路由

时间:2019-01-07 16:38:32

标签: javascript php reactjs laravel

我将React集成到了laravel项目中。我开始使用react路由器,但现在我想切换回Laravel路由。

是否可以像Vue一样将我的React组件全局注入到我的刀片文件中?

对于设置React路由,我使用以下通配符:

Route::view('/{path?}', 'layouts.app');

当我尝试恢复正常的laravel路由时,出现以下错误

错误

  

未捕获的错误:目标容器不是DOM元素。

我的web.php

Route::get('/', 'PageController@index');

控制器

class PageController extends Controller
{
    public function index()
    {
        return view('layouts.index');
    }
}

Layouts.app文件

<body>
    <div class="main">
        @section('content')
    </div>
    <script src="{{ asset('js/test.js') }}"></script>
    <script src="{{ asset('js/app.js') }}"></script>
</body>

Index.blade

@extends('layouts.app')

@section('content')
<Call> </Call>
@endsection

反应

App.js

import React, { Component } from 'react'
import ReactDOM from 'react-dom'
import { BrowserRouter, Route, Switch } from 'react-router-dom'
import Header from './Header'
import Call from './Call'
import Recipient from './Recipient';
import Avatar from './Avatar';
import registerServiceWorker from '../registerServiceWorker';

class App extends Component {
  render () {
    return (
      <BrowserRouter>
        <div>
          <Header />
          <Switch>
            <Route exact path='/' component={Call} />
            <Route exact path='/rusthuis' component={Recipient} />
            <Route exact path='/avatar' component={Avatar} />
          </Switch>
        </div>
      </BrowserRouter>
    )
  }
}

ReactDOM.render(<App />, document.getElementById('app'))
registerServiceWorker();

3 个答案:

答案 0 :(得分:0)

目标容器不是DOM元素,因为在您的HTML中,您没有div,其ID为app

您应将layouts.app的html更改为此:

<body>
    <div id="app" class="main">
        @section('content')
    </div>
    <script src="{{ asset('js/test.js') }}"></script>
    <script src="{{ asset('js/app.js') }}"></script>
</body>

答案 1 :(得分:0)

放入您的

ListView

在网络路线的末尾,以便最后将其加载以获取所有视图

答案 2 :(得分:0)

默认情况下 Laravel(6) 已经在使用 id="app" 所以在你的 react index.blade.php,即你定义你的 react 入口点的地方,使用不同的 id 名称来防止 react App.js 覆盖你的普通 Laravel 文件,即:

index.blade.php

<!doctype html>
<html lang="{{ app()->getLocale() }}">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        
        <!-- csrf token -->
        <meta name="csrf-token" content="{{ csrf_token() }}">

        <!-- styles -->
        <link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
        <link rel="preconnect" href="https://fonts.gstatic.com">
        <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@300;400&display=swap" rel="stylesheet">
        <link href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet">
        <link href="{{ asset('css/app.css') }}" rel="stylesheet">
    </head>

    <body>
        <div id="app-react"></div>
        <script src="{{ asset('js/app.js') }}"></script>
    </body>
</html>

App.js

import React from "react";
import { BrowserRouter as Router, Switch, } from "react-router-dom";
import Home from "./Home";
function App() {
    return (
        <React.Fragment>
            <Navbar />
            <Switch>
                <Route exact path="/" component={Home}></Route>
                <Route component={Default}></Route>
            </Switch>
        </React.Fragment>
    );
}

export default App;

if (document.getElementById("app-react")) {
    ReactDOM.render(
        <Router>
            <App />
        </Router>,
        document.getElementById("app-react")
    );
}

使用以下路线

Route::get('/{path?}',function(){
    return view('app');
});

{path?} 代表任何事物(词)

第一级 URL 会影响反应,但更高级别即

Route::view('/user/links','bladefile')

在我们的案例中,链接将是合法的 Laravel 路由。