javascript - 在已删除的 Vue.js 组件中使用时,Plotly.js 呈现错误的图表

标签 javascript vue.js plotly

问题

我有两个图表包含在两个组件中。当我删除第一个组件时,第一个图表保留下来。

参见 jsfiddle:https://jsfiddle.net/m4ywp5fc/4/

方法

我正在尝试使用 Plotly.replot 重新绘制图表,但 Vue.js 似乎在内部做了一些我不明白的事情。此外,Plotly.purge 在这种情况下什么也不做。

代码

或查看 jsfiddle:https://jsfiddle.net/m4ywp5fc/4/

JavaScript

Vue.component('chart-one', {
    props: ['id'],

  template: `<div :id="'chart-' + id"></div>`,

  mounted () {
    const trace = {
      x: [1, 2, 3, 4],
      y: Array.from({length: 4}, () => Math.floor(Math.random() * 40))
    }

    Plotly.newPlot('chart-' + this.id, [trace])
  }
})

new Vue({
  el: '#app',

  data: () => ({
    charts: [1, 2]
  }),

  methods: {
    remove () {
        this.charts.splice(0, 1)
    }
  }
})

HTML

<script src="https://unpkg.com/vue"></script>
<script src="https://cdn.plot.ly/plotly-latest.min.js"></script>

<div id="app">
  Charts: {{ charts }}
  <button @click="remove">
    Delete first chart
  </button>

  <div v-for="(chart, index) in charts">
    <chart-one :id="'chart-' + index"></chart-one>
  </div>
</div>

补充说明

请注意我的申请要复杂得多。

最佳答案

您的问题是由两个原因引起的:

您的演示代码中有错别字

<chart-one :id="'chart-' + index"></chart-one>

应该是

<chart-one :id="'chart-' + chart"></chart-one>

无法处理组件内 props 的更改

Vue 默认假定组件在其属性更改时自动更新,而这是框架本身的一部分,您的组件无法处理这种情况。

是这样的:

  1. Vue 首先呈现 chart-one 的 2 个实例,以及值 [1, 2]
  2. 当你点击按钮时,Vue 被要求重新渲染 1 chart-one [1]
  3. Vue 将第一个组件上的 id 变量更新为 2,然后发现它还有 1 个未使用的组件剩余,因此将其删除

可以通过以下方式解决:

添加一个变量:

如果你添加一个key对于 chart-one 组件,vue 实际上可以对实例进行“跟踪”:

<chart-one :id="'chart-' + chart" :key="chart"></chart-one>

它不再执行“第一个组件中的更新值”,而是智能地核对并重新创建 dom 节点以匹配传入的值。

关于javascript - 在已删除的 Vue.js 组件中使用时,Plotly.js 呈现错误的图表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49597179/

相关文章:

vue.js - 将日期对象作为 Prop 传递的默认值是什么?

r - 垂直组合多个条形图

javascript - 来自 Angular 形式的 $http.post 不发送任何数据

javascript - 从数据库检索数据 - Laravel

vue.js - Font Awesome 无法使用 vue 正确更新

vue.js - 在 vue-electron 中按下后退按钮时保存状态

javascript - Angular 2 应用程序中的 plotly 点击事件

python - 如何在 plotly (python) sankey 中显示图例?

javascript - GPL 许可证如何限制商业 Web 应用程序?

Javascript DOM ChildNodes 属性未捕获所有子节点