Vuejs上下文中chartjs的图表闪烁和getcontext错误

2024-01-31

您好,我正在尝试通过调用 API 使用 Chartjs 显示不同的图表。下面的代码显示了我如何格式化chart.vue

图表.vue:

<template>
  <div class="chart-container" style="position: relative; height: 40vh; width:100%;">
    <slot name="test1"></slot>
    <slot name="test2"></slot>
  </div>
</template>

<script>

export default {
  name: 'charts',
  data () {
    return {
      date: [],
      challenge: [],
      data: []
    }
  },
  mounted () {
    this.check(8, 'chart_8')
    this.check(7, 'chart_7')
  },
  methods: {
    check (id, name) {
      this.$http.get(`/api_chart/${ id  }/full`)
        .then((response) => {
          this.date = response.data.date
          this.challenge = response.data.challenge
          this.data = this.date.map((date, index) => ({
            x: new Date(date * 1000),
            y: this.challenge[index]
          }))
          const ctx =  document.getElementById([name]).getContext('2d')
          let myChart = new Chart(ctx, {
            type: 'line',
            data: {
              datasets: [
                {
                  label: 'Challenge',
                  data: this.data,
                  borderColor: ' #EA5455',
                }
              ]
            },
            options: {
              lineTension: 0,
              maintainAspectRatio: false,
              scales: {
                yAxes: [
                  {
                    scaleLabel: {
                      display: false
                    },
                    ticks: {
                      beginAtZero: true,
                      callback (value) {
                        return `${value}%`
                      }
                    }
                  }
                ],
                xAxes: [
                  {
                    type: 'time',
                    time: {
                      unit: 'month'
                    },
                    scaleLabel: {
                      display: true,
                    }
                  }
                ]
              }
            }
          })
        })
    }
  }

}
</script>

App.vue:

<template>
  <div class="In order to display chart1">
    <chart-display>  <canvas slot="test1" id="chart_7" ></canvas> </chart-display>
  </div>
  <div class="In order to display chart1">
    <chart-display>  <canvas slot="test2" id="chart_8" ></canvas> </chart-display>
  </div>
</template>

<script>
import chart-display from './Chart.vue'
export default {
  component: {chart-display}
}
</script>

正如您所看到的,我共享了我的 Chart.vue 和 App.vue,我可以在浏览器中看到我的图表,但是每当我运行代码或刷新页面时,图表就会闪烁并停止。然后在我的控制台中我收到以下错误:

请有人帮助我解决这个问题,并请告诉我是否应该对我的代码进行任何更改来解决它。请把修改代码发给我。


正如我在评论中所写,图表被渲染了两次。这会导致闪烁。

// every time you use <chart-display>, 2 charts are rendered, this means chart 1 renders
// itself and chart 2, char 2 renders itself and chart 1, this is a bad pattern in Vue in general

mounted() {
  this.check(8, "chart_8");
  this.check(7, "chart_7");
}

进行以下更改:

图表显示.vue

<template>
  <div
    class="chart-container"
    style="position: relative; height: 40vh; width: 100%"
  >
    <canvas ref="chart_7"></canvas>
    <canvas ref="chart_8"></canvas>
  </div>
</template>

<script>
import Chart from "chart.js";
export default {
  name: "ChartDisplay",
  data() {
    return {
      date: [],
      challenge: [],
      data: [],
      // save charts in an array
      charts: [],
      // charts options
      options: {
        lineTension: 0,
        maintainAspectRatio: false,
        scales: {
          yAxes: [
            {
              scaleLabel: {
                display: false,
              },
              ticks: {
                beginAtZero: true,
                callback(value) {
                  return `${value}%`;
                },
              },
            },
          ],
          xAxes: [
            {
              type: "time",
              time: {
                unit: "month",
              },
              scaleLabel: {
                display: true,
              },
            },
          ],
        },
      },
    };
  },
  mounted() {
    this.render(7, this.$refs.chart_7);
    this.render(8, this.$refs.chart_8);
  },
  methods: {
    render(id, ctx) {
      this.fetchData(id).then((response) => {
        let data = response.date.map((date, index) => ({
          x: new Date(date * 1000),
          y: response.challenge[index],
        }));
        this.charts.push(
          new Chart(ctx, {
            type: "line",
            data: {
              datasets: [
                {
                  label: "Challenge",
                  data: data,
                  borderColor: " #EA5455",
                },
              ],
            },
            options: this.options,
          })
        );
      });
    },
    fetchData(id) {
      return this.$http.get(`/api_chart/${ id  }/full`);
    },
  },
  beforeDestroy() {
    this.charts.forEach((chart) => chart.destroy());
  },
};
</script>
<style >
[v-cloak] {
  display: none;
}
</style>

App.vue

<template>
  <div>
    <div class="In order to display chart1">
      <chart-display/>
    </div>
  </div>
</template>

<script>
import ChartDisplay from "./ChartDisplay.vue";
export default {
  components: { ChartDisplay },
};
</script>

看到它sandbox https://codesandbox.io/s/flamboyant-bassi-7xnw2?file=/src/App.vue

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vuejs上下文中chartjs的图表闪烁和getcontext错误 的相关文章

随机推荐

  • 如何对 ksh93 进行编程以使用 bash 自动完成功能?

    In a 回答 shell 问题的评论 https stackoverflow com questions 933445 a better linux shell 933489 933489 user 修补匠 https stackover
  • PHPforward_static_call 与 call_user_func

    有什么区别forward static call and call user func 同样的问题也适用于forward static call array and call user func array 区别仅在于forward sta
  • 第一个记录的结束日期与下一个记录的第一个日期之间的时间差

    如何查找不同列级别之间的日期差异 以分钟为单位 No SourceID RecordID Start Date End Date 1 1 1 2009 09 07 09 12 00 0000 2009 09 07 11 00 00 0000
  • 如何同步访问indexedDB?

    indexedDB 有一个spec https developer mozilla org en IndexedDB Synchronous API说可以同步访问索引数据库 但还没有实现 我只是想知道是否有办法让它手动同步 我的 JavaS
  • Java冒泡排序错误输出

    我正在尝试实现一个基本的 java 冒泡排序 但我得到了错误的输入 Code is public class BubbleSort public static void main String args int arr sort new i
  • Git 非缓存文件正在上传到 Github

    我正在尝试将我的项目上传到 github 但是它有 1 个非常大的文件 超出了 github 文件大小限制 我不想搞乱大文件存储 我可以忍受 github 上没有这个文件 我已将该文件添加到我的 gitignore像这样的文件 Suppor
  • 将终端移回底部

    我不小心点击了将终端从底部移动到右侧的按钮 我怎样才能让它回到底部 再次单击拆分按钮只会拆分终端 只需移动Terminal向左分割条以加宽Terminal窗口 以便图标Move to Bottom会出现 以便您可以单击它 UPDATE Th
  • 工作副本和分支基础之间的 git diff

    我可以将大师的提示和我的工作副本进行比较 git diff master 我可以将当 前分支的尖端与其来自 master 的合并基础进行比较 git diff master 是一个git diff命令来比较当前分支和工作副本的合并基础 是
  • 根据范围滑块的用户输入重新启动 d3 模拟

    我正在使用构建一个 弹簧 d3 force https github com d3 d3 force布局 我想通过用户输入来操纵它的属性 例如 强度 和 距离 为此 我目前正在使用 输入范围滑块 为了更好地理解 我在 codepen 上制定
  • 以编程方式创建 WebView 并在视图中显示 NSString

    我以编程方式创建了一个 WebView 这很完美 代码如下 我现在需要尝试做的是注入NSStrings进去 我有一个包含 30 个字符串的数组 15 个标题和 15 个正文 是否可以将这些内容显示在 WebView 中 我猜我需要将它们更改
  • 错误:由以下原因引起:java.lang.ClassnotfoundException [重复]

    这个问题在这里已经有答案了 我对编码非常陌生 这是我的第一个应用程序 非常令人沮丧的是 当在设备或模拟器上运行所述应用程序时 出现 不幸的是 应用程序名称已停止 错误 我相信 通过查看 LogCat 我已经将问题定位到错误 java lan
  • 为什么final类不能被继承,而final方法却可以被继承?

    我对类和方法之间 final 关键字的使用有很大的困惑 即为什么final方法只支持继承 而不支持final类 final class A void print System out println Hello World class Fi
  • 如何创建对象列表?

    如何在 Python 中创建对象 类实例 列表 或者这是糟糕设计的结果 我需要这个 因为我有不同的对象 我需要在稍后阶段处理它们 所以我会继续将它们添加到列表中并稍后调用它们 存储对象实例列表非常简单 class MyClass objec
  • Berkeley DB 的最佳 Python 模块? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 根据 Python 2 6 5 文档 1 bsddb 模块已在 Python 3 0 中被弃用并删除
  • 为我的 Android 应用程序选择正确的 API 级别

    我目前有一个针对 android 2 3 api level 10 的应用程序 但我认为probably使用 android 2 1 2 2 或更早版本的人甚至无法在市场上看到该应用程序 所以我认为使用 api level 3 是最好的选择
  • 如何使用 usingColumns 连接 Spark 中的嵌套列

    我有 2 个数据框想要加入 DF1 root myStruct struct nullable true id string nullable true region long nullable true first name string
  • 如何使用 Laravel 管理 OAuth 刷新令牌?

    Socialiate 插件在 Laravel 中提供了 OAuth 的实现 但它的设计似乎主要是为了让他们不必在您自己的网站上创建用户帐户 我正在制作一个帮助管理他们的 Youtube 帐户的应用程序 这意味着身份验证请求的范围更广泛 很容
  • kinect C# 从保存的数据中绘制和移动骨架

    我想要做的是从保存的数据中绘制骨架并为其设置动画 就像我们可以对传感器流所做的那样 所以我有每个关节的 x y 和 z 值 我搜索了很多 但找不到任何可以帮助我的东西 我可以将数据转换为关节集合 将其与骨架关联 但是然后呢 我不知道如何将骨
  • 在 python 中向 csv 文件添加新列

    我正在尝试将一列添加到 csv 文件中 该文件组合了其他两列中的字符串 每当我尝试此操作时 我要么得到仅包含新列的输出 csv 要么得到包含所有原始数据而不是新列的输出 这是我到目前为止所拥有的 with open filename as
  • Vuejs上下文中chartjs的图表闪烁和getcontext错误

    您好 我正在尝试通过调用 API 使用 Chartjs 显示不同的图表 下面的代码显示了我如何格式化chart vue 图表 vue