阿里datav自定义组件 管道插件

阿里的datav是近两年阿里推出的一款市局大屏应用,主要是用于1920*1080以上的大屏幕数据展示的,小屏幕报表的还有个QuickBI。
网络上还有网易和帆软之类的有类似的产品。

datav
网易有数

虽然datav提供了一些自带的组件(38款)有列表柱状图和一些地图
但实际上这些组件还是太少,难以满足更多的需求。
很多的组件的样式非常的固定没有什么改造的空间,这个时候就需要用datav的自定义组件功能,自己做一个组件上去用。

datav的自定义组件教程

datav需要的环境是node.js8.00 - node.js 10.12.0
这个环境实际上是有点旧的,一些框架更新后需求的很多要比这个版本高,这就导致想开发datav必须要卸载node降级版本。
node 10.12.0

首先需要在datav的设置里找到我的组件,在线面的我的组件包里新建一个组件包。
这东西好像没啥意义,填写完毕后需要等待审核,大概几个小时后通过就可以使用了,意义只是拿来存放你得组件好像没什么需要审核的。

安装完毕后在命令行里 执行
npm install --registry=https://registry.npm.taobao.org datav-cli -g
安装datav组件
输入
datav login
登陆datav 用来准备上传插件
用户名是阿里的用户名 识别码在datav控制台上的我的组件/我的组件包里
阿里datav自定义组件 管道插件_第1张图片
登陆完毕后可以正常的使用开发
cd到一个文件夹输入
datav init
会生成一个基本的组件
cd到组件的文件夹
datav run
打开组件
输入
datav publish
会上传组件到服务器。

datav run打开后默认地址为http://localhost:1111
阿里datav自定义组件 管道插件_第2张图片
可以看到datav的开发实际上就是一个webpack项目,用法之类的其实都一样
可以先打开package.json 看一下基本的配置

"version": "0.0.1",

组件的版本号,需要一直更改。如果不更改会导致版本号冲突上传失败。

"dependencies": {
    "bcore": "0.0.18",
    "jquery": "2.1.4",
    "lodash": "4.6.1"
  },

引入的插件在这里配置,默认给了三个基本的。

 "config": {
      "color": {
        "name": "颜色",
        "type": "color",
        "default": "#1296db"
      },
      "speed": {
        "name": "速度",
        "type": "number",
        "default": 2.5
      }
    },

主要的配置,这个是组件在页面上右边展示的部分,在页面上输入值后会重新载入组件然后把新的值附上。
在这里插入图片描述
具体的type有number、text、color、image之类的
具体解释

再看index.js
这里面去配置组件展示的样式

var Event = require('bcore/event');
var $ = require('jquery');
var _ = require('lodash');

引入需要的插件,这边也可以直接引入html页面。在里面写好样式然后在index里直接控制页面元素来做插件。

var svg = require('/svg/index.html');
this.container = $(container); 
this.container.html(svg)

不过这地方有个坑,datav的自定义组件是没有独立的运行空间的,作为组件引入后如果是多个引入。所有的样式和值都会堆积到第一个组件上后续的组件会为空。
如果组件只需要用一个或者较少的话,就可以直接这样做。

module.exports = Event.extend(function Base(container, config) {
  this.config = {
    theme: {}
  }
  var cfg =config;
  // console.log(cfg)
  this.container = $(container);           //容器
  this.apis = config.apis;                 //hook一定要有
  this._data = null;                       //数据
  this.chart = null;                       //图表
  this.init(config);
 }

上面会有一个马良基础类初始化的过程,这边的this.container 就是整个组件的html

 /**
   * 公有初始化 
   */
  init: function (config) {
    //1.初始化,合并配置
    this.mergeConfig(config);
    //2.刷新布局,针对有子组件的组件 可有可无
    this.updateLayout();
    //3.子组件实例化
    //this.chart = new Chart(this.container[0], this.config);
    //4.如果有需要, 更新样式
    this.updateStyle();
  },
  render: function (data, config) {

	//你的js代码

	//如果有需要的话,更新样式
    this.updateStyle();
	},

在初始化完毕后就可以直接往里面添加元素执行js代码

const div = $('
+cfg.y+'" style="position: fixed;left: 0px;top:0px;">
'
); this.div = div[0];

从这里就添加了一个div到页面里 可以通过http://localhost:1111在控制台看到这个元素被添加了
var cfg =config; 加载了在package.josn里的配置
如果在package.josn里的config里定义了一个名称为‘y’的参数
在这里就可以直接调用了

可以在里面任意的编写代码 来制作一些想要的效果。
比如做定时器倒计时,或者用$(div).append("")
之类的方法插入容器

附上一段代码用echar做的管道组件

index.js

//这里的代码写在马良基础类初始化的里面
//module.exports = Event.extend(function Base(container, config) {
	//创建你的元素
//}
 const canvas1 = $('+cfg.y+'" style="position: fixed;left: 0px;top:0px;">');
 this.canvas1 = canvas1[0];
//这里的代码写在初始化之后的render方法里
 render: function (data, config) {
	data = this.data(data);
    var cfg = this.mergeConfig(config);
    //获取你在package.js里面定义的config
    console.log(cfg)
    let c = this.canvas1;
    let context = c.getContext("2d");
    let width = 500;
    let height = cfg.y;
    this.fPoints = [{x: cfg.x, y: cfg.y,r:cfg.delay}];
    let fPoints = this.fPoints;
    context.clearRect(0, 0, width, height);
    function drawCircle() {
      for (let i = 0; i < fPoints.length; i++) {
        context.lineWidth = 0; 
        context.shadowBlur = cfg.guan;
        context.shadowColor = cfg.color +'';
        context.fillStyle = cfg.color +'';
        context.fill();
        context.beginPath();
        context.arc(fPoints[i].x, fPoints[i].y, fPoints[i].r, 0, Math.PI * 2);
        context.closePath();
      }
      if (fPoints[0].y > 0) {
        fPoints[0].x -= 0;
        fPoints[0].y -= cfg.speed;
      }
      else if (fPoints[0].y < 1) {
        fPoints = [{ x: cfg.x, y: cfg.y,r:cfg.delay }];
      }
    }
    function render() {
      let prev = context.globalCompositeOperation;
      context.globalCompositeOperation = 'destination-in';
      context.globalAlpha = 0.9;
      context.fillRect(0, 0, width, height);
      context.globalCompositeOperation = prev;
      drawCircle();
      if (width !== 0) {
        //在动画没有结束前,递归渲染
        window.requestAnimationFrame(render);
        window.cancelAnimationFrame(render)
      }
    }
    render()
    //如果有需要的话,更新样式
    this.updateStyle();
   }

package.json
这边是config的配置

 "config": {
      "y": {
        "name": "起始y(长度)",
        "type": "number",
        "default": 420
      },
      "x": {
        "name": "起始X",
        "type": "number",
        "default": 452
      },
      "delay": {
        "name": "元素大小",
        "type": "number",
        "default": 8
      },
      "guan": {
        "name": "管道宽度",
        "type": "number",
        "default": 0
      },
      "color": {
        "name": "元素颜色",
        "type": "color",
        "default": "#1296db"
      },
      "speed": {
        "name": "元素速度",
        "type": "number",
        "default": 2.5
      }
    },

datav的组件和配置个人感觉还不是非常的完善,还在不断地改进。
没有详细的文档和视频,网络上也找不到其他的教程,开发起来还是比较痛苦的。
不过datav的开发者非常负责在钉钉群里能够及时的解决反馈的问题。
钉钉群:21931738

之前开发的时候非常头疼,给的教程内容太少只有几个页面,也没有详细的介绍,
尝试管道的时候也碰到了很多问题,不过datav的人员给拿去改造了一下成了上面的可以用的代码,十分感谢datav的技术。

另外这个demo是基于
基于canvas做出腾讯云首页效果
的文章尝试制作的管道效果

你可能感兴趣的:(阿里datav自定义组件 管道插件)