当前位置: 首页 > 知识库问答 >
问题:

如何用d3创建一个可重用的Vue组件?

司健柏
2023-03-14

我正在尝试创建一个基于D3的Chart.vue组件。我需要能够将多个实例添加到单个页面并将每个实例分开。

我尝试将使用uuid生成的ID分配给在模板中包装我的组件的div:

<template>
  <div :id=this.id>
    <svg></svg>
  </div>
</template>

该ID是在创建组件时创建的。

<script>
import * as d3 from "d3";
import { v4 as uuidv4 } from "uuid";

export default {
  ...
  created () {
    this.id = uuidv4()
  }, 
  ...

当对从父< code>App.vue作为< code>props传入的数据进行更新时,会重新呈现该图表。选择“正确的”<代码>

  methods: {
    renderChart(chart_data) {
      const svg_width = 1000;
      const svg_height = 600;
  
      const svg = d3
        .select("#" + this.id)
        .select("svg")
        .attr("width", svg_width)
        .attr("height", svg_height);
      ...

继续添加所有轴、数据等。

如果我将两个这样的组件添加到我的App.vue模板:

<template>
  <div id="app">
    <form action="#" @submit.prevent="getIssues">
      <div class="form-group">
        <input
          type="text"
          placeholder="owner/repo Name"
          v-model="repository"
          class="col-md-2 col-md-offset-5"
        >
      </div>
    </form>
    <Chart :issues="issues" />
    <Chart :issues="issues" />
  </div>
</template>

我看到它们被添加到DOM中,并带有一些已经创建的uuid。当更新数据并执行<code>renderChart数据的副本,但我只看到创建了一个图表。

我对JavaScript、Vue和D3都是新手,所以可能用了错误的方法,但看起来应该可以吗?

感谢任何帮助。

共有1个答案

金理
2023-03-14

好吧,我似乎已经找到了一个解决方案,尽管我不完全理解它,我不确定为什么最初的方法不起作用(注意:原始方法有时似乎有效,但行为是不可预测的)。

为了解决这个问题,我从父模板向组件传递一个唯一的ID作为道具,并将其添加为图表组件

应用程序中,vue

<template>
  <div id="app">
    <form action="#" @submit.prevent="getIssues">
      <div class="form-group">
        <input
          type="text"
          placeholder="owner/repo Name"
          v-model="repository"
          class="col-md-2 col-md-offset-5"
        >
      </div>
    </form>
    <Chart id="chart1" :issues="issues" />
    <Chart id="chart2" :issues="issues" />        
  </div>
</template>

现在,我需要在< code>Chart.vue的< code>props中添加< code>id,并在< code>data()部分设置一个变量。

<template>
  <div :id=chart_id>
    <svg></svg>
  </div>
</template>

<script>
import * as d3 from "d3";

export default {
  name: 'Chart',
  props: ["issues", "id"],
  
  data() {
    return {
      chart: null,
      chart_id: this.id
    };
  },
  ...

我不确定uuid方法为什么不起作用,但这似乎更健壮。

 类似资料:
  • 我们正在尝试创建一个Vue npm包,其中一个组件导入另一个组件(一个简单的例子可能是——该包包含一个通用按钮组件,以及一个使用my button组件进行分页的表组件)。我可以将子组件导入父组件并成功构建包。但是,当我在应用程序中导入并使用父组件(来自包)时,子组件内容不会显示。跳过它,就像它不在那里一样。 我不知所措。 我正在使用一些非常简单的组件进行测试: (编辑)这是我的索引。js文件 用法

  • 我发现自己经常重复的内容。例如,对于典型的应用程序,这将如下所示: 根据执行dockerfile的项目,这里只有三件事是动态的:,,

  • 我有一个jobIntentService创建一个文件以便在其中添加一些文本,但我得到错误。我不知道我做错了什么...下面是我的代码: 谢谢你的帮助!

  • 在正方形应该移动的地方初始化。KeyListener继承自GameAssistant(JFrame是用KeyListener创建的) }

  • 问题内容: 我有一个动态文本文件,可以根据用户的查询从数据库中选择内容。我必须将此内容写入文本文件,并将其压缩在servlet的文件夹中。我应该怎么做? 问题答案: 看这个例子: 这将在D:named 的根目录中创建一个文件,其中将包含一个名为的单个文件。当然,你可以添加更多的zip条目,还可以指定一个子目录,如下所示:

  • 但随后文件每次都被触摸,在日志中显示为黄线,这也是不令人满意的... 这个简单的问题还有更好的解决办法吗?