【问题标题】:How to use Laravel routes over react router如何在反应路由器上使用 Laravel 路由
【发布时间】:2019-06-02 08:27:14
【问题描述】:

我在我的 laravel 项目中集成了 React。我开始使用 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();

【问题讨论】:

    标签: javascript php reactjs laravel


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      默认情况下,Laravel(6) 已经在使用id="app",所以在你的 react index.blade.php 中,即你定义你的 react 入口点的地方,使用不同的 id 名称来防止反应 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 路由。

      【讨论】:

        【解决方案3】:

        把你的

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

        在网络路由的末尾,以便最终加载它以获得您的所有视图

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-01-04
          • 1970-01-01
          • 2023-04-11
          • 2018-11-05
          • 2019-02-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多