首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从vue.js方法渲染d3.js图表(传递目标div)?

如何从vue.js方法渲染d3.js图表(传递目标div)?
EN

Stack Overflow用户
提问于 2019-12-03 19:11:10
回答 1查看 254关注 0票数 0

我有一个基本的vue代码,如下所示:

代码语言:javascript
复制
new Vue({

    el : '#friendlist',

    data : {

        friends : []

    },

    methods : {

        fetchStats : function(){

            const axios_data = {
                _token  : $('meta[name="csrf-token"]').attr('content')
            };

            axios.post('/friend-stats/all', axios_data).then(response => {

                this.friends = response.data;

            });

        }
    },

    mounted : function(){

        this.fetchStats();

    },

现在,对于friends数组中的每个friend,我需要呈现一个d3.js图表。我在另一个JS文件中有一个可以正常工作的方法,它叫做create_spider_chart(friend, target)friend变量包含来自上面的vue组件的friends数组的一个成员,而target是图表应该追加到的目标元素。这就是问题出现的地方。

如果我在axios调用的响应中这样做:

代码语言:javascript
复制
this.friends = response.data.data;
let target;
for(let i=0;i<this.friends.length;i++){
     target = '.spider-graphic-mini[data-id="'+this.friends[i].id+'"]';
     create_spider_chart(this.friends[i], target);   //d3.js
}

元素.spider-graphic-mini[data-id="'+this.friends[i].id+'"]确实存在于HTML中:

代码语言:javascript
复制
<template v-for="(friend,key) in friends">
     <div class="col-md-6 friend-panel p-3">
          <h5>@{{ friend.name }}</h5>
          <div class="spider-graphic-mini mb-4" :data-id="friend.id"></div>
     </div>
</template>

但是,当我将该标识符传递给create_spider_chart函数时,该元素显然不存在。所以$(target)length=0,而函数不知道在哪里创建图表。

我该如何解决这个问题呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-03 22:21:46

从来没有使用过d3,所以对此持保留态度。

JS是单线程的,而Vue DOM更新过程是异步的。当您将内容分配到friends数组中时,Vue还没有机会用新数据呈现您的模板。这就是为什么你的元素还不存在。

你需要做的就是使用$nextTick(callback),直到Vue重新呈现你的模板,然后根据回调中元素的存在来运行所有的代码。

This piece of documentation解释说..。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59155784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档