美文网首页vue 全家桶 + Element UI 实战
vue-cli3 + elementui 搭建后台管理界面(三)

vue-cli3 + elementui 搭建后台管理界面(三)

作者: charmingcheng | 来源:发表于2020-01-16 11:31 被阅读0次

    上一节搭好了主框架,但是标签页和侧边栏只是分别展示了各自的菜单,如何将二者联动起来?
    定义路由规则:当有 children 属性时,从 children 里取出 path 填充到侧边栏

    1 新增组件

    新增 views/dashboard/index.vue

    <template>
      <div>dashboard</div>
    </template>
    

    views/article/index.vue

    <template>
      <div>Article</div>
    </template>
    

    2 修改路由

    修改 src/router/index.js :

    import Vue from 'vue'
    import VueRouter from 'vue-router'
    import Login from '../views/Login'
    import Dashboard from '../views/dashboard'
    import Article from '../views/article'
    import Container from '../components/Container'
    
    Vue.use(VueRouter)
    
    const routes = [
      {
        path: '/',
        redirect: '/dashboard',
        name: 'Container',
        component: Container,
        children: [
          {
            path: 'dashboard', 
            name: '首页', 
            component: Dashboard,
          },
          {
            path: 'article', 
            name: '文章', 
            component: Article, 
          },
        ]
      },
      {
        path: '/login',
        name: 'Login',
        component: Login
      }
    ]
    
    const router = new VueRouter({
      mode: 'history',
      base: process.env.BASE_URL,
      routes
    })
    
    export default router
    

    3 页面主框架

    修改 src/components/Container.vue

    <template>
      <div class="app">
        <el-container>
          <el-aside class="app-side app-side-left" :class="isCollapse ? 'app-side-collapsed' : 'app-side-expanded'">
            <div class="app-side-logo">
              <img src="@/assets/logo.png"/>
            </div>
            <div class="app-side-content">
              <el-menu :default-active="defaultActive"
                       router
                       class="el-menu-vertical-demo"
                       @open="handleOpen"
                       :collapse="isCollapse">
                <template v-for="route in routes" >
                  <template v-if="route.children && route.children.length">
                    <el-menu-item v-for="item in route.children"
                                  :key="route.path + '/' + item.path"
                                  :index="item.path"
                      >
                      <i class="el-icon-menu"></i>
                      <span slot="title">{{ item.name }}</span>
                    </el-menu-item>
                  </template>
                </template>
              </el-menu>
            </div>
          </el-aside>
    
          <el-container>
            <el-header class="app-header">
              <div class="app-side-fold"
                   @click.prevent="toggleSideBar">
                <i v-show="!isCollapse" class="el-icon-s-fold"></i>
                <i v-show="isCollapse" class="el-icon-s-unfold"></i>
              </div>
              <el-menu default-active="/"
                       router
                       class="el-menu-demo tab-page"
                       mode="horizontal"
                       @select="handleSelect"
                       active-text-color="#409EFF">
                <el-menu-item index="/">首页</el-menu-item>
              </el-menu>
    
              <div class="app-header-userinfo">
                <el-dropdown trigger="hover"
                             :hide-on-click="false">
                  <span class="el-dropdown-link">
                    {{ username }}
                    <i class="el-icon-caret-bottom el-icon--right"></i>
                  </span>
                  <el-dropdown-menu slot="dropdown">
                    <el-dropdown-item>我的消息</el-dropdown-item>
                    <el-dropdown-item>设置</el-dropdown-item>
                    <el-dropdown-item divided
                                      @click.native="logout">退出登录</el-dropdown-item>
                  </el-dropdown-menu>
                </el-dropdown>
              </div>
            </el-header>
    
            <el-main class="app-body">
              <template>
                <router-view/>
              </template>
            </el-main>
          </el-container>
        </el-container>
      </div>
    </template>
    
    <script>
    export default {
      name: 'Container',
      data () {
        return {
          username: '',
          isCollapse: false,
        }
      },
      computed: {
        // 获取route路由
        routes () {
          return this.$router.options.routes
        } 
      },
      methods: {
        toggleSideBar () {
          this.isCollapse = !this.isCollapse
        },
        logout () {
          this.$confirm('确认退出?', '提示', {})
            .then(() => {
              sessionStorage.removeItem('user');
              this.$router.push('/login');
            })
            .catch(() => { });
        },
        handleOpen (key, keyPath) {
          console.log(key, keyPath);
        },
        handleClose (key, keyPath) {
          console.log(key, keyPath);
        },
        handleSelect (key, keyPath) {
          console.log(key, keyPath);
        },
      },
      mounted () {
        let user = sessionStorage.getItem('user');
        if (user) {
          this.username = user;
        }
      },
    }
    </script>
    
    <style lang="scss">
    ...
    
    

    此时的页面:


    2.png 3.png

    文章改编自大神博客:https://www.cnblogs.com/wbjxxzx/p/9943049.html,仅作为学习实践。

    相关文章

      网友评论

        本文标题:vue-cli3 + elementui 搭建后台管理界面(三)

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