繁体   English   中英

如何通过反应路由器使用 Laravel 路由

[英]How to use Laravel routes over react router

我在我的 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>

索引刀片

@extends('layouts.app')

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

反应

应用程序.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();

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

你应该将你的 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>

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

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>

应用程序.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 路由。

把你的

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM