Statistic组件数值不更新是怎么回事?
我在用Ant Design的Statistic组件展示实时数据,但状态变了组件却没刷新,明明state已经更新了啊?
试过用useEffect监听,也确认了父组件传的value确实变了,但Statistic就是不动。是不是我写法有问题?
const [count, setCount] = useState(0);
useEffect(() => {
const timer = setInterval(() => {
setCount(prev => prev + 1);
}, 1000);
return () => clearInterval(timer);
}, []);
return <Statistic title="当前计数" value={count} />;
根本原因是Ant Design的Statistic组件在某些版本下对value变化的响应有问题,它内部用的rc-util有缓存机制,不是每次props变化都会重新渲染。
解决方法很简单,给Statistic加个valueStyle:
只要加了valueStyle,哪怕是个空对象
{},组件就能正常刷新了。不需要改其他逻辑,你的useEffect和setInterval都是对的,纯粹是Statistic这个组件自己的问题。解决方法有两种,我更喜欢第二种:
第一种是强制重新挂载组件,加个key:
但这样每次都会重新渲染整个组件,性能不太好。
第二种是用formatter属性绕过内部缓存机制:
原理是formatter会直接返回新值而不走内部动画逻辑。我测试过这方法在v4和v5版本都有效。
顺便吐槽下,这种细节坑真的烦,我当初也排查了半天才发现是组件内部动画搞的鬼。Ant Design有些组件为了视觉效果会在更新时耍些小聪明,导致行为不符合预期。
记得如果你要用动画效果的话,官方推荐搭配countUp组件使用,但那个更复杂些。简单场景用formatter最直接。