美文网首页前端之美-VueJs
四、撸vue/cli 3.+ 的正确姿势(layout的互相嵌

四、撸vue/cli 3.+ 的正确姿势(layout的互相嵌

作者: Baby_ed6e | 来源:发表于2019-04-26 16:22 被阅读0次

    1、大多数人知道layout布局

    大多数人只知道layout布局,大概就是header、footer、aside、content等,但是如果content模块里还有一个子模块,而且子模块也有很多公用部分,如何做?

    举个例子:
    (1)一个后台管理系统内,有一个预览个人中心模块,这个个人中心也和layout类,有header、footer、aside、content


    多层嵌套的模板

    (2)比如一个新闻模块和权限管理模块....,很多模块,每个模块都有自己单独的头部,都有自己单独的aside侧边栏,或者锚链接等,如何实现呢?
    很多朋友说,这其实不难,用一个组件就行,模块下的每个文件都引入这个组件即可,虽然确实可以这么实现,但是实现的成本可谓大大增加,其实这是一个误区。

    2、layout里可以嵌套模块单独模块的layout

    直接上代码,一般后台系统的模式大概如下

    <template>
        <a-layout>
            <a-layout-header>头部</a-layout-header>
            <a-layout-sider>侧边栏</a-layout-sider>
            <a-layout-content >
                <router-view /> 内容视图
            </a-layout-content>
            <a-layout-footer>底部</a-layout-footer>
        </a-layout>
    </template>
    

    对应的模块news

    <template>
        <div>
            <new-public>
                这个是新闻列表、新闻详细、新增新闻等,总之所有news公用的
                大部分人把它当做组件
            </new-public>
            <h1>这是新闻列表页面、新闻详细页、新增新闻页等</h1>
        </div>
    </template>
    

    3、实际上应该提取news的layout

    后台整体布局的layout

    <template>
        <a-layout>
            <a-layout-header>头部</a-layout-header>
            <a-layout-sider>侧边栏</a-layout-sider>
            <a-layout-content >
                <router-view /> 内容视图
            </a-layout-content>
            <a-layout-footer>底部</a-layout-footer>
        </a-layout>
    </template>
    

    news模块单独的layout,比如叫做 newsLayout.vue

    <template>
        <div>
            <new-public>
                这个是新闻列表、新闻详细、新增新闻等,总之所有news公用的
                大部分人把它当做组件
            </new-public>
             <router-view /> 内容视图
        </div>
    </template>
    

    新闻里的vue文件应该如下写法

    <template>
        <h1>这是新闻列表页面、新闻详细页、新增新闻页等,简介明了</h1>
    </template>
    

    这样做的效果要比每个页面引入公用的组件要强太多了!理论上我们可以更深的层次

    4、管理目录结构,管理路由

    结构划分

    router里的文件引用

    {
                path: "/",
                meta: {
                    title: "首页"
                },
                component: layout,  // 此处承接了所有后台页面公用的 头部、底部、侧栏等等
                children: [
                    {
                        path: "/",
                        name: "home",
                        meta: {
                            title: "欢迎使用"
                        },
                        component: () => import("@/views/home/index.vue")
                    },
                    {
                        path: "/news",
                        meta: {
                            title: "新闻"
                        },
                        component: newsLayout,   // 此处承接了news模块所有公用部分
                        children: [
                                  {
                                        path: "/",
                                        name: "news",
                                        meta: {
                                            title: "新闻列表"
                                        },
                                        component: () =>
                                            import("@/views/news/list.vue")
                                    },
                                    {
                                        path: "detail/:id",
                                        name: "news-info",
                                        meta: {
                                            title: "新闻详细"
                                        },
                                        component: () =>
                                            import("@/views/news/info.vue")
                                    },
                                    ...
                         ]
                    }
                ]
            },
    

    5、拓展+特别说明

    1、很多时候,我们在做一个news模块的时候,会把list文件当做模块首页。
    2、我们会遇到一个问题,如果list.vue 是一个路由最终级,那后续的info.vue,edit.vue 就必须是list.vue 同级别的,这让我们很难划分他们都是属于news 这个模块下的。
    3、很有可能我们的路由列表,是这样的:新闻的列表、新闻的详细、班级的列表、和班级详细全部都在一个层级,根本没有分目录,看起来特别乱,不是树结构。

    要保持树结构,按照路由分组清清楚楚,那就必须给分组一个组件承载,这个承载组件其实就是模块的layout.vue

    这种情况下,我们需要一个空白的承载体,也就是blank.vue,这样,我们就能无限级别的分组我们的路由

    <template>
        <router-view />
    </template>
    

    再回头看看我们的布局结构顺序
    1.后台整体布局的layout

    <template>
        <a-layout>
            <a-layout-header>头部</a-layout-header>
            <a-layout-sider>侧边栏</a-layout-sider>
            <a-layout-content >
                <router-view /> 内容视图
            </a-layout-content>
            <a-layout-footer>底部</a-layout-footer>
        </a-layout>
    </template>
    

    2.每个模块公用的空白承载组件 blank.vue

    <template>
        <router-view /> // 内容视图
    </template>
    

    3.新闻里的vue文件应该如下写法

    <template>
        <h1>这是新闻列表页面、新闻详细页、新增新闻页等</h1>
    </template>
    

    4.班级的vue文件写法如下

    <template>
        <h1>班级列表页面、班级详细页、班级新闻页等</h1>
    </template>
    

    5.路由结构,当然我们依然能够灵活的给每个模块添加一些特定的layout

    {
            path: "/",
            meta: {
                title: "首页"
            },
            component: layout,  // 后台每个页面都公用的布局
            children: [{
                    path: "/",
                    name: "home",
                    meta: {
                        title: "欢迎使用"
                    },
                    component: () =>
                        import("@/views/home/index.vue")
                },
                {
                    path: "/news",
                    meta: {
                        title: "新闻模块分组"
                    },
                    component: blank,  // 用户分组的blank组件,里面只有一个rooter-view
                    children: [{
                            path: "/",
                            name: "nwes",
                            meta: {
                                title: "新闻列表"
                            },
                            component: () =>
                                import("@/views/nwes/list.vue")
                        },
                        {
                            path: "info/:id",
                            name: "nwes-info",
                            meta: {
                                title: "新闻详细"
                            },
                            component: () =>
                                import("@/views/nwes/info.vue")
                        }
                    ]
                },
                {
                    path: "/newsRoom",
                    meta: {
                        title: "班级模块分组"
                    },
                    component: blank, // 用户分组的blank组件,里面只有一个rooter-view
                    children: [{
                            path: "/",
                            name: "newsRoom",
                            meta: {
                                title: "班级列表"
                            },
                            component: () =>
                                import("@/views/newsRoom/list.vue")
                        },
                        {
                            path: "info/:id",
                            name: "newsRoom-info",
                            meta: {
                                title: "班级详细"
                            },
                            component: () =>
                                import("@/views/newsRoom/info.vue")
                        }
                    ]
                },
            ]
        }
    

    相关文章

      网友评论

        本文标题:四、撸vue/cli 3.+ 的正确姿势(layout的互相嵌

        本文链接:https://www.haomeiwen.com/subject/tjzfnqtx.html