我正在尝试实现加载器的行为。
我有一个代码:
import { DonutChart } from './donut-chart';
const ParentComponent = () => {
const [isLoading, setIsLoading] = useState(true); // POINT#1
useEffect(() => {
// .... some logic to call API and load some data for a chart
setIsLoading(false) // POINT#2
}, []);
return <DonutChart isLoading={isLoading} {...args} />
}
字符串
//donut-chart.jsx
// import ... from modules
highchartsMore(Highcharts);
addExportingModule(Highcharts);
addExportData(Highcharts);
accessibilityModule(Highcharts);
noDataModule(Highcharts);
const DonutChart = ({ isLoading, ...rest}) => {
const options = {...}; // some options from Highcharts API
console.log("POINT#3", isLoading);
return (
<HighchartsReact
highcharts={Highcharts}
options={options}
update={isLoading}
callback={instance => { // POINT#4: Here could be the problem
if (isLoading) {
console.log('case 1', isLoading);
instance.showLoading(getCustomLoader());
} else {
console.log('case 2', isLoading);
instance.hideLoading();
}
}}
/>
)
型
getCustomLoader -是一个注入一些自定义样式的动画加载器的函数。在我们的例子中,这是一个圆形,如材质
const getCustomLoader = () => {
const hasStyles = document.getElementById('custom-loader-styles');
const innerStyles ='some styles'
const element = hasStyles || document.createElement('style');
element.setAttribute('id', 'custom-loader-styles');
element.innerHTML = innerStyles;
document.head.appendChild(element);
return `
<svg class="custom-loader" viewBox="22 22 44 44">
<circle class="custom-loader__circle" cx="44" cy="44" r="20.2" fill="none" stroke-width="3.6"></circle>
</svg>
`;
}
型
预期行为
POINT#1:isLoading = true,POINT#3中的console.log显示为true,加载器可见
POINT#2:调用了setIsLoading,isLoading变为“false”
POINT#3:console.log显示:“POINT#3”,false
POINT#4:DonutChart中的Props应该更新,回调也应该更新。在回调中,我的“case 2”应该隐藏loader。
实际行为
POINT#4:DonutChart中的Props已更新,但回调未更新,并且“case 1”仍显示加载器。
不明白为什么会这样。
1条答案
按热度按时间wlwcrazw1#
这是预期的行为。如果
immutable
选项被禁用,则回调仅被触发一次。在Highcharts API中,我们可以读取:当图表已加载并且所有外部图像都已加载时运行的函数。定义
chart.events.load
处理程序是等效的。使用
useEffect
钩子或render
图表事件来处理加载程序。字符串
示例:https://codesandbox.io/p/sandbox/highcharts-react-demo-forked-z25gj6
API引用:
https://api.highcharts.com/class-reference/Highcharts.Chart#Chart
https://api.highcharts.com/highcharts/chart.events.redraw的
**网址:**https:github.com/highcharts/highcharts-react#options-details