javascript - React,在 useEffect 中使用 RequestAnimationFrame 进行动画处理
问题描述
我一直在通过更新 useEffect 函数中的 setInterval 内的状态变量来为 svg 弧设置动画,但这在我的前端似乎非常昂贵(一开始会滞后几秒钟)。通过一些研究,我遇到了 RequestAnimationFrame,我找到了一些示例,但似乎没有一个适用于我的情况,有人可以帮忙吗?
function polarToCartesian(centerX, centerY, radius, angleInDegrees) {
var angleInRadians = (angleInDegrees - 90) * Math.PI / 180.0;
return {
x: centerX + (radius * Math.cos(angleInRadians)),
y: centerY + (radius * Math.sin(angleInRadians))
};
}
const describeArc = (x, y, radius, startAngle, endAngle, isSmall, time) => {
var start = polarToCartesian(x, y, radius, endAngle);
var end = polarToCartesian(x, y, radius, startAngle);
var largeArcFlag = endAngle - startAngle <= 180 ? "0" : "1";
var d = [
"M", start.x, start.y,
"A", radius, radius, 0, largeArcFlag, 0, end.x, end.y
].join(" ");
if (isSmall) {
return (
setSmallArcPath(d)
)
}
setBigArcPath(d);
setBigArcStart(startAngle + degreeIncrement);
setSmallArcStart(startAngle + degreeDecrement);
}
useEffect(() => {
let timerId;
const f = () => {
describeArc(4220, 3500, 3000, bigArcStart, bigArcStart + 90, false);
describeArc(4220, 3500, 2800, smallArcStart, smallArcStart + 60, true);
timerId = requestAnimationFrame(f);
};
timerId = requestAnimationFrame(f);
return () => cancelAnimationFrame(timerId);
}, [bigArcPath, smallArcPath, bigArcStart, smallArcStart]);
解决方案
推荐阅读
- atom-editor - 如何将 Atom 编辑器与远程服务器连接?
- r - 在排列好的地块之间画一个“网格”
- sass - `@apply` 不能与 `.text-md` 一起使用
- numberformatexception - 自定义 OpenCsv CsvToBeanBuilder
- java - 使用休眠当前会话执行存储过程后无法执行任何读/写操作
- javascript - 如何设置 jest 以测试画布
- maven - Maven surefire 插件套件XmlFile 并行执行
- python - Python中如何提高基于Caffe的人脸检测模型的性能?
- javascript - 如何在 javaScript 中创建具有用户定义名称的对象?
- html - NetSuite 中带有 XML 的 IF 语句