【问题标题】:Run animation only when user access the website from the url bar仅在用户从 url 栏访问网站时运行动画
【发布时间】:2025-11-29 07:55:02
【问题描述】:

我只想在用户从网址栏访问网站时播放动画
而不是在路线改变时。

这是我目前的解决方案

import React from 'react';
import Router from "next/router";

class Layout extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      oAni: true
    };
    this.routeChangeEnd = this.routeChangeEnd.bind(this);

  }

  componentDidMount(){
    Router.events.on('routeChangeComplete', this.routeChangeEnd);
  }
  componentWillUnmount() {
    Router.events.off('routeChangeComplete', this.routeChangeEnd);
  }
  routeChangeEnd() {
    this.setState({oAni: false});
  }
    render (){
      return (
        <>
          <OpeningAnimation st={this.state.oAni ? "flex" : "none"} aniEnd={()=>{this.setState({oAni: false})}} />

          <div>
            {this.props.children}
          </div>
          </div>
        </>
      );
    }
}

动画结束时触发aniEnd。 但这有时会导致memory leak

仅当从 url 栏访问网站时触发动画的最佳解决方案是什么?

【问题讨论】:

    标签: reactjs next.js


    【解决方案1】:

    为了检查用户是否完成了 SSR(服务器端渲染),换句话说,刷新页面并在 URL 栏中输入,您可以通过在 getInitialProps 中检查它来查找,如下所示:

    static async getInitialProps({req}){
      if(req){
      // Called on server
      // Here you can set a variable true
      // Later on on the code if this variable is true, then trigger the animation
      } else {
        // Called on client
      }
     }
    

    这是你需要做的。

    【讨论】:

    • 谢谢,我第一次使用isServer,女巫是undefined,所以没有用。至于用this.props.st更改组件的样式引起的内存泄漏,所以我用{this.state.oAni ? &lt;OpeningAnimation aniEnd={()=&gt;{this.setState({oAni: false})}} /&gt; : null}替换它
    最近更新 更多