在第一个示例中,您没有使用ref
,您正在重新分配navbar
通过ref
回调所以navbar
是 DOM 元素。
它是一样的
let navbar = null;
return <div ref={node => (navbar = node)} />
在第二个示例中,您使用的是ref
object这是一个带有current
保存 DOM 元素的属性
const navbar = useRef(null)
return <div ref={navbar} />
导航栏现在是
{ current: the DOM element }
所以你将对象传递给myTween.to()
而不是里面的 DOM 元素navbar.current
现在在第二个例子中gsap
正在努力延长ref
对象本身而不是 DOM 元素。
为什么我们会收到 TypeError: Cannot add property _gsap, object is not extensible`?
如果你看一下源代码useRef https://github.com/facebook/react/blob/master/packages/react-reconciler/src/ReactFiberHooks.js#L888你会在网上看到891
if (__DEV__) {
Object.seal(ref);
}
React 正在密封ref
对象和JavaScript
当我们尝试使用扩展它时会抛出错误Object.defineProperty()
这可能是什么gsap
是在做。
使用的解决方案ref
将会通过ref.current
into tween.to()
const RootNavigation = () => {
const navbar = useRef()
const myTween = new TimelineLite({ paused: true });
const animate = () => {
myTween.to(navbar.current, 0.07, { x: "100" }).play()
}
return (
<div className="nav-main" ref={navbar}>
...
</div>
)
}