在Vue项目里面使用d3.js

news/2024/7/10 2:00:52 标签: vue, JavaScript

之前写一个 Demo里面 有些东西要使用d3实现一些效果 但是在很多论坛找资源都找不到可以在Vue里面使用D3.js的方法,npm 上面的D3相对来说 可以说是很不人性化了 完全没有说 在webpack上怎么使用D3.js

最后折腾很久 看到某位外国大佬 看他的案例 成功的实现了在Vue项目里面实现D3的使用

首先安装

npm install d3 --save-dev

以防万一,然后看package.json

安装完成

在我们开始之前,让我们渲染一个Vue组件,它使用常规的D3 DOM操作呈现一个简单的折线图:


<script>
import * as d3 from 'd3';
const data = [99, 71, 78, 25, 36, 92];
export default {
  name: 'non-vue-line-chart',
  template: '<div></div>',
  mounted() {
    const svg = d3.select(this.$el)
      .append('svg')
      .attr('width', 500)
      .attr('height', 270)
      .append('g')
      .attr('transform', 'translate(0, 10)');
    const x = d3.scaleLinear().range([0, 430]);
    const y = d3.scaleLinear().range([210, 0]);
    d3.axisLeft().scale(x);
    d3.axisTop().scale(y);
    x.domain(d3.extent(data, (d, i) => i));
    y.domain([0, d3.max(data, d => d)]);
    const createPath = d3.line()
      .x((d, i) => x(i))
      .y(d => y(d));
    svg.append('path').attr('d', createPath(data));
  },
};
</script>
<style lang="sass">
svg
  margin: 25px;
  path
    fill: none
    stroke: #76BF8A
    stroke-width: 3px
</style>

代码简单易懂,但这仅仅是一个基本的例子。因为我们没有使用模板,所以需要更多操作和计算的更复杂的可视化会掩盖组件的设计和逻辑。上述方法的另一个警告是,我们不能使用scopedCSS 的属性,因为D3会动态地向DOM添加元素。

可以使用比较奇怪,但是代码比较优雅的方式去实现

<template>
  <svg width="500" height="270">
    <g style="transform: translate(0, 10px)">
      <path :d="line" />
    </g> //前端全栈学习交流圈:866109386
  </svg> //针对1-3年经验前端开发人员
</template>//帮助突破技术瓶颈,提升思维
<script>
import * as d3 from 'd3';
export default {
  name: 'vue-line-chart',
  data() {
    return {
      data: [99, 71, 78, 25, 36, 92],
      line: '',
    };
  },
  mounted() {
    this.calculatePath();
  },
  methods: {
    getScales() {
      const x = d3.scaleTime().range([0, 430]);
      const y = d3.scaleLinear().range([210, 0]);
      d3.axisLeft().scale(x);
      d3.axisBottom().scale(y);
      x.domain(d3.extent(this.data, (d, i) => i));
      y.domain([0, d3.max(this.data, d => d)]);
      return { x, y };
    },
    calculatePath() {
      const scale = this.getScales();
      const path = d3.line()
        .x((d, i) => scale.x(i))
        .y(d => scale.y(d));
      this.line = path(this.data);
    },
  },
};
</script>
<style lang="sass" scoped>
svg
  margin: 25px;
path
  fill: none
  stroke: #76BF8A
  stroke-width: 3px
</style>

非常酷,即使它没有公开任何属性并且数据是硬编码的,它很好地将视图从逻辑中分离出来,并且使用Vue钩子,方法和data对象,现象和上图一样的


http://www.niftyadmin.cn/n/1301266.html

相关文章

CocosCreator中的Prefab文件格式总结

CocosCreator所有的Prefab都是以下类似的格式&#xff1a; 我们学会用文本编辑器查看Prefab文件&#xff0c;可以帮助我们更轻松的查找节点、查看节点和组件信息、批量修改节点和组件信息等等。 因为在文本编辑器中的Prefab文件才是原始的。 而且CocosCreator中的查看的Prefa…

教你用JS手写简单的秒表(精确到10ms,没有延迟)

制作秒表的思路如下&#xff1a; 1、首先定出功能以及界面。 我的目的是做最简单的秒表&#xff0c;因此只需要开始、结束以及清零的功能。界面如下图所示&#xff1a; 未开始运行&#xff1a; 运行中&#xff1a;   2、构思实现的方式。 首先&#xff0c;核心方法肯定…

一点项目查错经验之谈(转载)

知识点参考于 芋道源码文章笔记&#xff0c;对自身提升有帮助&#xff0c;所以手动写下来加深理解 核心内容&#xff1a;正确的处理一次在线故障 故障发生时&#xff1a;意料之外此的错误&#xff0c;无响应或者响应缓慢&#xff0c;但出于服务中&#xff0c;无法关闭影响用户体…

CocosCreator查找图片引用

相信大家可能需要查找图片在哪个Prefab中使用到&#xff0c;于是我们像下图这样查找一下&#xff1a; 查找的时候CocosCreator会给出我们查找的图片资源的uuid 比如&#xff0c;我的uuid&#xff1a;33a791ca-5a28-4c2a-b451-7c6b8f9a0379。 之后就进入到Prefab中&#xff0c;…

Netty搭建简单的IM通信

废话不多说&#xff08;netty权威指南还没看完不敢多说&#xff09;。直接开整&#xff01; 先介绍基本的几个概念 一LINUX网络I/O模型&#xff08;所有都可以看成对一个文件的操作&#xff0c;共有5种&#xff09; 1阻塞I/O模型&#xff1a;直到数据包发送到达并被进程缓冲…

Javascript 定时器调用传递参数的方法

备注&#xff1a;先记下&#xff0c;以后整理&#xff1a; Javascript 定时器调用传递参数的方法&#xff0c;需要的朋友可以参考下。 无论是window.setTimeout 还是window.setInterval,在使用函数名作为调用句柄时都不能带参数,而在许多场合必需要带参数,这就需要想方法解决…

CocosCreator全局替换预制体Prefab的数据

想一下&#xff0c;当我们用CocosCreator开发项目进入到最后阶段的时候&#xff0c;策划说要改配置&#xff01; 要把项目中的字体全部替换成一种新的字体&#xff08;当前项目可能用了几种字体&#xff09;&#xff0c;这时候怎么办。。 这时候&#xff0c;我们不可能一个一…

JS中如何获取url中的某个参数的值

举个列子说明 http://xxxxxxxxxx?accounthaha结果&#xff1a; account getUrlParam(account) --> account haha代码实现&#xff1a; function getUrlParam(name){ var reg new RegExp("(^|&)" name "([^&]*)(&|$)"); var…