[英]React component being called before fetch is complete
我在 React 中有以下 function 但我遇到的问题是获取没有及时完成以将数据传递给 Chart 组件。 所以图表呈现没有图表。
export const OverviewChart = () => {
type dateValue = {
x: number,
y: number
}
var data: Array<dateValue> = Array();
const fetchFromUrl = async() =>{
const response = await fetch(`${process.env.PUBLIC_URL}/tempData/monthly.csv`)
const responseText = await response.text();
const parsedResponse = readString(responseText);
parsedResponse.data.forEach(x => {
data.push( {x: Number(new Date(x[0])), y: Number(x[1]) } )
})
}
fetchFromUrl();
return(
<Chart data={data} currentValue={1840.87}/>
);
}
我在我的图表上有一个重绘 function 所以当我调整大小时,它会正确渲染,但我希望它能够正确渲染而不必先调整它的大小。
我认为您只需要正确使用 state :
export const OverviewChart = () => {
type dateValue = {
x: number,
y: number
}
const [data, setData] = React.useState([]);
React.useEffect(() => {
let results = [];
const fetchFromUrl = async() =>{
const response = await fetch(`${process.env.PUBLIC_URL}/tempData/monthly.csv`)
const responseText = await response.text();
const parsedResponse = readString(responseText);
parsedResponse.data.forEach(x => {
results.push( {x: Number(new Date(x[0])), y: Number(x[1]) } )
})
setData(results);
}
fetchFromUrl();
}, []);
return(
<Chart data={data} currentValue={1840.87}/>
);
}
它应该以这种方式自动重新渲染,否则我不会在你有数据之前渲染图表:
return data.length ? (
<Chart data={data} currentValue={1840.87}/>
) : 'Loading...';
您需要在组件返回时执行加载验证。 这是一个简单的示例:
import React from 'react'
export const ComponentName = () => {
//React Hooks
const [isLoading, setIsLoading] = React.useState(true)
const fetchFromUrl = async() =>{
const response = await fetch(`your fetch`)
//other operations
//when job operations done loading is defined as false
setIsLoading(false)
}
fetchFromUrl();
return(
!isLoading? // = !(isLoading === true) => false; when isloading false, return false
<Component data={"data"} otherProps="props"/>
: null //OR (not recommended)
//<LoadingComponent /> // (recomended) OR
//<SpinningLoadingComponent /> // (recommended)
// is recommended to see loading when user call this component
);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.