React Native中Animated.timing的toValue设为计算变量出现NaN问题求助
React Native Animated.timing 传入计算变量出现NaN的解决办法
先排查几个核心问题,逐个解决:
- 锁死total的有效性
你代码里count/total的计算,要是total是0、undefined或者非数字,哪怕某次val打印正常,也可能在其他时机算出NaN/Infinity,导致Animated.Value被污染成NaN。先给计算加兜底:
const val = total === 0 ? 0 : Math.round((count / total) * 100);
同时确保total始终是数字类型,比如初始化时给默认值const total = useRef(0).current,或者从props接收时做类型校验。
- 强制校验val的合法性
不要直接把计算结果传给toValue,先做NaN判断,避免无效值进入Animated:
const load = (count) => { let val = 0; if (total && !isNaN(total)) { val = Math.round((count / total) * 100); // 限制数值在0-100范围内,避免超出动画预期 val = Math.max(0, Math.min(100, val)); } if (isNaN(val)) return; Animated.timing(loaderValue, { toValue: val, duration: 500, useNativeDriver: false, }).start(); }
检查loaderValue是否被意外修改
确认代码里有没有其他地方直接修改loaderValue的值(比如不是通过Animated的方法)——Animated.Value只能通过Animated的API更新,直接赋值会破坏内部状态,导致后续动画失效。修正useEffect里的打印方式
你现在console.log(loaderValue)打印的是Animated.Value对象,看不到实际数值,应该打印loaderValue._value才能查看当前的动画值,避免误解。
另外,你用Number(val)没必要,Math.round返回的本身就是数字类型,多此一举。
内容的提问来源于stack exchange,提问作者waryugen adogen
相关产品推荐
相关产品推荐

