【问题标题】:React TransitionGroup lifecycle methods not being called when component is loaded加载组件时未调用 React TransitionGroup 生命周期方法
【发布时间】:2018-05-21 19:21:00
【问题描述】:

我正在尝试使用 gsap 为进入和退出的列表设置动画,因此我使用 <TransitionGroup> 包装了我的列表。我想使用 componentWillEnter 和 componentWillLeave 来触发我的动画,但它们没有被调用。我已经检查了所有内容 1000 倍,但无法弄清楚...我应该使用 <Transition> 来代替这种动画吗?

import React from "react";
import { TransitionGroup } from "react-transition-group";

import animations from './animations';

class Events extends React.Component {
  componentWillEnter(cb) {
    console.log('entered');
    const items = document.getElementsByClassName("items");
    animations.animateIn(items, cb);
  }
  componentWillLeave(cb) {
    console.log('exited');
    const items = document.getElementsByClassName("items");
    animations.animateOut(items, cb);
  }


  render() {
    const event = this.props.event;
    return (
      <li key={event._id} className="items">
        <h1>{event.title}</h1>
      </li>
    );
  }
}

class Main extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      events: []
    };
  }
  componentDidMount() {
    return fetch("https://pickup-btown.herokuapp.com/api/event/biking", 
    {
      method: "GET",
      headers: {
        "Content-Type": "application/json"
      },
      mode: "cors"
    })
      .then(response => {
        return response.json();
      })
      .then(events => {
        this.setState({ events: events.docs });
      })
      .catch(err => console.log(err));
  }

  unLoad(e) {
    e.preventDefault();
    this.setState({ events: [] });
  }
  render() {
    const events = this.state.events;
    return (
      <section>
        <button onClick={this.unLoad.bind(this)}>back</button>
        <TransitionGroup component="ul">
          {events.length ? (
            events.map(event => {
              return <Events event={event} key={event._id} />;
            })
          ) : (
            <div />
          )}
        </TransitionGroup>
      </section>
    );
  }
}

export default Main;

任何帮助将不胜感激!

【问题讨论】:

  • 您在Events 组件中调用componentWillEntercomponentWillLeave 的位置?

标签: reactjs gsap react-transition-group


【解决方案1】:

当前react-transition-group 中已删除子组件生命周期方法,您可以使用onEnteronExit 方法来实现类似于您的Events 组件将是

class Events extends React.Component {
  render() {
    const event = this.props.event;
    return (
      <Transition
        timeout={300}
        key={event._id}
        onEntering={el => console.log("Entering", el)}
        onEnter={el => console.log("enter", el)}
        onExit={el => console.log("exit", el)}
        in={true}
      >
        <li
          key={event._id}
          className="items"
        >
          <h1>{event.title}</h1>
        </li>
      </Transition>
    );
  }
}

我也研究过你的代码和它的工作。详情请至documentation

【讨论】:

  • 感谢您的回复,但我认为 componentWillMount 和 componentWillUnmount 在 &lt;TransitionGroup&gt; 包装器中的工作方式不同。它需要来自 componentWillLeave 的回调来发出删除组件的信号。它应该可以与 componentWillEnter 和 componentWillLeave 一起正常工作,对吧?
  • 是的,你是对的。我认为问题可能出在您的回调上!请在animateIn 方法中检查您的回调..
  • 是的,我最初得到的正是你刚才建议的。我也尝试过 componentWillAppear,但没有运气。我的 console.log 不起作用,所以组件的包装方式肯定有问题,但我已经尝试了我能想到的所有变体......如果有帮助,这里是沙箱的链接:@987654322 @
  • 子生命周期方法已在当前版本中删除。所以你可以试试onEnteronExit。我已经更新了答案,请看一下!
  • 哇,非常感谢。这正是我需要看到的,不知道为什么我无法意识到。你是炸弹
猜你喜欢
  • 2020-05-10
  • 2016-01-13
  • 2015-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多