如何仅在组件进入视口时启动?组件加载即渲染问题求助
解决方案
方案1:基于可见性条件渲染Terminal组件
直接根据isVisible的值决定是否渲染Terminal组件,当组件不可见时完全卸载它,后台动画也会随之停止。修改后代码如下:
import Terminal from "@nitric/react-animated-term"; import useIsVisible from "./hooks/vos"; import { useRef } from "react"; // 补全useRef的导入 const Term = () => { const elementRef = useRef(); const isVisible = useIsVisible(elementRef); return ( <div ref={elementRef} className="bg-[#222222] rounded-b-lg w-2/3 mx-auto text-green-600 mt-24 ter_font"> <div className="bg-[#333237] py-2 rounded-t-lg flex mb-4"> <div className="flex items-center"> <span className="bg-[#cc0000] px-[6px] py-[6px] rounded-full ml-4 absolute"></span> <span className="bg-[#c4a000] px-[6px] py-[6px] rounded-full ml-10 absolute"></span> <span className="bg-[#4e9a06] px-[6px] py-[6px] rounded-full ml-16 absolute"></span> </div> <div className="mx-auto"> <span className="text-white font-medium">Hello.js</span> </div> </div> <div className="ml-4"> {/* 仅当组件可见时渲染Terminal */} {isVisible && <Terminal lines={termLines} interval={20} replay={false} height={430}/>} </div> </div> ); }; export default Term;
方案2:控制Terminal的播放状态(组件支持时可用)
如果不想卸载组件,可查看@nitric/react-animated-term的文档,确认是否有控制播放/暂停的props(如isPlaying、play),通过isVisible直接控制该属性:
// 假设组件支持isPlaying属性 <Terminal lines={termLines} interval={20} replay={false} height={430} isPlaying={isVisible} // 用可见性控制动画播放状态 />
额外优化:可见性变化时重置动画
若需要组件可见时重新启动动画,可结合useEffect监听isVisible变化,配合Terminal的ref调用重播方法(组件提供该能力时):
import Terminal from "@nitric/react-animated-term"; import useIsVisible from "./hooks/vos"; import { useRef, useEffect } from "react"; const Term = () => { const elementRef = useRef(); const terminalRef = useRef(); // 给Terminal添加ref const isVisible = useIsVisible(elementRef); useEffect(() => { if (isVisible && terminalRef.current) { // 调用组件的重播方法(需组件支持) terminalRef.current.replay(); } }, [isVisible]); return ( <div ref={elementRef} className="bg-[#222222] rounded-b-lg w-2/3 mx-auto text-green-600 mt-24 ter_font"> {/* 顶部标题栏代码不变 */} <div className="ml-4"> {isVisible && ( <Terminal ref={terminalRef} lines={termLines} interval={20} replay={false} height={430} /> )} </div> </div> ); }; export default Term;
内容的提问来源于stack exchange,提问作者Siddharth Kumar
相关产品推荐
相关产品推荐

