zoukankan      html  css  js  c++  java
  • vue 嵌套路由

    在一个页面中如果想实现三个页面的拼接组成一个页面,这时候就用到嵌套路由了。

    第一种方法:

    1.顶部页面  /views/Home.vue

    <template>
      <el-container>
        <!-- 顶部 -->
        <el-header class="headerAll">
          <div class="headImage"></div>
          <!-- <img src=""
               class="headImage"> -->
          <el-menu :default-active="activeIndex"
                   class="el-menu-demo"
                   mode="horizontal"
                   background-color="#222a30"
                   text-color="#fff"
                   active-text-color="#29e2fe"
                   @select="handleSelect">
            <el-menu-item v-for="(item, index) in menuList"
                          :key="index"
                          :index="item.index"
                          v-on:listenToChildEvent="menuClick">{{item.name}}</el-menu-item>
          </el-menu>
    
          <el-dropdown>
            <img src="../assets/headImage.jpg"
                 class="drophead" />
            <el-dropdown-menu slot="dropdown">
              <el-dropdown-item>个人信息</el-dropdown-item>
              <el-dropdown-item>退出</el-dropdown-item>
            </el-dropdown-menu>
          </el-dropdown>
        </el-header>
    
        <!-- 跳转下左侧栏 menuSecond -->
        <router-view />
      </el-container>
    </template>
    
    <script lang="ts">
    import { Component, Vue } from "vue-property-decorator";
    
    @Component({
      components: {}
    })
    export default class Home extends Vue {
      data() {
        return {
          activeIndex: "1",
          menuList: [
            {
              name: "首页",
              index: "1",
              link: ""
            },
            {
              name: "车队基本信息",
              index: "2",
              link: ""
            },
            {
              name: "车队业务/交易管理",
              index: "3",
              link: ""
            },
            {
              name: "车队风险信息",
              index: "4",
              link: ""
            },
            {
              name: "车辆保险信息",
              index: "5",
              link: ""
            },
            {
              name: "车队估值/风险",
              index: "6",
              link: ""
            },
            {
              name: "车队财资",
              index: "7",
              link: ""
            },
            {
              name: "车队信贷",
              index: "8",
              link: ""
            }
          ]
        };
      }
    
      private handleSelect(key: any, keyPath: any) {
        switch (key) {
          case "1":
            this.$router.push({ path: "/" });
            break;
          case "4":
            this.$router.push({ path: "/menuSecond/1" });
            break;
          default:
            break;
        }
      }
    
      menuClick(data: any) {
        this.$router.push(data);
      }
    }
    </script>
    
    <style lang="scss">
    .headerAll {
      background: #222a30;
      margin-bottom: 20px;
      .headImage {
         150px;
        height: 100%;
        border: 0;
      }
      .drophead {
         40px;
        height: 40px;
        border-radius: 50%;
      }
    }
    </style>

    2.左侧栏页面  view/menuSecond.vue

    <template>
      <el-container class="menuSecond">
        <!-- 左侧栏 -->
        <el-aside width="200px"
                  class="asideClass">
          <el-menu :default-active="defaultActive"
                   class="el-menu-vertical-demo"
                   active-text-color="#303133"
                   @select="handleSelect">
            <el-menu-item v-for="(item, index) in filesList.navigeList"
                          :key="index"
                          :index="item.index">
              <span slot="title">{{item.name}}</span>
            </el-menu-item>
          </el-menu>
        </el-aside>
    
        <!-- 跳转右侧栏 menuThird  -->
        <router-view />
      </el-container>
    
    </template>
    
    <script lang="ts">
    import Vue from "vue";
    import files from "../jsonFile";
    
    export default Vue.extend({
      data() {
        return {
          filesList: files,
          selectIndex: 0,
          defaultActive: "1",
          currentPage4: 4
        };
      },
      methods: {
        handleSelect(key: String) {
          this.selectIndex = Number(key) - 1;
        }
      }
    });
    </script>
    
    
    <style lang="scss">
    .menuSecond {
      background: #f7f7f7;
      margin: 0 10px;
      .menuSecondRight {
        background: #fff;
        margin-left: 10px;
        .menuSecondH3 {
          margin-bottom: 40px;
        }
      }
      .el-pagination {
        margin-top: 30px;
        float: right;
      }
      .signTypeColor {
        color: #d40707;
      }
    }
    .el-menu {
      background: #fff;
    }
    </style>

    3.右侧栏页面  view/menuThird.vue

    <template>
      <el-container class="menuSecond">
        <el-main class="menuSecondRight">
          <h3 class="menuSecondH3">{{filesList.navigeList[this.selectIndex].name}}</h3>
          <el-table :data="tableData"
                    border
                    stripe
                    style=" 100%">
            <el-table-column type="index"
                             label="序号"
                             width="70"
                             align="center">
            </el-table-column>
            <el-table-column prop="name"
                             label="姓名"
                             width="110"
                             align="center" />
            <el-table-column prop="cardId"
                             label="身份证号"
                             align="center" />
            <el-table-column prop="driveId"
                             label="驾驶证号"
                             align="center" />
            <el-table-column prop="tel"
                             label="联系方式"
                             align="center" />
            <el-table-column prop="signType"
                             label="签约状态"
                             align="center">
              <template slot-scope="scope">
                <span :class="scope.row.signType === 0?'signTypeColor':''">{{scope.row.signType === 0?'未签约':'已签约'}}</span>
              </template>
            </el-table-column>
            <el-table-column label="司机风险数据"
                             align="center">
              <template slot-scope="scope">
                <el-button type="text"
                           v-if="scope.row.signType === 0"
                           class="signTypeColor">需签约</el-button>
                <el-button type="text"
                           v-else>查看</el-button>
              </template>
            </el-table-column>
          </el-table>
          <el-pagination @size-change="handleSizeChange"
                         @current-change="handleCurrentChange"
                         :current-page="currentPage4"
                         :page-sizes="[10, 20, 50, 100]"
                         :page-size="10"
                         layout="total, sizes, prev, pager, next, jumper"
                         :total="tableData.length">
          </el-pagination>
        </el-main>
      </el-container>
    
    </template>
    
    <script lang="ts">
    import Vue from "vue";
    import files from "../jsonFile";
    
    export default Vue.extend({
      data() {
        return {
          filesList: files,
          selectIndex: 0,
          defaultActive: "1",
          currentPage4: 4,
          tableData: [
            {
              name: "张三",
              cardId: "110430198801180456",
              driveId: "110430198801180456",
              tel: "13811111111",
              signType: 0
            }
          ]
        };
      },
      mounted() {
        this.defined();
      },
      methods: {
        defined() {
          for (let i = 0; i < 9; i++) {
            let object = {
              name: "张三",
              cardId: "110430198801180456",
              driveId: "110430198801180456",
              tel: "13811111111",
              signType: i === 0 ? 0 : 1
            };
            this.tableData.push(object);
          }
        },
        handleSizeChange(val: Number) {
          console.log(`每页 ${val} 条`);
        },
        handleCurrentChange(val: Number) {
          console.log(`当前页: ${val}`);
        }
      }
    });
    </script>
    
    
    <style lang="scss">
    .menuSecond {
      background: #f7f7f7;
      margin: 0 10px;
      .menuSecondRight {
        background: #fff;
        margin-left: 10px;
        .menuSecondH3 {
          margin-bottom: 40px;
        }
      }
      .el-pagination {
        margin-top: 30px;
        float: right;
      }
      .signTypeColor {
        color: #d40707;
      }
    }
    .el-menu {
      background: #fff;
    }
    </style>

    路由的配置  router.ts

    import Vue from 'vue'
    import Router from 'vue-router'
    import Home from './views/Home.vue'
    Vue.use(Router)
    
    export default new Router({
      mode: 'history',
      base: process.env.BASE_URL,
      routes: [
        {
          path: '/',
          name: 'home',
          component: Home,
          children: [
            {
              path: '/',
              name: 'homeView',
              component: () =>
                import(/* webpackChunkName: "about" */ './views/homeView.vue')
            },
            {
              path: 'menuSecond',
              name: 'menuSecond',
              children: [
                {
                  path: ':num',
                  name: 'menuThird',
                  component: () =>
                    import(/* webpackChunkName: "about" */ './views/menuThird.vue')
                }
              ],
              component: () =>
                import(/* webpackChunkName: "about" */ './views/menuSecond.vue')
            }
          ]
        }
      ]
    })
    

    第二种方法

    1.新建 view/layout.vue

    <template>
      <el-container>
      <!--顶部栏->
        <Head></Head>
        <el-container>
        <!-- 左侧栏 -->
          <Left></Left>
        <!--如右侧变,其他不变-->
          <router-view />
        </el-container>
      </el-container>
    
    </template>
    
    <script>
    import Head from '@/components/Head'
    import Left from '@/components/Left'
    
    export default {
      components: {
        Head,
        Left
      }
    }
    </script>
    

    2.新建components/Head.vue

    <template>
      <el-header class="headerAll">
        <div class="headImage"></div>
        <!-- <img src=""
               class="headImage"> -->
               <!-- 左侧栏 -->
        <el-menu :default-active="activeIndex"
                 class="el-menu-demo"
                 mode="horizontal"
                 background-color="#222a30"
                 text-color="#fff"
                 active-text-color="#29e2fe"
                 @select="handleSelect">
          <el-menu-item v-for="(item, index) in menuList"
                        :key="index"
                        :index="item.index"
                        v-on:listenToChildEvent="menuClick">{{item.name}}</el-menu-item>
        </el-menu>
    
        <el-dropdown>
          <img src="../assets/headImage.jpg"
               class="drophead" />
          <el-dropdown-menu slot="dropdown">
            <el-dropdown-item>个人信息</el-dropdown-item>
            <el-dropdown-item>退出</el-dropdown-item>
          </el-dropdown-menu>
        </el-dropdown>
      </el-header>
    </template>
    
    <script lang="ts">
    import { Component, Vue } from "vue-property-decorator";
    
    @Component({
      components: {}
    })
    export default class Home extends Vue {
      data() {
        return {
          activeIndex: "1",
          menuList: [
            {
              name: "首页",
              index: "1",
              link: ""
            },
            {
              name: "车队基本信息",
              index: "2",
              link: ""
            },
            {
              name: "车队业务/交易管理",
              index: "3",
              link: ""
            },
            {
              name: "车队风险信息",
              index: "4",
              link: ""
            },
            {
              name: "车辆保险信息",
              index: "5",
              link: ""
            },
            {
              name: "车队估值/风险",
              index: "6",
              link: ""
            },
            {
              name: "车队财资",
              index: "7",
              link: ""
            },
            {
              name: "车队信贷",
              index: "8",
              link: ""
            }
          ]
        };
      }
    
      private handleSelect(key: any, keyPath: any) {
        switch (key) {
          case "1":
            this.$router.push({ path: "/" });
            break;
          case "4":
            this.$router.push({ path: "/menuThird" });
            break;
          default:
            break;
        }
      }
    
      menuClick(data: any) {
        this.$router.push(data);
      }
    }
    </script>
    
    <style lang="scss">
    .headerAll {
      background: #222a30;
      margin-bottom: 20px;
      .headImage {
         150px;
        height: 100%;
        border: 0;
      }
      .drophead {
         40px;
        height: 40px;
        border-radius: 50%;
      }
    }
    </style>
    

    3.新建 components/Left.vue

    <template>
      <!-- 左侧栏 -->
      <el-aside width="200px"
                class="asideClass">
        <el-menu :default-active="defaultActive"
                 class="el-menu-vertical-demo"
                 active-text-color="#303133"
                 @select="handleSelect">
          <el-menu-item v-for="(item, index) in filesList.navigeList"
                        :key="index"
                        :index="item.index">
            <span slot="title">{{item.name}}</span>
          </el-menu-item>
        </el-menu>
      </el-aside>
    </template>
    
    <script lang="ts">
    import Vue from "vue";
    import files from "../jsonFile";
    
    export default Vue.extend({
      data() {
        return {
          filesList: files,
          selectIndex: 0,
          defaultActive: "1",
          currentPage4: 4
        };
      },
      methods: {
        handleSelect(key: String) {
          this.selectIndex = Number(key) - 1;
        }
      }
    });
    </script>
    
    
    <style lang="scss">
    .menuSecond {
      background: #f7f7f7;
      margin: 0 10px;
      .menuSecondRight {
        background: #fff;
        margin-left: 10px;
        .menuSecondH3 {
          margin-bottom: 40px;
        }
      }
      .el-pagination {
        margin-top: 30px;
        float: right;
      }
      .signTypeColor {
        color: #d40707;
      }
    }
    .el-menu {
      background: #fff;
    }
    </style>
    

    4.路由配置

    import Vue from 'vue'
    import Router from 'vue-router'
    // import Home from './views/Home.vue'
    import layout from './views/layout.vue'
    
    Vue.use(Router)
    
    export default new Router({
      mode: 'history',
      base: process.env.BASE_URL,
      routes: [
        {
          path: '/',
          name: 'home',
          component: layout,
          children: [
            {
              path: '/',
              name: 'homeView',
              component: () =>
                import(/* webpackChunkName: "about" */ './views/homeView.vue')
            },
            {
              path: 'menuSecond',
              name: 'menuSecond',
              component: () =>
                import(/* webpackChunkName: "about" */ './views/menuSecond.vue')
            },
            {
              path: 'menuThird',
              name: 'menuThird',
              component: () =>
                import(/* webpackChunkName: "about" */ './views/menuThird.vue')
            }
          ]
        }
      ]
    })
    

      

  • 相关阅读:
    Codeforces Round #388(div 2)
    Codeforces Round #387(div 2)
    Codeforces Round #386(div 2)
    Codeforces Round #385(div 2)
    Codeforces Round #384(div 2)
    Wannafly Union Goodbye 2016
    写在2016的最后一天——给未来的自己
    2016HDU校赛
    2016BUAA校赛决赛
    codevs 1344 模拟退火
  • 原文地址:https://www.cnblogs.com/gqx-html/p/11263453.html
Copyright © 2011-2022 走看看