【发布时间】:2020-05-01 23:30:47
【问题描述】:
我有一个组件并使用不同的道具有条件地渲染它。
{activeNavItem === 'Concept Art' ? (
<Gallary
images={conceptArtImages}
sectionRef={sectionRef}
/>
) : (
<Gallary
images={mattePaintingImages}
sectionRef={sectionRef}
/>
)}
这个组件有useState(false) 和useEffect 钩子。 useEffect 确定屏幕位置何时到达 dom 元素并触发 useState 到 true: elementPosition < screenPosition。然后我的state 在 dom 元素上触发类:state ? 'animationClass' : ''。
const Gallary = ({ images, sectionRef }) => {
const [isViewed, setIsViewed] = useState(false);
useEffect(() => {
const section = sectionRef.current;
const onScroll = () => {
const screenPosition = window.innerHeight / 2;
const sectionPosition = section.getBoundingClientRect().top;
console.log(screenPosition);
if (sectionPosition < screenPosition) setIsViewed(true);
};
onScroll();
window.addEventListener('scroll', onScroll);
return () => {
window.removeEventListener('scroll', onScroll);
};
}, [sectionRef]);
return (
<ul className="section-gallary__list">
{images.map((art, index) => (
<li
key={index}
className={`section-gallary__item ${isViewed ? 'animation--view' : ''}`}>
<img className="section-gallary__img" src={art} alt="concept art" />
</li>
))}
</ul>
);
};
问题:它适用于我的第一次渲染。但是当我使用不同的道具切换组件时,我的 state 最初是 true 并且我没有动画。
我注意到如果我有两个组件(ComponentA, ComponentB)而不是一个(ComponentA),它可以正常工作。
【问题讨论】:
-
请附上组件的代码。阅读代码比从描述中重构代码更容易。
-
@OriDrori 更新
-
@nukuutos 你的意思是当你第二次更改
activeNavItem时它不会动画?? -
@adel 是的,你是对的
-
我注意到您应该使用
setIsViewed(true)而不是setIsViewed(() => true)
标签: javascript reactjs react-hooks