[英]How to use animated svg in react functional component?
我想使用反应将 animation 添加到 svg 中。
我想做什么? 我有一个 animation svg 如下代码,
<svg id="something">
<g>
<path>
<script>
//some script
</script>
</svg>
我在下面的功能组件中使用了此代码,
function AnimatedIcon() {
return (
<svg>
<g>
<path>
</g>
<script>
//some script
</script>
</svg>
但这给了我一个错误的意外标记。
我不确定它为什么会给出这个错误。
如何在渲染时将此脚本移动到 function。 有人可以帮我解决这个问题。 谢谢。
我是反应和动画的新手。 有人可以帮我解决这个问题。 谢谢。
看起来您缺少路径的结束标记。
<svg>
<path/>
<g>{/* <path> */}</g>
<script>//some script</script>
</svg>
Ciao,似乎您没有关闭标签<path>
。 尝试像这样修改您的代码:
<svg>
<g>
<path />
</g>
<script>{/*some script */}</script>
</svg>
无论如何,我认为您专注于如何在 React 中为 svg 设置动画。 这是一个工作示例。 假设您有这个svg 并且您想要为它制作动画。
首先我们看到来自react-samy-svg 的Samy
标签。 它只是一个在 React 中更好地管理 svg 的库。
然后,下一个标签是来自react-move的Animate
标签。 这是我们用来为图像设置动画的标签。 在我的示例中,此标签有 2 个道具:
start
:返回起始 state 的 function。 function 传递了数据和索引,并且必须返回 object。update
:一个 function 返回一个 object 或描述 state 应如何在更新时转换的对象数组。 function 传递数据和索引。 因此,正如您在我的示例中看到的, start
prop 中的元素设置为 0:
start={() => ({
y: 0
})}
相反, update
元素设置为 state 变量(这意味着它会在某处发生变化):
update={() => ({
y: bodyY
})}
现在神奇的是:在Animate
标签中,我们为要动画化的机器人图像的每个部分定义了一个SvgProxy
标签。 使用selector
道具,我们得到了我们想要动画的 html 元素,使用transform
道具,我们将移动应用于该 htlm 元素(当然还有他的孩子)。
因此,例如,如果我们要移动机器人主体(具有 html id="core"),我们会这样写:
<SvgProxy
selector="#core" //select body
transform={`translate(0 ${data.y})`} //move body with css translate
/>
是的,但谁设置data.y
来进行翻译? 让我们看看useEffect
钩子。 在里面我们发现了这样一个setInterval
function :
setInterval(() => {
let result = jump();
setbodyY(result.bodyY);
}, 500);
这意味着,每 500 毫秒setInterval
调用setbodyY
,因此每 500 毫秒setInterval
设置组件的 state。 什么是jump
? 是一个 function,它返回一个值以存储到 state。
const jump = () => {
return { bodyY: Math.random() * 10 - 10 };
};
如您所见, jump
返回bodyY
的随机值。 如果你 go 回到Animate
标签的update
道具,你会看到:
y: bodyY,
简而言之,这意味着:“每 500 毫秒设置机器人身体 y 坐标值 Math.random() * 10 - 10”。
同样的解释对arm1
和arm2
有效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.