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);
});
});