You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅在组件进入视口时启动?组件加载即渲染问题求助

解决方案

方案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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 14:22:30