首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C3和React DOMException

C3和React DOMException
EN

Stack Overflow用户
提问于 2019-03-05 05:03:40
回答 1查看 209关注 0票数 1

我正在尝试使用C3在我的React项目中呈现一个图表。

问题所在

我所做的是动态生成一个id (UUID),并将它附加到图表组件中的div。然后在组件在componentDidMount中呈现后调用一些代码。这是一个常见的模式,我在其他项目中见过。

起初,一切似乎都很好。但是,在反复刷新页面后,有时图表生成不起作用。我得到的错误是:

代码语言:javascript
复制
DOMException: Failed to execute 'querySelector' on 'Document': '#a-really-long-id' is not a valid selector.

我试过的

我试着在附加图表时使用setTimeout来延迟,但奇怪的是,即使在延迟10秒之后,我仍然得到了相同的结果。这让我相信,这不是种族状况,而是由其他原因造成的。也许C3只读取DOM一次而不响应更改?但这并不能解释为什么它有时会起作用..。

即使试图从控制台中选择by元素,也没有起作用。

代码

以下是我的完整组件代码:

代码语言:javascript
复制
// assets/js/index.jsx
import React from 'react';
import uuid from 'uuid/v4';
import c3 from 'c3';


class Chart extends React.Component {
    constructor(props) {
        super(props);

        this.id = uuid();
        this._update = this._update.bind(this);
    }

    _update() {
        const data = this.props.data;
        this.chart = c3.generate({
            bindto: `#${this.id}`,
            data: {
                columns: [
                    ['Male', 0],
                    ['Female', 0],
                    ['Brand', 0]
                ],
                type: 'bar',
                colors: {
                    Male: '#0066CC',
                    Female: '#FF6666',
                    Brand: '#808080'
                },
                groups: [
                    ['Male', 'Female', 'Brand']
                ],
                order: null
            },
            bar: {
                width: {
                    ratio: 0.3
                }
            },
            transition: {
                duration: 500
            },
            tooltip: {
                show: false
            },
            axis: {
                x: { show: false },
                y: { show: false },
            },
            size: { width: 220, height: 320 },
            grid: {
                x: { show: false }
            },
            legend: {
                show: false
            }
        });

        setTimeout(function() {
            this.chart.load({
                columns: [
                    ['Male', data.male],
                    ['Female', data.female],
                    ['Brand', data.brand]
                ]
            });
        }, 500);
    }

    componentDidMount() {
        this._update();
    }

    render() {
        return (
            <div id={this.id} className="chart"></div>
        );
    }
}


export default Chart;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-05 05:26:29

这可以作为一个评论添加,但由于它很大,添加它作为一个答案。

您使用html5 4/html5语义吗?

根据HTML4 (https://www.w3.org/TR/html401/types.html)

ID和名称标记必须以字母(A)开头,后面可以是任意数量的字母、数字(0-9)、连字符("-")、下划线("_")、冒号(":")和句点(“”)。

根据HTML5 (https://www.w3.org/TR/html5/dom.html)

当在HTML元素上指定时,id属性值在元素树中的所有id中必须是唯一的,并且必须至少包含一个字符。该值不得包含任何空格字符。

您的uuid有时可能生成有效的Id,有时可能不会(不确定uuid是如何工作的)

如果不使用HTML5语义,则可以简单地添加<!DOCTYPE html>

在html文档的顶部并试一试。

另外,

您在逻辑中使用了settimeout,并在其中使用了this.Chart。

this,现在将引用settimeout而不是类。

你能试着换衣服吗?

代码语言:javascript
复制
setTimeout(function() {
        this.chart.load({
            columns: [
                ['Male', data.male],
                ['Female', data.female],
                ['Brand', data.brand]
            ]
        });
    }, 500);

代码语言:javascript
复制
  setTimeout( () => {
        this.chart.load({
            columns: [
                ['Male', data.male],
                ['Female', data.female],
                ['Brand', data.brand]
            ]
        });
    }, 500);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54995717

复制
相关文章

相似问题

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