zoukankan      html  css  js  c++  java
  • vue公共布局组件Layout引入

    需求,后台系统有一个公共的头部:

    这个在3个页面中写3份头部,肯定是不优雅的。vue提供的组件思想,我们可以将这个公共的头部组件化:src/components/HeaderComponent.vue

    <template>
      <header>
        <img src="../assets/images/logo.png" alt="" />
        <h1>智星云</h1>
        <ul v-if="showNav">
          <li
            v-for="(nav, index) in navArr"
            :key="index"
            :class="index === activeIndex ? 'active' : ''"
            @click="toNav(index, nav.path)"
          >
            {{ nav.name }}
          </li>
        </ul>
      </header>
    </template>
    <script>
    export default {
      data() {
        return {
          navArr: [
            {
              name: "云市场",
              path: "/store",
            },
            {
              name: "控制台",
              path: "/console",
            },
            {
              name: "文档",
              path: "/docs",
            },
          ],
          activeIndex: 0,
        };
      },
      created() {},
      methods: {
        toNav(index, path) {
          this.$router.push({
            path: path,
          });
        },
      },
      watch: {
        $route: {
          handler(newRoute) {
            let path = newRoute.path;
            this.activeIndex = this.navArr.findIndex((arr) => arr.path === path);
          },
          immediate: true,
        },
      },
    };
    </script>
    

     现在有了这个公共的头部组件,接下来是怎么引入的问题了。有以下3种办法:

    1.页面中用组件的方式引入

    import HeaderComponent from "../../components/HeaderComponent.vue";
    export default {
      components: { HeaderComponent },
    }
    

     这种做法不是不可以,只是在3个页面都这么做,一定不优雅的。

     2.嵌套路由的方式引入

    {
    
    	path: '/store',
    	component: HeaderComponent,
    	children: [
    		{
    			path: '/store',
    			component: StoreIndex,
    		}
    
    	]
    }
    

      

    这种相对于第一种,已经比较优雅。

    3.动态组件引入

    // App.vue
    <template>
      <div id="app">
        <component :is="layout">
          <router-view />
        </component>
      </div>
    </template>
    <script>
    import DefaultLayout from "./views/DefaultLayout.vue";
    import Layout from "./views/Layout.vue";
    export default {
      components: {
        DefaultLayout,
        Layout,
      },
      computed: {
        layout() {
          return this.$route.meta.layout || DefaultLayout;
        },
      },
    };
    </script>
    

      

    //路由
    { path: '/store', component: StoreIndex, meta: { title: '云市场', layout: 'Layout' } },

     

    //Layout.vue
    <template>
      <div>
        <HeaderComponent />
        <router-view />
      </div>
    </template>
    <script>
    import HeaderComponent from "../components/HeaderComponent.vue";
    export default {
      components: {
        HeaderComponent,
      },
    };
    </script>
    <style lang="less">
    </style>
    

      

    //defaultLayout
    <template>
      <router-view />
    </template>
    <script>
    export default {};
    </script>
    

      知乎账号:空格之王

  • 相关阅读:
    nginx学习,下载、安装。使用:正向代理、反向代理、负载均衡
    idea一键导入所有包
    开源小工具-随机生成图片验证码
    记一次Nginx报错403(Permission denied)
    记一次swf视频转mp4经历
    enumerate函数
    filter函数过滤序列
    RetinaNet pytorch implement from scratch 03--Focal Loss
    [读论文]Weighted Boxes Fusion 代替NMS的result ensemble
    Pytorch使用autograd.function自定义op
  • 原文地址:https://www.cnblogs.com/xiaochongchong/p/14933891.html
Copyright © 2011-2022 走看看