Javascript 只能更新已安装或正在安装的组件。

Javascript 只能更新已安装或正在安装的组件。,javascript,reactjs,Javascript,Reactjs,目前正在处理一个个人项目,我遇到了这个错误 警告:只能更新已安装或正在安装的组件。这通常意味着您在未安装的组件上调用setState、replaceState或forceUpdate。这是禁止操作。请检查图形组件的代码。 我的应用程序组件也遇到了同样的问题。我已经阅读了一些关于问题可能是什么的文章,但我并不清楚我的代码具体存在什么问题 如有任何见解,将不胜感激 这里有一个链接,我已经链接了下面的违规代码 这是图形组件 import React, { Component } from "react

目前正在处理一个个人项目,我遇到了这个错误

警告:只能更新已安装或正在安装的组件。这通常意味着您在未安装的组件上调用setState、replaceState或forceUpdate。这是禁止操作。请检查图形组件的代码。

我的
应用程序组件也遇到了同样的问题。
我已经阅读了一些关于问题可能是什么的文章,但我并不清楚我的代码具体存在什么问题

如有任何见解,将不胜感激

这里有一个链接,我已经链接了下面的违规代码

这是
图形组件

import React, { Component } from "react";
import { render } from "react-dom";
import { Line, Doughnut, Bar } from "react-chartjs-2";
import moment from "moment";
import PropTypes from "prop-types";

import styleConstants from "../misc/style_constants.js";

class Graph extends Component {
  constructor(props) {
    super(props);
    this.state = {
      label: "default",
      dataset: [],
      labels: []
    };
  }

  /**
   * https://min-api.cryptocompare.com/ for documentation
   */
  async getHistoryData(ticker = "BTC", currency = "USD", filter = "close") {
    try {
      let response = await fetch(
        `https://min-api.cryptocompare.com/data/histoday?fsym=${ticker}&tsym=${currency}&limit=60&aggregate=3&e=CCCAGG`
      );
      const responseJson = await response.json();
      const dataset = responseJson.Data.map(data => {
        return data[filter];
      });
      const labels = responseJson.Data.map(data => {
        return moment(new Date(data.time * 1000)).format("MMM Do YY");
      });

      this.setState({ dataset: dataset });
      this.setState({ labels: labels });
    } catch (error) {
      console.log(error);
    }
  }

  componentDidMount() {
    const { ticker, currency, filter } = this.props;
    this.getHistoryData(ticker, currency, filter);
  }

  render() {
    const { label, graphType } = this.props;
    const { dataset, labels } = this.state;

    const options = {
      legend: {
        fontColor: styleConstants.get("Dark")
      },
      scales: {
        yAxes: [
          {
            ticks: {
              fontColor: styleConstants.get("Light"),
              beginAtZero: true,
              callback: function(value, index, values) {
                if (parseInt(value) >= 1000) {
                  return (
                    "$" + value.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",")
                  );
                } else {
                  return "$" + value;
                }
              }
            }
          }
        ],
        xAxes: [
          {
            ticks: {
              fontColor: styleConstants.get("Light"),
              fontSize: 10,
              stepSize: 1,
              beginAtZero: true
            }
          }
        ]
      }
    };

    const data = {
      labels: labels,
      datasets: [
        {
          label: label,
          fill: true,
          lineTension: 0.1,
          backgroundColor: styleConstants.get("Medium"),
          borderColor: styleConstants.get("Medium"),
          borderCapStyle: "butt",
          borderDash: [],
          borderDashOffset: 0.0,
          borderJoinStyle: "miter",
          pointBorderColor: styleConstants.get("Light"),
          pointBackgroundColor: "#fff",
          pointBorderWidth: 1,
          pointHoverRadius: 5,
          pointHoverBackgroundColor: "rgba(75,192,192,1)",
          pointHoverBorderColor: "rgba(220,220,220,1)",
          pointHoverBorderWidth: 2,
          pointRadius: 1,
          pointHitRadius: 10,
          data: dataset
        }
      ]
    };
    return <Line data={data} options={options} />;
    // switch (graphType) {
    //   case "line":
    //     return <Line data={data} options={options} />;
    //     break;
    //   case "bar":
    //     return <Bar data={data} options={options} />;
    //     break;
    //   case "doughnut":
    //     return <Doughnut data={data} options={options} />;
    //     break;
    //   default:
    //     return null;
    // }
  }
}

Graph.propTypes = {
  label: PropTypes.string,
  graphType: PropTypes.string
};

Graph.defaultProps = {
  label: "Default String",
  graphType: "Default String"
};

export default Graph;
import React,{Component}来自“React”;
从“react dom”导入{render};
从“react-chartjs-2”导入{Line,Doughnut,Bar};
从“时刻”中导入时刻;
从“道具类型”导入道具类型;
从“./misc/style_constants.js”导入样式常量;
类图扩展组件{
建造师(道具){
超级(道具);
此.state={
标签:“默认”,
数据集:[],
标签:[]
};
}
/**
* https://min-api.cryptocompare.com/ 文件
*/
异步getHistoryData(ticker=“BTC”、currency=“USD”、filter=“close”){
试一试{
let response=等待获取(
`https://min-api.cryptocompare.com/data/histoday?fsym=${ticker}&tsym=${currency}&limit=60&aggregate=3&e=CCCAGG`
);
const responseJson=wait response.json();
const dataset=responseJson.Data.map(数据=>{
返回数据[过滤器];
});
const labels=responseJson.Data.map(数据=>{
返回时刻(新日期(data.time*1000))格式(“MMM-Do-YY”);
});
this.setState({dataset:dataset});
this.setState({labels:labels});
}捕获(错误){
console.log(错误);
}
}
componentDidMount(){
const{ticker,currency,filter}=this.props;
this.getHistoryData(股票代码、货币、过滤器);
}
render(){
const{label,graphType}=this.props;
const{dataset,labels}=this.state;
常量选项={
图例:{
fontColor:styleConstants.get(“深色”)
},
比例:{
雅克斯:[
{
滴答声:{
fontColor:styleConstants.get(“灯光”),
贝吉纳泽罗:是的,
回调:函数(值、索引、值){
如果(parseInt(值)>=1000){
返回(
“$”+value.toString().replace(/\B(?=(\d{3})+(?!\d))/g,”,”)
);
}否则{
返回“$”+值;
}
}
}
}
],
xAxes:[
{
滴答声:{
fontColor:styleConstants.get(“灯光”),
尺寸:10,
步长:1,
贝吉纳泽罗:是的
}
}
]
}
};
常数数据={
标签:标签,
数据集:[
{
标签:标签,
填充:是的,
线张力:0.1,
backgroundColor:styleConstants.get(“中”),
borderColor:styleConstants.get(“中”),
风格:“屁股”,
borderDash:[],
borderDashOffset:0.0,
borderJoinStyle:“斜接”,
pointBorderColor:styleConstants.get(“灯光”),
pointBackgroundColor:#fff“,
点边界宽度:1,
点半径:5,
pointHoverBackgroundColor:“rgba(75192192,1)”,
pointHoverBorderColor:“rgba(2201)”,
pointHoverBorderWidth:2,
点半径:1,
点半径:10,
数据:数据集
}
]
};
返回;
//开关(图形类型){
//案例“行”:
//返回;
//中断;
//案例“酒吧”:
//返回;
//中断;
//“甜甜圈”一案:
//返回;
//中断;
//默认值:
//返回null;
// }
}
}
Graph.propTypes={
标签:PropTypes.string,
graphType:PropTypes.string
};
Graph.defaultProps={
标签:“默认字符串”,
graphType:“默认字符串”
};
导出默认图形;
下面是应用程序组件

import React, { Component } from "react";
import { render } from "react-dom";

import styled, { css } from "styled-components";

import styleConstants from "../misc/style_constants.js";

import Overview from "../components/Overview";
import Panel from "../components/Panel";
import Table from "../components/Table";

import Options from "./Options";
import Graph from "./Graph";

export default class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      selectedTicker: "BTC",
      currency: "USD",
      tickers: [],
      overview: []
    };
    this.updateTicker = this.updateTicker.bind(this);
    this.createGraph = this.createGraph.bind(this);
  }

  updateTicker(selectedValue) {
    const { value } = selectedValue;
    this.setState({ selectedTicker: value });
  }

  async getTickers() {
    try {
      const response = await fetch('https://api.coinmarketcap.com/v1/ticker/')
      const responseJSON = await response.json();
      this.setState({ tickers: responseJSON });
    } catch (error) {
      console.log("App getTickers() ", error);
    }
  }

  async getOverviewData() {
    try {
      const response = await fetch(`https://api.coinmarketcap.com/v1/global/?convert=${this.state.currency}`)
      const responseJSON = await response.json();
      this.setState({ overview: responseJSON });
    } catch (error) {
      console.log("App getOverviewData() ", error);
    }
  }

  componentDidMount() {
    this.getTickers();
    this.getOverviewData();
  }

  createGraph(ticker = "", currency = "", graphType = "", label = "", filter = "") {
    return (
      <Graph
        filter={filter}
        ticker={ticker}
        currency={currency}
        graphType={graphType}
        label={label}
      />
    )
  }

  render() {
    const { selectedTicker, currency } = this.state;
    const Container = styled.div`
      input:focus,
      select:focus,
      textarea:focus,
    `;

    const Title = styled.h1`
      text-align: center;
      color: ${styleConstants.get('Yellow')};
    `;

    const LightSpan = styled.span`
      font-weight: 200;
    `;

    return (
      <Container>
        <Title>
          Coin:<LightSpan>Dash</LightSpan>
        </Title>
        <Overview {...this.state.overview} />
        <Options
          selectedValue={this.state.selectedTicker}
          values={this.state.tickers.map(data => {
            return data.symbol;
          })}
          labels={
            this.state.tickers.map(data => {
              return data.id;
            })
          }
          updateTicker={this.updateTicker} />
        <Panel label={"Price Action"} content={this.createGraph(selectedTicker, currency, 'line', "Close", "close")} />
        <Panel label={"Highest Price"} content={this.createGraph(selectedTicker, currency, 'bar', "High", "high")} />
        <Panel label={"Lowest Price"} content={this.createGraph(selectedTicker, currency, 'bar', "Low", "low")} />
        <Panel label={"Top Ten List"} content={
          <Table header={["Rank", "Name", "Price", "Change(24 Hour)"]} collection={this.state.tickers} />

        } />

      </Container>
    );
  }
}
import React,{Component}来自“React”;
从“react dom”导入{render};
导入样式化,{css}来自“样式化组件”;
从“./misc/style_constants.js”导入样式常量;
从“./组件/概述”导入概述;
从“./组件/面板”导入面板;
从“./组件/表格”导入表格;
从“/Options”导入选项;
从“/Graph”导入图形;
导出默认类应用程序扩展组件{
建造师(道具){
超级(道具);
此.state={
选择提示:“BTC”,
货币:“美元”,
股票代码:[],
概览:[]
};
this.updatecker=this.updatecker.bind(this);
this.createGraph=this.createGraph.bind(this);
}
UpdateCker(selectedValue){
常量{value}=selectedValue;
this.setState({selectedTicker:value});
}
异步getTickers(){
试一试{
const response=等待获取('https://api.coinmarketcap.com/v1/ticker/')
const responseJSON=wait response.json();
this.setState({tickers:responseJSON});
}捕获(错误){
log(“App getTickers()”,错误);
}
}
异步getOverviewData(){
试一试{
const response=等待获取(`https://api.coinmarketcap.com/v1/global/?convert=${this.state.currency}`)
const responseJSON=wait response.json();
this.setState({overview:responseJSON});
}捕获(错误){
log(“App getOverviewData()”,错误);
}
}
componentDidMount(){
这个。getTickers();
这是.getOverviewData();
}
createGraph(ticker=“”、currency=“”、graphType=“”、label=“”、filter=“”){
返回(
)
}
render(){
const{selectedTicker,currency}=this.state;
康斯特康泰酒店
const Container = styled.div`
      input:focus,
      select:focus,
      textarea:focus,
    `;

const Title = styled.h1`
      text-align: center;
      color: ${styleConstants.get('Yellow')};
    `;

const LightSpan = styled.span`
      font-weight: 200;
    `;

export default class App extends Component {
..
describe("App", () => {
  it("renders without crashing", () => {
    const div = document.createElement("div");
    ReactDOM.render(<App />, div);
    ReactDOM.unmountComponentAtNode(div);
  });
});