Vue中 引入使用 D3.js

简介: Vue中 引入使用 D3.js

1. SVG 基础知识

SVG 属性

SVG 形状元素

2. D3.js 学习文档

D3.js 中文网

D3.js 入门教程

D3.js v5版入门教程

3. D3.js 在 Vue 中简单应用

3.1 安装 D3.js

npm install d3 --save-dev
// 或者
cnpm install d3 --save-dev 

3.2 组件应用

<template>
  <div>
    <svg width="600" height="500"></svg>
  </div>
</template>
<script>
// 引入d3
import * as d3 from 'd3';
export default {
  data(){
    return{
      data: [73,52,33,22,14,68],
    }
  },
  methods:{
    draw(){
      let margin = 30; // 上下左右边距
      let svg = d3.select('svg');
      let width = svg.attr('width');
      let height = svg.attr('height');
      // 创建矩形分组
      let g = svg.append('g')
                 .attr("transform", 'translate('+ margin +','+ margin +')'); // 图表距离视口的左、上距离
      // 定义 X 轴比例尺
      let scaleX = d3.scaleBand()
                     .domain(d3.range(this.data.length))
                     .rangeRound([0,width - margin*2]);
      // 定义 y 轴比例尺               
      let scaleY = d3.scaleLinear()
                     .domain([0,d3.max(this.data)])
                     .range([height - margin * 2,0]); 
                    // 上边距30;注意:range 后面跟的参数0,放在第二位 因为 y轴正方向向下
      // 绘制 x y 轴
      let axisX = d3.axisBottom(scaleX);
      let axisY = d3.axisLeft(scaleY);
      g.append('g').attr("transform", "translate(0, " + (height - margin * 2) + ")").call(axisX)
      g.append('g').attr("transform", "translate(0,0)").call(axisY);
      // 创建矩形分组
      let gs = g.selectAll('rect')
                .data(this.data)
                .enter()
                .append('g');
      // 绘制矩形 + 过渡效果
      let rectP = 40; // 柱状图间距
      gs.append('rect')
        .attr('x', function(d,i){
          return scaleX(i) + rectP/2;
        })
        .attr('y',function(d,i){
          var min = scaleY.domain()[0]; // [0, 73]
          return scaleY(min); 
          // scaleY(0) y轴比例尺映射出来的是最大值;这个效果等同于 return height - 2*margin 的效果
        })
        .attr('width',function(d,i){
          return scaleX.step() - rectP;
        })
        .attr('height',function(d,i){
          return 0; // 动画初始状态为0
        })
        .attr('fill','pink')
        .transition() 
        .duration(1500)
        .delay(function(d,i){
          return i*200 // 每个柱子逐渐开始的效果
        })
        .attr('y',function(d,i){
          return scaleY(d)
        })
        .attr('height',function(d,i){
          return height - margin * 2 - scaleY(d)
        })
      // 添加鼠标划入划出事件
      gs.on("mouseover",function () {
        d3.select(this.firstChild) // 这里的this是包含:rect text 的节点
          .transition()
          .duration(1000)
          .delay(200)
          .attr('fill','#306ade');
      })
      gs.on("mouseout",function () {
        d3.select(this.firstChild) 
          .transition()
          .duration(1000)
          .delay(200)
          .attr('fill','pink');
      })
       // 绘文字 + 过渡效果
      gs.append('text')
        .attr('x',function(d,i){
          return scaleX(i) + rectP;
        })
        .attr('y',function(d,i){
          return height - 2 * margin;
        })
        .attr('dx',function(d,i){
          return -2;
        })
        .attr('dy',function(d,i){
          return 20;
        })
        .text(function(d,i){
          return d;
        })
        .attr('fill','green')
        .transition()
        .duration(1500)
        .delay(function(d,i){
          return i*200;
        })
        .attr('y',function(d,i){
          return scaleY(d)
        })
    }
  },
  mounted(){
    this.draw()
  }
}
</script>

3.3 效果

20201204182323419.gif


相关文章
|
11天前
|
数据采集 JavaScript Android开发
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
46 7
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
4月前
|
JavaScript 前端开发 开发者
VUE 开发——Node.js学习(一)
VUE 开发——Node.js学习(一)
119 2
|
6月前
|
JSON JavaScript 前端开发
JavaScript 详解——Vue基础
【8月更文挑战第16天】
79 3
JavaScript 详解——Vue基础
|
3月前
|
JavaScript 前端开发 持续交付
构建现代Web应用:Vue.js与Node.js的完美结合
【10月更文挑战第22天】随着互联网技术的快速发展,Web应用已经成为了人们日常生活和工作的重要组成部分。前端技术和后端技术的不断创新,为Web应用的构建提供了更多可能。在本篇文章中,我们将探讨Vue.js和Node.js这两大热门技术如何完美结合,构建现代Web应用。
64 4
|
3月前
|
JavaScript 前端开发 开发者
JavaScript框架React vs. Vue:一场性能与易用性的较量
JavaScript框架React vs. Vue:一场性能与易用性的较量
76 0
|
5月前
|
JavaScript 前端开发 API
Vue学习笔记3:对比纯JavaScript和Vue实现数据更新的实时视图显示
Vue学习笔记3:对比纯JavaScript和Vue实现数据更新的实时视图显示
|
4月前
|
JavaScript 前端开发 应用服务中间件
vue前端开发中,通过vue.config.js配置和nginx配置,实现多个入口文件的实现方法
vue前端开发中,通过vue.config.js配置和nginx配置,实现多个入口文件的实现方法
275 0
|
4月前
|
JavaScript
深入解析:JS与Vue中事件委托(事件代理)的高效实现方法
深入解析:JS与Vue中事件委托(事件代理)的高效实现方法
103 0
|
4月前
|
JavaScript 前端开发
前端js,vue系统使用iframe嵌入第三方系统的父子系统的通信
前端js,vue系统使用iframe嵌入第三方系统的父子系统的通信
|
5月前
|
JavaScript 前端开发 UED
让 HTML 向 Vue.js 华丽转身:如何把 `wangEditor` 仿腾讯文档项目整合进 Vue.js
让 HTML 向 Vue.js 华丽转身:如何把 `wangEditor` 仿腾讯文档项目整合进 Vue.js

热门文章

最新文章