使用 Vue 3 在 InertiaJS 中定义全局组件

Rub*_*ati 7 inertiajs laravel vue.js vuejs3

我正在尝试构建一个应用程序作为Laravel 8.38 - InertiaJS 0.8.4Vue 3的前端堆栈。

我有多个布局,需要将其全局注册为Vue组件,以便我可以在应用程序中的任何地方使用它。我无法这样做,我的代码:

import { createApp, h } from 'vue';
import { App as InertiaApp, plugin as InertiaPlugin } from '@inertiajs/inertia-vue3';

const el = document.getElementById('app');

const app = createApp({
    render: () =>
        h(InertiaApp, {
            initialPage: JSON.parse(el.dataset.page),
            resolveComponent: (name) => require(`./../Pages/${name}`).default,
        }),
})
    .mixin({ methods: { route } })
    .use(InertiaPlugin);

app.component('app-market', () => import('./../layouts/AppMarketLayout')); //trying to import layout

app.mount(el);
Run Code Online (Sandbox Code Playgroud)

在页面内部,我尝试调用此布局组件:

<template>
    <div>
        <app-market-layout></app-market-layout>
    </div>
</template>
Run Code Online (Sandbox Code Playgroud)

无法获取,控制台中没有错误。

zar*_*pio 1

我有后端(管理面板)和前端(网站)的 2 种布局,实现如下。使用惯性默认中间件文件。

项目/应用程序/Http/Middleware/HandleInertiaRequests.php

class HandleInertiaRequests extends Middleware
{
    protected $rootView = 'app';

    public function rootView(Request $request)
    {
        if ($request->segment(1) == 'admin') {
            return 'admin';
        }

        return parent::rootView($request);
    }

    public function version(Request $request)
    {
        return parent::version($request);
    }

    public function share(Request $request)
    {
        return array_merge(parent::share($request), [
            //
        ]);
    }
}
Run Code Online (Sandbox Code Playgroud)

项目/资源/js/Shared/Frontend/Layouts/Layout.vue

<template>

    <Header />

    <slot />

    <Footer />

</template>

<script>
    import Header from '../Partials/Header'
    import Footer from '../Partials/Footer'
    export default {
        components: {
            Header,
            Footer
        },

        name: "FrontendLayout"
    }
</script>
Run Code Online (Sandbox Code Playgroud)

项目/资源/js/Pages/Frontend/Auth/Login.vue

<template>
    ...
</template>

<script>
    import Layout from '@/js/Shared/Frontend/Layouts/Layout';
    export default {
        
        layout: Layout,

        metaInfo: { title: 'Login' },

        data() {
            return {
                form: this.$inertia.form({
                    'email': '',
                    'password': '',
                    'remember': false
                })
            }
        },

        methods: {
            submit() {
                this.form.post(route('login.store'))
            }
        }
    }
</script>
Run Code Online (Sandbox Code Playgroud)