如何在 Nuxt2 中写一个嵌套的 Layout


例如我们使用 Nuxt2 开发了一个用于内嵌在某个 App内的网页项目,封装一个 Layout,里面有一些公共模块,比如弹窗、toast 消息、loading 等方便我们全局调用。

App 内有一个分享功能可以将我们的某些页面分享出去,被分享出去的页面会包含一些只在App外使用的相关模块, 但同时只在 App内使用的网页将不会包含这些 App外的模块。

也许我们可以用一个 if 语句将 App外的模块单独区分,但这样做会使只在 App内打开的网页与不相关的代码交织在一起。所以我们最好将 App外的模块单独放到一个 Layout 中。然后通过引用的方式把另一个公共模块以嵌套的方式包含进来。

实现:

首先在公共模块 Layout 文件中增加一个 slot 插槽


                    // 公共模块布局文件: layouts/default.vue

                    <template>
                        <div> 
                            <!-- 一些公共模块 -->
                            <Toast />
                            <Loading />
                            <Alert />

                            <!-- 增加一个 slot 插槽 -->
                            <slot />

                            <nuxt/>

                        </div>
                    </template>
                

然后在 App外使用的模块中引用公共模块布局文件


                    // App外使用的模块 layouts/app-outsite.vue

                    <template>
                        <DefaultLayout>

                            <!-- 一些App外使用的模块 -->
                            <DownloadApp />
                            <OpenInApp />

                        </DefaultLayout>
                    </template>

                    <script>
                    import DefaultLayout from '~/layouts/default.vue';

                    export default {
                        components: {
                            DefaultLayout,
                        },
                    };
                    </script>
                

最后,我们对只在 App内使用的网页使用 layout: "default" 布局,它不会包含任何 App外的模块。需要在 App外使用的页面使用 layout: "app-outsite" 布局,它同时包含公共模块与 App外使用的模块。

Nuxt3

注意,本案例仅适用于 Nuxt2 的版本,最新的 Nuxt3 对于 Layout 的使用有一些变更,但本文章的思路在 Nuxt3中依旧是有效的,大家可以自己尝试一下。