后台管理系统——03解决联动效果以及面包屑导航以及添加Echarts

简介: 解决联动效果以及面包屑导航以及添加Echarts

在common/config/router.js中的layout写子组件路由

之前:

const routes = [
    {
      path: '/',
      name: 'layout',
      /* component: () => import('@/views/layout.vue') */
      component:'layout',
    },
    {
        // 这里就不用写path以及name,下面的函数已经给封装好了
      /* component: () => import('@/views/Login.vue') */
      component:'Login',
    },
    {
      path: '*',
      redirect:{name:'layout'}, 
    }
  ]

现在:

const routes = [{
  path: '/',
  name: 'layout',
  redirect:{name:'index'},
  /* component: () => import('@/views/layout.vue') */
  component: 'layout',
  children: [{
    meta: {title: '后台首页'},
    component: 'index/index'
  },
  {
    meta: {title: '商品列表'},
    component: 'shop/goods/list'
  }
  ]
  },
  {
  /* component: () => import('@/views/Login.vue') */
  component: 'Login',
  },
  {
  path: '*',
  redirect: {
    name: 'layout'
  },
  }
]

把views文件夹中的格式改成以下形式方便跳转对应的链接

b887bbc96cf24c49aa1bcf37f0d817c5.png

在shop/goods下新建list.vue页面

在router/index.js中添加防止出现重复导航的错误

//解决vue路由重复导航错误
//获取原型对象上的push函数
const originalPush = VueRouter.prototype.push
//修改原型对象中的push方法
VueRouter.prototype.push = function push(location) {
   return originalPush.call(this, location).catch(err => err)
}

接下来让头部进行跳转

数据结构如下:

collapse: false,
      navBar: {
        active: "0",
        list: [
          {
            name: "首页",
            subActive: "0",
            submenu: [
              {
                icon: "el-icon-s-home",
                name: "后台首页",
                pathname: "index",
              },
              {
                icon: "el-icon-s-claim",
                name: "商品列表",
                pathname: "shop_goods_list",
              },
            ],
          },
          {
            name: "商品",
            subActive: "0",
            submenu: [
              {
                icon: "el-icon-s-claim",
                name: "商品列表",
                pathname: "shop_goods_list",
              },
            ],
          },
          {
            name: "订单",
          },
          {
            name: "会员",
          },
          {
            name: "设置",
          },
        ],
      },

头部的方法:

// 路由跳转
      this.$router.push({
        name:this.submenus[0].pathname
      })

这里只需要用roueter.push({name})更改名称即可

点击后:

bc421e0bc54c47019cf0cf7270dc4633.png

点击前:

4810da2da1fb4af9924b7d85baef508a.png

侧边导航栏的路由跳转

// 路由跳转
      this.$router.push({
        name: this.submenus[key].pathname,
      });

因为路径也有可能是【】,所以要写个if语句判断

if (this.submenus.length > 0) {
        this.$router.push({
          name: this.submenus[0].pathname,
        });
      }

制作面包屑导航

<el-breadcrumb separator-class="el-icon-arrow-right">
  <el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
  <el-breadcrumb-item>活动管理</el-breadcrumb-item>
  <el-breadcrumb-item>活动列表</el-breadcrumb-item>
  <el-breadcrumb-item>活动详情</el-breadcrumb-item>
</el-breadcrumb>

获取当前路由对象this.$route

this.$route 表示当前路由对象,每一个路由都会有一个 route 对象,是一个局部的对象,可以获取对应的 name, path, params, query 等属性。 
    // 面包屑导航
    getBreadCrumb() {
      var getobj;
      getobj = this.$route
      console.log(getobj);
    },

a10317527d0d400c926f5bc8d7364a56.png

filter:过滤没有name的结构,只显示有name的结构

// 面包屑导航
    getBreadCrumb() {
      // 过滤出matched中的name
      var getobj = this.$route.matched.filter((v) => v.name);
      console.log(getobj);
      // 把三个参数放在新数组中
      let arrs = [];
      getobj.forEach((v) => {
        // 如果它的路径是layout页面或者是name为index页面,那么就不显示。因为首页是不需要显示面包屑
        if (v.name === "layout" || v.name === "index") {
          return;
        }
        arrs.push({
          name: v.name,
          path: v.path,
          title: v.meta.title,
        });
      });
      if (arrs.length > 0) {
        arrs.unshift({
          name: "index",
          path: "/index",
          title: "后台首页",
        });
      }
      this.arr = arrs;
      console.log(this.arr);
    },

放在mouted中调用此方法

vue 监听$route的方式

$route 作为vue实例的一个响应式属性,和在data中写的属性本质上是一样的,都可以通过this的方式拿到。既然你可以监听data中的属性变化,同样也可以监听 $route 的变化。watch中监听的对象默认回调函数中的参数值就是newVal,oldVal。作为 $route 属性来说当然也就是 to 和 from 的概念了。

所以这里要写一个监听器用来监听属性的变化

watch: {
    $route(to, from) {
      if (to.name === "index") {
        this.navBar.active = "0";
        this.slideMenuActive = "0";
      }
      this.getBreadCrumb();
    },
  },

为什么要用watch来监听呢?官网给出了详细的解释

0be01a9a646d4cf09198989164ea8cf4.png

当我们点击首页的时候只是希望对参数进行变化,而不是组件被复用。

el-main组件中  渲染面包屑导航的数据,写入以下代码:

<el-breadcrumb separator-class="el-icon-arrow-right" v-if="arr.length > 0">
   <el-breadcrumb-item :to="{ path: item.path }" v-for="(item, index) in arr" :key="index">            
      {{ item.title }}
   </el-breadcrumb-item>
</el-breadcrumb>

在子路由中新建index文件夹下的index.vue放入Echarts 图

5fe8cc4577344dd9ae183f9a139aa327.png

引入方式

npm install echarts --save

安装完成后再次启动项目可能会报错,这时重新安装一下npm install即可

index.vue

<template>
  <div >
    <div style="width:50%;text-align:center">
       <div ref="main" style="height:300px"></div>
    </div>
  </div>
</template>
<script>
import * as echarts from "echarts";
export default {
  name: "Index",
  data() {
    return {};
  },
  mounted() {
     this.chart()
  },
  methods: {
    chart() {
      var myChart = echarts.init(this.$refs.main);
      var option;
      option = {
        title: {
          text: "Basic Radar Chart",
        },
        legend: {
          data: ["Allocated Budget", "Actual Spending"],
        },
        radar: {
          // shape: 'circle',
          indicator: [
            { name: "Sales", max: 6500 },
            { name: "Administration", max: 16000 },
            { name: "Information Technology", max: 30000 },
            { name: "Customer Support", max: 38000 },
            { name: "Development", max: 52000 },
            { name: "Marketing", max: 25000 },
          ],
        },
        series: [
          {
            name: "Budget vs spending",
            type: "radar",
            data: [
              {
                value: [4200, 3000, 20000, 35000, 50000, 18000],
                name: "Allocated Budget",
              },
              {
                value: [5000, 14000, 28000, 26000, 42000, 21000],
                name: "Actual Spending",
              },
            ],
          },
        ],
      };
      option && myChart.setOption(option);
    },
  },
};
</script>
<style lang="scss" scoped>
</style>

最后在layout.vue中使用<router-view />进行渲染即可

<router-view></router-view>

效果如下:

d2b019c14a8f49758bbff842d3cb9647.png

a2e5cca8ec864a5aaefe7f2f20d168e7.png

765aae0bf6954d0fa1e6feb8282d8693.png

相关文章
|
Windows
ECharts 网站访问慢解决办法(Window系统)
ECharts 网站访问慢解决办法(Window系统)
2948 0
ECharts 网站访问慢解决办法(Window系统)
|
机器学习/深度学习 数据采集 存储
基于Python+flask+echarts的气象数据采集与分析系统,可实现lstm算法进行预测
本文介绍了一个基于Python、Flask和Echarts的气象数据采集与分析系统,该系统集成了LSTM算法进行数据预测,并提供了实时数据监测、历史数据查询、数据可视化以及用户权限管理等功能。
389 0
Echarts实战案例代码(35):股票智能跟踪分析系统
Echarts实战案例代码(35):股票智能跟踪分析系统
297 0
|
编解码 监控 数据可视化
数据可视化大屏应急管理综合指挥调度系统完整案例详解(PHP-API、Echarts、百度地图)
数据可视化大屏应急管理综合指挥调度系统完整案例详解(PHP-API、Echarts、百度地图)
511 0
|
数据可视化 数据挖掘 数据库
可视化 | Flask+Mysql+Echarts 豆瓣电影Top250数据分析系统
可视化 | Flask+Mysql+Echarts 豆瓣电影Top250数据分析系统
|
JavaScript 前端开发 数据挖掘
Echarts数据分析系统Data Analysis Platform使用说明文档
Echarts数据分析系统Data Analysis Platform使用说明文档
251 0
|
搜索推荐 定位技术
Echarts与bmap结合使用百度地图系统自带的12个个性化模板mapStyle列表
Echarts与bmap结合使用百度地图系统自带的12个个性化模板mapStyle列表
676 0
|
数据可视化 JavaScript 大数据
基于Springboot+Echarts的大数据可视化展示系统
基于Springboot+Echarts的大数据可视化展示系统
490 0
基于Springboot+Echarts的大数据可视化展示系统
|
11月前
|
小程序 前端开发 JavaScript
微信小程序图表制作利器:ECharts组件的使用与技巧
微信小程序图表制作利器:ECharts组件的使用与技巧
930 1

热门文章

最新文章