React / React Spring List Animate Out не работает

Я экспериментирую с react-spring пытается применить анимацию к списку компонентов при монтировании / размонтировании, используя <Transition> составная часть. Анимация происходит, как и ожидалось, при монтировании, но совсем не происходит при отключении - удаленные компоненты, по-видимому, немедленно отключаются без анимации.

Я подозреваю, что я неправильно понимаю, как keys работать, как кажется, единственное, что отличается в моем коде от примеров - я использую id Свойство от каждого объекта массив. Я предполагаю, что это то же самое, что встроенный в React key используется для списков компонентов, просто передается все сразу. Я попытался передать массив данных, используя Transition "s items аргумент и настройка key быть функцией, но это просто неисправности по-другому.

Я установил здесь простую демонстрацию, где составил список и установил тайм-аут для удаления первого элемента через 3 секунды - вот код:

import React, { Component } from "react";
import { animated, config, Transition } from "react-spring";
import ReactDOM from "react-dom";

import "./styles.css";

class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      items: [
        {
          id: 1,
          text: "This is item 1"
        },
        {
          id: 2,
          text: "This is item 2"
        },
        {
          id: 3,
          text: "This is item 3"
        }
      ]
    };
  }

  componentDidMount() {
    const { items } = this.state;
    setTimeout(() => {
      this.setState({
        items: items.slice(1)
      });
    }, 3000);
  }

  render() {
    const { items } = this.state;

    return (
      <div className="App">
        <ul>
          <Transition
            native
            keys={items.map(item => item.id)}
            config={config.slow}
            from={{ opacity: 0 }}
            to={{ opacity: 1 }}
          >
            {items.map(item => styles => {
              return <animated.li style={styles}>{item.text}</animated.li>;
            })}
          </Transition>
        </ul>
      </div>
    );
  }
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

И он работает на CodeSandbox здесь: https://codesandbox.io/s/r5n8v3x85q

Я что-то пропустил?

1 ответ

Решение

Я получил это работает со следующим кодом. Вам не хватало свойства "оставить" в компоненте Переход. Также вы можете перейти в "переход" для свойств в компоненте "Переход", это даст вам намного приятнее выглядящие анимации.

import React, { Component } from "react";
import { animated, config, Transition } from "react-spring";
import ReactDOM from "react-dom";

import "./styles.css";

class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      items: [
        {
          id: 1,
          text: "This is item 1"
        },
        {
          id: 2,
          text: "This is item 2"
        },
        {
          id: 3,
          text: "This is item 3"
        }
      ]
    };
  }

  componentDidMount() {
    const { items } = this.state;
    setTimeout(() => {
      this.setState({
        items: items.slice(1)
      });
    }, 3000);
  }

  render() {
    const { items } = this.state;

    return (
      <div className="App">
      <button onClick={() => this.setState({items: []})}>Remove List items</button> 
        <ul>
          <Transition
            native
            keys={items.map(item => item.id)}
            config={config.slow}
            from={{ opacity: 0, transition: "opacity .25s ease"  }}
            to={{ opacity: 1, transition: "opacity .25s ease"  }}
            leave={{ opacity: 0, transition: "opacity .25s ease" }}
          >
            {items.map(item => styles => {
              return <animated.li style={styles}>{item.text}</animated.li>;
            })}
          </Transition>
        </ul>
      </div>
    );
  }
}
Другие вопросы по тегам