Новая анимация после setState — React Native

Я не нахожу ответа на свою проблему для моего собственного приложения.

Если у вас есть идея, как этого добиться, это было бы здорово :)

Что я пытаюсь сделать:

На странице, когда я где-то нажимаю, я хочу отображать анимацию (например, квадратное привидение) в позиции нажатия.

Чего я добился: когда я нажимаю, отображается квадрат с анимацией в нужном месте. Но когда я нажимаю в другом месте, положение квадрата меняется, но анимация не перезапускается.

Что я пробовал:

Чтобы сделать анимацию, я помещаю ‹ View/> (с позицией: «абсолютная») на позицию нажатия.

Этот ‹ View/> встроен в компонент, который я вызываю 1 раз при рендеринге приложения:

<ClickAnimation x={item.x} y={item.y}/>

где item.x и item.y — координаты.

Это код моего компонента:

import React from 'react';
import {Animated, View} from 'react-native';

export default class ClickAnimation extends React.Component {
  state = {
    scaleAnim: new Animated.Value(0)
  };
  componentWillMount() {
    Animated
      .timing(this.state.scaleAnim, {
      toValue: 2,
      duration: 500
    })
      .start();
  }
  componentWillUpdate(nextProps) {
    if (nextProps.x != this.props.x && nextProps.y != this.props.y) {
      this.setState({
        scaleAnim: new Animated.Value(0)
      })
    }
  }
  componentDidUpdate() {
    console.log("componentDidUpdate",this.state.scaleAnim)
    Animated
      .timing(this.state.scaleAnim, {
      toValue: 2,
      duration: 500
    })
      .start();
  }
  render() {
    return (<Animated.View
      style={{
      position: "absolute",
      top: this.props.y,
      left: this.props.x,
      width: 50,
      height: 50,
      backgroundColor: "red",
      transform: [
        {
          scaleY: this.state.scaleAnim
        }, {
          scaleX: this.state.scaleAnim
        }, {
          translateX: -25
        }, {
          translateY: -25
        }
      ]
    }}/>);
  }
}

console.log в componentDidUpdate дает мне для каждого клика 2 журнала:

{_children: Array(2), _value: 2,..., _animation: null...}

{_children: Array(2), _value: 0,..., _animation: null...}

Я действительно не знаю, что делать дальше.

PS: В NativeScript это было проще. Мне нужно было просто добавить новый компонент в DOM.


person Wandrille    schedule 05.08.2017    source источник


Ответы (3)


Согласно документам React, вы не можете this.setState() внутри componentWillUpdate(), если вам нужно обновить состояние в ответ на изменение реквизита, вместо этого используйте componentWillReceiveProps(nextProps).

https://facebook.github.io/react/docs/react-component.html#componentwillreceiveprops

Прочитайте приведенную выше ссылку для получения более подробной информации об этом и проверьте ее предостережения. надеюсь проблема именно в этом

person Ravi Raj    schedule 05.08.2017
comment
Я пробовал с componentWillReceiveProps, но это не меняет результат. console.log в componentWillReceiveProps показывает мне, что состояние правильно получает данные. - person Wandrille; 05.08.2017
comment
Просто попробуйте увеличить продолжительность с 500 до 5000 мс и проверьте, что происходит. - person Ravi Raj; 05.08.2017
comment
Действительно, это работает. Показана анимация второго щелчка. Но анимация работает плохо. Перехода нет. Я не знаю, проблема ли это в EXPO или в де-коде. - person Wandrille; 05.08.2017

Кажется, что EXPO XDE делает приложение слишком медленным, и поэтому часть анимации не работает должным образом.

person Wandrille    schedule 05.08.2017

Я нашел решение.

Это связано с этой проблемой:

https://github.com/facebook/react-native/issues/6278

Я видел это, и именно поэтому я написал сначала 0,001. Но 0,001 все равно мало. С 0,01 работает отлично.

Ответ таков:

Просто замените 0 на 0,01, потому что это было слишком мало.

person Wandrille    schedule 06.08.2017