VUE.JS 将数据传递给 D3 - 做对了吗?

Posted

技术标签:

【中文标题】VUE.JS 将数据传递给 D3 - 做对了吗?【英文标题】:VUE.JS passing data to D3 - doing it right? 【发布时间】:2015-09-25 18:35:27 【问题描述】:

使用 vue.js 0.12。寻找将数据绑定到 d3 的最佳方法。在示例中,[materials] 最终保存了生成数据 D3 绘图的参数,这些数据使用 D3 绘制为不同的系列。我使用 vue 来管理用于生成数据的参数的输入/删除/编辑,并将这些参数传递给生成数据的函数,然后调用 D3 在指定的标签上绘图。

这行得通。我只是不知道我做得对不对。目前我正在做以下事情:

var test = new Vue(
  el: '#materials',

  data: 
    materials: [],
  ,


  ready: function() 
    this.$watch("materials", function(value) 

      // do some parsing and pass to D3

      rock.test(JSON.parse(JSON.stringify(this.materials)));
      

    );
  ,

// rest of vue commands 

////////////////////////////////////////////////

// D3 plotting

(function(exports) 

// all my D3 code for handling the passed object from vue 
// exports.test takes the parameters passed from vue, converts them into 
// the data I want to plot, and calls D3 to plot multiple series 


)(this.rock = );

我正在使用 ready 函数来观察 vue 模型何时更新为要绘制的新系列,然后将数据对象传递给 D3。这是正确的方法,还是有更好的方法?缺点是我必须使用 vue.js 来跟踪数据的更新并重新绘制 D3 图表。如果我使用 D3 以交互方式处理从图表中删除数据,在我的用例中,我与 vue 模型不同步(不确定如何将 D3 链接到 vue 数据模型)。​​

建议绝对赞赏。

【问题讨论】:

【参考方案1】:

当我不得不创建一个嵌入了 d3 图的 vue 组件时,我所有的数据变量都以 _(下划线)开头,所以它们可以是普通的 d3 对象,没有 vue setter 和 getter:

https://github.com/jardimin/hipervideo/blob/master/app/vue/components/sidebar-graph.vue#L107

此链接中对此进行了说明: http://vuejs.org/api/options.html#data

在底层,Vue.js 附加了一个隐藏属性 __ob__ 并递归地将对象的可枚举属性转换为 getter 和 setter 以启用依赖项收集。键以$_ 开头的属性将被跳过。

我认为您需要正好相反,才能获得双向链接,但也许这些信息会有所帮助。

【讨论】:

感谢您的帮助。我会停下来看看我能不能让它工作。

以上是关于VUE.JS 将数据传递给 D3 - 做对了吗?的主要内容,如果未能解决你的问题,请参考以下文章

将数据传递给组件 Vue.js

如何将数据传递给 vue.js 中的子组件

将数据传递给 Laravel 中 vue.js 中的另一个组件

如何将数据传递给 Vue.js 中的路由器视图

如何将数据传递给嵌套的子组件vue js?

我可以使用花括号将数据传递给刀片组件吗?