(Vue-cli)二、初始路由vue-router&安装使用swiper插件&安装使用Echarts

1. Vue Router路由

Vue Router是Vue.js官方的路由管理器,可以实现页面的跳转。

(1) 安装路由

npm install vue-router

(2) 导入vue-router

为了使入口文件main.js尽量小,所以通常会在src文件夹中创建一个新的router文件夹,然后在该文件夹中创建index.js文件,通常将路由相关的所有信息放在该文件夹中。

import Vue from 'vue'                  //导入vue
import VueRouter from 'vue-router'     //导入路由
Vue.use(VueRouter)                     //使用路由

(3) 创建路由器

将创建的路由对象使用export default直接导出,然后再在main.js中导入当前项目中的路由器对象 import router from ' ./router '

// 导入页面组件
import Home from './pages/Home.vue'
import List from './pages/List.vue'

// 创建路由器对象
export default new VueRouter({
  // 定义当前路由器对象管理的路由信息
  routes: [
    // 每一条路由信息,就是一个对象
    {
      // 路由路径
      path:'/home',
      // 路由名称
      name:'home',
      // 路由组件
      component:Home
    },                                                                                                
    {
      path: '/list',
      name: 'list',
      component: List
    }
  ]
})

(4) 配置路由器

// 导入当前项目中创建的路由器对象
import router from './router'
new Vue({
  render: h => h(App),
  // 在Vue的实例上,配置一个路由器对象
  router:router
}).$mount('#app')

此时路由的准备工作已经完成 <( ̄︶ ̄)↗[GO!]**

(5) 使用路由

在App.vue中引入路由视图组件,用于呈现路由页面 <router-view></router-view>
在App.vue中引入路由链接组件,用于跳转路由 <router-link></router-link>

① 路由组件跳转
router-link是路由链接组件,用于跳转路由。通过传入 to 属性指定链接, 即要显示的内容。router-link默认会被渲染成一个 <a> 标签。
router-view是路由视图组件,用于呈现路由页面。

<router-link to="/home">首页</router-link>
<router-link to="/list">列表</router-link>
<router-view></router-view>

② 编程式路由跳转
$router 返回的是当前vue实例里面的路由器对象,给router-link标签绑定一个点击效果方法,通过 push 方法可以跳转路由,此种方法不可以连续点击同一个路由对象,会报错,解决的方式如下,添加判断条件:如果所要点击的页面的路由路径不是当前页面的路由路径,则点击有效。
编程式路由跳转,可以在跳转之前,做各种验证,比如判断权限等等。
$route返回的是当前路由信息。
$router是当前vue实例里面的路由器对象。
push()通过push方法,跳转路由,并将路由地址添加到历史记录。需要注意,不能反复push同一个路由地址。
replace()通过repalce方法,跳转路由,它将当前地址替换历史记录里的最近一条地址。

<button @click="gotoHome">首页</button>&nbsp;
<button @click="gotoList">列表</button>
<router-view></router-view>
  methods: {
    gotoHome() {
      if (this.$route.path !== "/home") {
        this.$router.push("/home");
      }
    },
    gotoList() {
      if (this.$route.path !== "/list") {
        this.$router.push("/list");
      }
    }
  }

2.安装使用swiper插件(低版本)

Swiper是纯javascript打造的滑动特效插件,面向手机、平板电脑等移动终端。Swiper能实现触屏焦点图、触屏Tab切换、触屏轮播图切换等常用效果。

(1) 安装
npm install swiper@5 vue-awesome-swiper@4
(2) 导入

① 全局导入
在入口文件main.js中全局导入。

import VueAwesomeSwiper from 'vue-awesome-swiper'     // 导入swiper
import 'swiper/css/swiper.css'                        // 导入swiper的样式
Vue.use(VueAwesomeSwiper)                             // 因为swiper是插件,所以要use

② 局部导入
在需要使用swiper插件的页面组件(views下的xxx.vue)中引入。
局部导入的优势:只有在页面组件使用swiper插件时,才会引入插件,起到一个懒加载作用;全局导入不管是否使用,都会引入。局部更有利于性能优化,全局更方便开发。

// 导入swiper的组件
import { Swiper, SwiperSlide } from 'vue-awesome-swiper'
// 导入swiper的样式
import 'swiper/css/swiper.css'
export default {
    // 注册组件
    components: {
        Swiper,
        SwiperSlide
    }
}
(3) 使用
 <div class="box">
  <!-- swiper组件,options属性设置配置选项 -->
  <swiper :options="swiperOptions">
    <!-- swiper组件的每一项 -->
    <swiper-slide>
        <img src="http://p1.music.126.net/Y6gItVxUvkbvI2cC8KVZYA==/109951166461233203.jpg?imageView&quality=89">
    </swiper-slide>
    <swiper-slide>
        <img src="http://p1.music.126.net/ypjEcAl-BXKqb2UWdau-Tw==/109951166463199078.jpg?imageView&quality=89">
    </swiper-slide>
    <swiper-slide>
        <img src="http://p1.music.126.net/_7zX4BjboCYo4KYRvpayDg==/109951166461246383.jpg?imageView&quality=89">
    </swiper-slide>
    <swiper-slide>
        <img src="http://p1.music.126.net/3Vwphalm49ewNV-lIJUBNA==/109951166461279853.jpg?imageView&quality=89">
    </swiper-slide>
    <!-- 分页器 -->
    <div class="swiper-pagination" slot="pagination"></div>
    <!--左箭头。如果放置在swiper-container外面,需要自定义样式。-->
    <div class="swiper-button-prev" slot="button-prev"></div>
    <!--右箭头。如果放置在swiper-container外面,需要自定义样式。-->
    <div class="swiper-button-next" slot="button-next"></div>
  </swiper>
</div>
  data() {
    return {
      // 定义swiper的配置选项
      swiperOptions: {
        // 指定分页器
        pagination: {
            // 指定分页器的容器
            el: ".swiper-pagination",
            // 点击分页器的指示点分页器会控制Swiper切换
            clickable:true
        },
        // 配置自动播放
        // autoplay:true
        autoplay:{
            //自动播放
            autoplay:true,
            // 设置间隔时间
            delay:3000,
            // 用户操作swiper之后,是否禁止autoplay
            disableOnInteraction:false
        },
        // 配置衔接滑动
        loop:true,
        // 箭头
        navigation:{
            nextEl: '.swiper-button-next',
            prevEl: '.swiper-button-prev',
        },
        // slide的切换效果
        effect:'cube',
      },
    }
  },
};

3. 安装使用Echarts

(1) 在创建的项目demo安装
npm install echarts --save
(2) 在需要使用图表库的组件中导入echarts对象
import * as echarts from 'echarts';
(3) 在需要使用图表库的组件中准备容器
  <div class="charts">
    <h3>在vue项目中使用ECharts</h3>
    <div id="main"></div>
  </div>

(4) 选择示例图

在官网找到想要的示例,下载示例。
(5) 引入 ECharts

基于准备好的dom初始化echarts实例,绘制图表。因为该项目是基于vue,所以需要在mounted生命周期中进行这一步(获取dom,需要在页面挂载完成后进行)。

① 折线图实例
在需要使用图表库的组件中export default对外输出本模块变量
通过axios获取后台数据。(注意:axios需要先安装,再导入)

组件中代码:

<script>
// 导入echarts
import * as echarts from 'echarts';

// 导入axios
import axios from 'axios'

export default {
  name: "List",
  data() {
    return {
      // 定义一份数据
      list:[]
    }
  },
  methods: {
    // 加载数据的方法
    async loadData(){
      // 向后台发送请求获取数据
      let {data} = await axios.get('data/data1.json')
      this.list = data
      // 调用渲染数据方法
      this.showData()
    },
    // 渲染数据的方法
    showData() {
      // 基于准备好的dom,初始化echarts实例
      var myChart = echarts.init(document.getElementById('container'));
      // 绘制图表
      myChart.setOption({
        // 标题
        title: {
          text: '收入记录'
        },
        // 提示框组件
        tooltip: {
          trigger: 'axis'
        },
        // 图例组件
        legend: {
          data: this.list.map(r=>r.name)
        },
        // 网格
        grid: {
          left: '3%',
          right: '4%',
          bottom: '3%',
          // 网格空间是否包含左侧的文本
          containLabel: true
        },
        // 工具栏
        toolbox: {
          // 各工具配置项
          feature: {
            // 保存为图片
            saveAsImage: {}
          }
        },
        // x轴数据
        xAxis: {
          type: 'category',
          boundaryGap: false,
          data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
        },
        // y轴数据
        yAxis: {
          type: 'value'
        },
        // 系列
        series: this.list.map(r=>{
          return{
            name:r.name,
            type:'line',
            data:r.money.map(m=>m.money)
          }
        })
      });
    }
  },
  // 页面挂载完成
  mounted() {
    this.loadData()
  },
};
</script>

public文件下data文件下data1.json数据:

[
    {
        "name":"鹿晗",
        "money":[
            {
                "data":"周一",
                "money":2000
            },
            {
                "data":"周二",
                "money":5000
            },
            {
                "data":"周三",
                "money":8000
            },
            {
                "data":"周四",
                "money":3500
            },
            {
                "data":"周五",
                "money":1500
            },
            {
                "data":"周六",
                "money":6700
            },
            {
                "data":"周日",
                "money":2000
            }
        ]
    },
    {
        "name":"张杰",
        "money":[
            {
                "data":"周一",
                "money":1200
            },
            {
                "data":"周二",
                "money":2300
            },
            {
                "data":"周三",
                "money":800
            },
            {
                "data":"周四",
                "money":4500
            },
            {
                "data":"周五",
                "money":2300
            },
            {
                "data":"周六",
                "money":1800
            },
            {
                "data":"周日",
                "money":2700
            }
        ]
    },
    {
        "name":"王明",
        "money":[
            {
                "data":"周一",
                "money":200
            },
            {
                "data":"周二",
                "money":500
            },
            {
                "data":"周三",
                "money":800
            },
            {
                "data":"周四",
                "money":350
            },
            {
                "data":"周五",
                "money":5000
            },
            {
                "data":"周六",
                "money":6500
            },
            {
                "data":"周日",
                "money":3700
            }
        ]
    }
]

效果:

② 饼图实例

<script>
// 导入echarts
import * as echarts from 'echarts';
export default {
  name: "List",
  data() {
    return {
      list:[
        { value: 1048, name: 'Search Engine' },
        { value: 735, name: 'Direct' },
        { value: 580, name: 'Email' },
        { value: 484, name: 'Union Ads' },
        { value: 300, name: 'Video Ads' }
      ]
    };
  },
  mounted() {
      // 基于准备好的dom,初始化echarts实例
      var myChart = echarts.init(document.getElementById("container"));
      // 绘制图表
      myChart.setOption({
        tooltip: {
          trigger: 'item'
        },
        legend: {
          top: '5%',
          left: 'center'
        },
        series: [
          {
            name: 'Access From',
            type: 'pie',
            radius: ['40%', '70%'],
            avoidLabelOverlap: false,
            itemStyle: {
              borderRadius: 10,
              borderColor: '#fff',
              borderWidth: 2
            },
            label: {
              show: false,
              position: 'center'
            },
            emphasis: {
              label: {
                show: true,
                fontSize: '40',
                fontWeight: 'bold'
              }
            },
            labelLine: {
              show: false
            },
            data: [
              // name:数据项名称
              // value:数据值
              ...this.list.map((r) => {
                return {
                  value: r.value,
                  name: r.name,
                };
              }),
            ]
          }
        ]
      });
  },
};
</script>

效果:
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容