问题描述
我已经阅读了gsap文档以进行反应集成,它建议使用useRef()
来定位要设置动画的元素,例如:
const ref = useRef()
gsap.to(ref,{...})
但是,这非常不灵活,因为ref仅限于组件的文件。在gsap中,您趋向于像gsap.timeline()
那样在网站上定位多个元素,因此几乎不可能在没有复杂逻辑(例如使用上下文api)的情况下定位来自多个组件的多个引用。
所以我想知道在react中使用老式的方法来定位具有class
名称的元素是正确的方法吗?
就像在useEffect
中一样:
gsap.from('.foo',{...})
因为使用类名似乎在处理直接的dom操作,这似乎是不好的做法。
任何人都可以鸣叫吗?
解决方法
通常,您应该避免使用泛型选择器字符串(正在执行的操作)作为React中补间的目标。您之所以想这样做的部分原因是因为它反应不灵敏,并且没有严格按照自己的要求保留组件。其次,window
引用可能并不总是存在,因此在某些情况下会引发警告(或错误,具体取决于您的代码)。
尝试坚持使用引用,并选择使用该引用中的选择器。这样做可以为您提供两全其美的优势:
const theRef = useCallback((node) => {
if (!node) return;
const spans = node.querySelectorAll('span')
gsap.to(spans,{ autoAlpha: 1})
},[])
...
<div ref={theRef}>
<span />
<span />
<span />
</div>
如果必须使用通用选择器字符串,请进行测试,测试,然后在多种不同情况下再次对其进行测试。从动画的角度来看,性能可能不会受到影响,但是请确保清理垃圾,因为如果您不杀死componentUnmount
上的动画,那真的会使站点陷入困境。
对于React + GSAP this article的一般介绍是一个不错的起点。