Animated и getDerivedStateFromProps

Если componentWillReceiveProps устарел, а заменяющий getDerivedStateFromProps возвращает состояние окончательный, как я могу постепенно изменять состояние с течением времени (то есть анимировать что-то) с новым getDerivedStateFromProps?

с componentWillReceiveProps нормально работает следующее:

state = {
  itemOpacity: new Animated.Value(0.25)
};

componentWillReceiveProps(nextProps) {
  if (this.props.items.visible !== nextProps.items.visible) {

    let value = 0;

    if (nextProps.items.visible) {
      value = 1;
    }

    Animated.timing(this.state.itemOpacity, {
      toValue: value,
      duration: 200,
    }).start();
  }
}

как мне сделать что-то подобное с getDerivedStateFromProps? или мой шаблон анимации тупой?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
2
0
720
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

getDerivedStateFromProps вызывается с аргументами newProps и previousState. Итак, вы можете использовать previousState для анимации:

static getDerivedStateFromProps(nextProps, prevState) {

  let value = 0;
  if (nextProps.items.visible) {
    value = 1;
  }

  Animated.timing(prevState.itemOpacity, {
    toValue: value,
    duration: 200,
  }).start();

  return {
    // update state
  }
}

могу я просто запустить анимацию в предыдущем состоянии? Я предположил, что prevState неизменен и не отображает текущее состояние. Кроме того, что мне нужно вернуть?

Marco 01.06.2018 13:11

prevState является неизменным, но пакет Animated не изменяет состояние. Фактически, я бы посоветовал не использовать состояние для анимации, поскольку состояние актуально только в том случае, если вы явно обновляете его через setState ()

dentemm 01.06.2018 13:18

спасибо, попробую позже. но как Animated.timing(prevState.itemOpacity ... не изменяет состояние? после этого я могу видеть новое значение в состоянии с this.state.itemOpacity._value.

Marco 01.06.2018 13:21

Да, значение обновляется, но оно также будет обновлено, если вы не использовали состояние. Так что мое предыдущее утверждение не было полностью правильным. Но анимированная библиотека не использует состояние за кулисами, она просто обновляет переменную, которую вы ей предоставляете.

dentemm 01.06.2018 13:30

я понимаю, спасибо за разъяснения. к сожалению, анимация prevState на самом деле не отображает анимацию. ваше предложение - определить объект вне состояния / компонента (let animations = {opacity: new Animated.Value(0.25) };), а затем запустить Animated.timing(animations.opacity ... на этом объекте?

Marco 01.06.2018 13:49

Да, просто определите переменную внутри своего конструктора, например. this.opacity = новый Animated.Value (0,25); (вам не нужно let animated = ...), а затем указать его в своей анимации: Animated.timing (this.opacity ...)

dentemm 01.06.2018 13:54

как я могу вернуть состояние после завершения анимации в getDerivedStateFromProps? Как вернуть состояние в функции обратного вызова?

Devin Gong 24.06.2019 10:11

Простой ответ - просто не использовать состояние для анимации (спасибо dentemm за помощь):

itemOpacity = new Animated.Value(0.25);

class TestScreen extends Component {

  getDerivedStateFromProps(nextProps) {
      let value = 0;

      if (nextProps.items.visible) {
        value = 1;
      }

      Animated.timing(itemOpacity, {
        toValue: value,
        duration: 200,
      }).start();

    return null;
  }
}

Рад, что все получилось! Я бы просто предложил сделать itemOpacity членом вашего класса компонентов по причинам управления памятью. В приведенном выше примере происходит утечка памяти.

dentemm 01.06.2018 20:37

@dentemm Это невозможно, поскольку getDerivedStateFromProps фактически статичен.

user2213590 19.08.2018 16:22

Другие вопросы по теме