AntV F2和vue-cli构建移动端可视化视图过程详解


Posted in Javascript onOctober 08, 2019

AntV F2是蚂蚁金服旗下的一个专注于移动,开箱即用的可视化解决方案,完美支持 H5 环境同时兼容多种环境(Node, 小程序,Weex),完备的图形语法理论,满足你的各种可视化需求,专业的移动设计指引为你带来最佳的移动端图表体验。

AntV F2官方文档地址:https://antv.alipay.com/zh-cn/f2/3.x/

话不多说,直接进入正题:

Antv F2官方比较友好,给我们提供了两种方式方便我们使用,分别是CDN方式(引入在线资源 <script src="https://gw.alipayobjects.com/os/antv/assets/f2/3.3.8/f2.min.js"></script>)和npm安装方式,因为项目是vue-cli搭建的,同时CDN方式引入比较简单,引入文件即可使用,所以在项目中使用的是npm安装;

安装命令(必须在项目对应的文件夹路径下运行):

npm install @antv/f2 --save

安装完依赖之后接着就是需要引用到项目中,这里有个坑,官方提供的引用方式在vue里面是会报错的,官方提供的方式是下图

AntV F2和vue-cli构建移动端可视化视图过程详解 

如果在项目中是 import F2 from "@antv/f2" 这样引用是会报语法错误的,报错信息为:“chart.pieLabel is not a function”,所以安装方式建议修改为

import F2 from "@antv/f2/lib/index-all",这样引用是可以正常使用不报错的,亲测可用;

安装完依赖和引用文件资源之后,就可以直接进行图表配置和开发了;我在项目中用到了环形图,直接进入环形图Demo案例界面看看Demo,

https://antv.alipay.com/zh-cn/f2/3.x/demo/index.html#_%E9%A5%BC%E5%9B%BE,

首先使用的时候视图层很简单,一个大div包住canvas标签即可

<div class="chart-wrapper">
  <canvas id="mountNode"></canvas>
 </div>

接着就是数据逻辑层根据文档介绍:

 //模拟数据,也可以根据ajax进行请求后台数据 
var data = [{
  const: 'const',
  type: '交通出行',
  money: 51.39
 }, {
  const: 'const',
  type: '饮食',
  money: 356.68
 }, {
  const: 'const',
  type: '生活日用',
  money: 20.00
 }, {
  const: 'const',
  type: '住房缴费',
  money: 116.53
 }];
//配置视图id与上面html对应
 var chart = new F2.Chart({
  id: 'mountNode',
  pixelRatio: window.devicePixelRatio
 });

//定义渲染数据源
 chart.source(data);

//定义图表类型样式,其中radius和innerRadius可以更改环形的大小
 chart.coord('polar', {
  transposed: true,
  radius: 0.9,
  innerRadius: 0.5
 });
 chart.axis(false);
 //图表图例
 chart.legend(false);
 // 图表提示信息
 chart.tooltip(false);
 //这里可以配置更改环形中心文字
 chart.guide().html({
  position: ['50%', '50%'],
  html: '<div style="text-align: center;width:150px;height: 50px;">\n   <p style="font-size: 12px;color: #999;margin: 0" id="title"></p>\n   <p style="font-size: 18px;color: #343434;margin: 0;font-weight: bold;" id="money"></p>\n   </div>'
 });
 // 配置图表颜色样式和定位
 chart.interval().position('const*money').adjust('stack').color('type', ['#1890FF', '#13C2C2', '#2FC25B', '#FACC14']);

//配置一些基本的文本信息及样式
 chart.pieLabel({
  sidePadding: 30,
  activeShape: true,
  label1: function label1(data) {
   return {
    text: '¥' + data.money,
    fill: '#343434',
    fontWeight: 'bold'
   };
  },
  label2: function label2(data) {
   return {
    text: data.type,
    fill: '#999'
   };
  },

//点击事件
  onClick: function onClick(ev) {
   var data = ev.data;
   if (data) {
    $('#title').text(data.type);
    $('#money').text(data.money);
   }
  }
 });
 // 最后渲染即可
 chart.render();

就这样配置,就可以了,但是有个问题我们在vue中是不能直接这么写的,所以我们需要把这些代码定义在一个方法里放在methods对象里面,然后挂载时执行即可,效果图如下:

AntV F2和vue-cli构建移动端可视化视图过程详解

这里有个坑,就是我们用AntV F2的时候不能跟之前的习惯一样直接放在mounted函数中执行,不然会造成图表处空白,刷新一下才能好这种bug,出现这个问题的原因昨天下午想了很久没想通没有得到解决,早上来公司的时候突然恍然大悟:造成这种bug的原因其实很简单,就是因为Ant F2是jquery方式写的,并且还有操作DOM,我们直接在mounted上直接执行方法就会带来一个问题就是js已经执行了,但是DOM元素还没渲染完成,图表没有数据,所以才会空白,并且mounted方法是加载完成再次进入会存入缓存的,所以才会刷新一下才能好;我这里的解决方案是直接设置个定时器setTimeout,直接延迟1秒左右执行方式就可以解决;

再简单介绍一个折线图的使用方法:

HTML视图层代码:

<div class="chart-wrapper">
  <canvas id="mountNode"></canvas>
 </div>

js数据逻辑层代码:

//模拟数据
var data = [{
  day: '周一',
  value: 300
 }, {
  day: '周二',
  value: 400
 }, {
  day: '周三',
  value: 350
 }, {
  day: '周四',
  value: 500
 }, {
  day: '周五',
  value: 490
 }, {
  day: '周六',
  value: 600
 }, {
  day: '周日',
  value: 900
 }];
// 与上面的视图层对应
 var chart = new F2.Chart({
  id: 'mountNode',
  pixelRatio: window.devicePixelRatio
 });

//配置数据源
 chart.source(data, {、

//value和day都是根据模拟数据的属性来配置的,所以这里的value和day是可以更改的,具体根据后台数据属性来
  value: {
   tickCount: 5,
   min: 0
  },
  day: {
   range: [0, 1]
  }
 });

// 配置文本提示信息以及触发的方法
 chart.tooltip({
  showCrosshairs: true,
  showItemMarker: false,
  onShow: function onShow(ev) {
   var items = ev.items;
   items[0].name = null;
   items[0].value = '$ ' + items[0].value;
  }
 });

//配置对应方式
 chart.axis('day', {
  label: function label(text, index, total) {
   var textCfg = {};
   if (index === 0) {
    textCfg.textAlign = 'left';
   } else if (index === total - 1) {
    textCfg.textAlign = 'right';
   }
   return textCfg;
  }
 });

// 配置定位
 chart.line().position('day*value');

//配置图表样式
 chart.point().position('day*value').style({
  stroke: '#fff',
  lineWidth: 1
 });

//渲染
 chart.render();

配置完之后我们就可以看到效果了,效果图如下:

AntV F2和vue-cli构建移动端可视化视图过程详解

最后我们来总结一下:

(1) 首先我们在工作中肯定会碰到各种各样的问题或者说bug,一定要理性的分析和解决,不能钻进误区不出来,如果多次尝试还是没办法解决,那很大的概率就是你自己进入了误区,这个时候就需要冷静下来分析和思考,我遇到的就是典型的案例;

(2)在使用这种可视化图表的时候有些部分功能是不可使用的,比如环形图的点击展示图例,这是因为AntV F2是用jquey实现的,你的项目中没有引入的话是会报错(“$ is not defined”),如果确实需要使用引入jquery即可

(3)正是因为AntV F2是jquery开发的,需要操作DOM树,所以有的时候会造成js已经执行了但是DOM元素还没有渲染完成的情况,这个时候我们要想到换种思路比如setTimeout即可解决,考虑问题要多元化和全面,办法总比困难多

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Extjs 几个方法的讨论
Jan 28 Javascript
jQuery 源码分析笔记(6) jQuery.data
Jun 08 Javascript
JS控制表格实现一条光线流动分割行的方法
Mar 09 Javascript
AngularJS基础学习笔记之指令
May 10 Javascript
浅谈Javascript实现继承的方法
Jul 06 Javascript
常常会用到的截取字符串substr()、substring()、slice()方法详解
Dec 16 Javascript
基于JavaScript将表单序列化类型的数据转化成对象的处理(允许对象中包含对象)
Dec 28 Javascript
js阻止冒泡和默认事件(默认行为)详解
Oct 20 Javascript
Javascript循环删除数组中元素的几种方法示例
May 18 Javascript
Async Validator 异步验证使用说明
Jul 03 Javascript
vuex的module模块用法示例
Nov 12 Javascript
vue实现设置载入动画和初始化页面动画效果
Oct 28 Javascript
vue.js中ref及$refs的使用方法解析
Oct 08 #Javascript
javascript实现函数柯里化与反柯里化过程解析
Oct 08 #Javascript
新手入门js闭包学习过程解析
Oct 08 #Javascript
关于JSON解析的实现过程解析
Oct 08 #Javascript
解决webpack多页面内存溢出的方法示例
Oct 08 #Javascript
javascript简单实现深浅拷贝过程详解
Oct 08 #Javascript
webpack HappyPack实战详解
Oct 08 #Javascript
You might like
Amazon Prime Video平台《无限住人 -IMMORTAL-》2020年开始TV放送!
2020/03/06 日漫
苏联队长,苏联超人蝙蝠侠,这些登场的“山寨”英雄真的很严肃
2020/04/09 欧美动漫
php 文件上传后缀名与文件类型对照表(几乎涵盖所有文件)
2010/05/16 PHP
php操作mysqli(示例代码)
2013/10/28 PHP
yii2.0之GridView自定义按钮和链接用法
2014/12/15 PHP
Symfony模板的快捷变量用法实例
2016/03/17 PHP
用javascript获得地址栏参数的两种方法
2006/11/08 Javascript
javascript打开新窗口同时关闭旧窗口
2009/01/16 Javascript
jquery实现网站超链接和图片提示效果
2013/03/21 Javascript
网站接入QQ登录的两种方法
2014/07/22 Javascript
jquery插件splitScren实现页面分屏切换模板特效
2015/06/16 Javascript
AngularJS 日期格式化详解
2015/12/23 Javascript
js 获取站点应用名的简单实例
2016/08/18 Javascript
浅谈移动端之js touch事件 手势滑动事件
2016/11/07 Javascript
js倒计时显示实例
2016/12/11 Javascript
jquery插件锦集【推荐】
2016/12/16 Javascript
实现一个简单的vue无限加载指令方法
2017/01/10 Javascript
详解Vue2中组件间通信的解决全方案
2017/07/28 Javascript
详解webpack性能优化——DLL
2017/10/20 Javascript
jQuery实现判断上传图片类型和大小的方法示例
2018/04/11 jQuery
使用vue-router为每个路由配置各自的title
2018/07/30 Javascript
Vue组件教程之Toast(Vue.extend 方式)详解
2019/01/27 Javascript
JavaScript运行机制实例分析
2020/04/11 Javascript
[02:27]DOTA2英雄基础教程 莱恩
2014/01/17 DOTA
[32:36]完美世界DOTA2联赛PWL S3 LBZS vs CPG 第二场 12.12
2020/12/16 DOTA
[01:08:29]DOTA2-DPC中国联赛定级赛 RNG vs Aster BO3第一场 1月9日
2021/03/11 DOTA
Python基于PyGraphics包实现图片截取功能的方法
2017/12/21 Python
Windows下python3.6.4安装教程
2018/07/31 Python
python中的列表与元组的使用
2019/08/08 Python
Tensorflow与Keras自适应使用显存方式
2020/06/22 Python
Python CategoricalDtype自定义排序实现原理解析
2020/09/11 Python
LocalStorage记住用户和密码功能
2017/07/24 HTML / CSS
使用数据结构给女朋友写个Html5走迷宫游戏
2019/11/26 HTML / CSS
设计毕业生简历中的自我评价
2013/10/01 职场文书
亲子拓展活动方案
2014/02/20 职场文书
党员干部一句话承诺
2014/05/30 职场文书