首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >状态更新时,react-chartjs-2不更新图形

状态更新时,react-chartjs-2不更新图形
EN

Stack Overflow用户
提问于 2018-03-16 17:14:12
回答 3查看 9.4K关注 0票数 15

我正在创建一个仪表板应用程序,它从端点获取数据,并使用setState方法将端点返回的JSON中的变量分配给状态变量。当我更改状态时,像'react-svg-gauge‘这样的一些组件将会更新,但'react-chartjs-2’不会更新。

下面的代码是我在实际应用程序中状态如何变化的示例。此示例将在chrome开发人员控制台中显示状态变量的正确值,但不会相应地更新DOM。

代码语言:javascript
复制
import React, { Component } from 'react';
import {Doughnut} from 'react-chartjs-2';

class DoughnutExample extends Component {
  state = {
    data: {
        labels: [
            'Red',
            'Green',
            'Yellow'
        ],
        datasets: [{
            data: [300, 50, 100],
            backgroundColor: [
            '#FF6384',
            '#36A2EB',
            '#FFCE56'
            ],
            hoverBackgroundColor: [
            '#FF6384',
            '#36A2EB',
            '#FFCE56'
            ]
        }]
    }
  }

  componentDidMount() {
    this.timer = setInterval(
      () => this.increment(),
      1000
    )
  }

  componentWillUnmount() {
    clearInterval(this.timer)
  }

  increment() {
    let datacopy = Object.assign({}, this.state.data)
    datacopy.datasets[0].data[0] = datacopy.datasets[0].data[0] + 10
    console.log(datacopy.datasets[0].data[0])
    this.setState({data: datacopy})
  }

  render(){
    return(
      <div>
      <Doughnut data = {this.state.data}/>
      </div>
    )
  }
}

export default DoughnutExample;

我是否正确地使用了生命周期方法?这段代码将更新饼图的值,状态变量,但不会正确呈现DOM。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-03-16 17:59:15

我看到的潜在问题是,您试图在更改嵌套属性的同时更新它。因此,如果Doughnutdata的一部分传递给其他组件,它们将不会收到属性已更改的通知。因此有必要进行深度克隆:

代码语言:javascript
复制
increment() {
    const datasetsCopy = this.state.data.datasets.slice(0);
    const dataCopy = datasetsCopy[0].data.slice(0);
    dataCopy[0] = dataCopy[0] + 10;
    datasetsCopy[0].data = dataCopy;

    this.setState({
        data: Object.assign({}, this.state.data, {
            datasets: datasetsCopy
        })
    });
}

您可能还需要像@Janick Fisher建议的那样绑定函数。

票数 11
EN

Stack Overflow用户

发布于 2018-03-16 17:38:50

检查此链接。您可以看到他将函数绑定到组件。

https://codepen.io/gaearon/pen/xEmzGg?editors=0010

代码语言:javascript
复制
// This binding is necessary to make `this` work in the callback
    this.handleClick = this.handleClick.bind(this);
票数 1
EN

Stack Overflow用户

发布于 2019-10-15 02:57:23

您还可以清空状态变量并重新填充它,如下所示

代码语言:javascript
复制
                this.setState({
                    mainData: {}
                });
                this.setState({
                    mainData: md
                });

md已使用mainData的值进行初始化

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

https://stackoverflow.com/questions/49316914

复制
相关文章

相似问题

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