Получить высоту переменных дочерних элементов в функциональном компоненте в React Native

Я пытаюсь получить высоту детей в моем компоненте, чтобы реализовать анимацию.

Это компонент карты Не развернутый компонент карты

Расширено дочерними элементами введите здесь описание изображения

Я хотел бы получить высоту дочерних компонентов, чтобы я мог анимировать значение высоты, чтобы добиться анимированного расширения.

{expanded ? (
        <>
          <Animated.View style={{height: someAnimatedHeight}}>
            <View onLayout={handleLayout}>
              {children}
            </View>
          </Animated.View>
          <PromoCodeArea />
        </>
      ) : (
        <PromoCodeArea />
      )}

ручкамакет

const handleLayout = ({ nativeEvent }) => {
    setContainerHeight(nativeEvent.layout.height);
  };

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

Я бы хотел, чтобы анимация была гибкой и расширялась до высоты детей.

Когда handleLayout не расширен, возвращается значение 0, поэтому я не могу установить toValue:

const startAnimation = () => {
    Animated.spring(heightAnimation, {
      toValue: 125, <-- like this to be based on the height of children
    }).start();
  };

Мне не удалось найти примеры того, как это достигается с помощью функциональных компонентов и хуков.


person RonE    schedule 15.01.2020    source источник


Ответы (1)


Одна стратегия (которая некрасива, но работает для меня) состоит в том, чтобы изначально установить дочерний стиль на непрозрачность 0 (чтобы никто его не видел) и расположить «абсолютно», чтобы он не мешал вашему видимому макету и не установите высоту на 0, чтобы он отображался в требуемом размере. После того, как он будет отрендерен (рассмотрите возможность использования useLayoutEffect), получите высоту из onLayout и сохраните ее, а затем верните стиль в то состояние, которое у вас есть на данный момент, прежде чем кто-либо получит возможность взаимодействовать с ним.

person Martin Lockett    schedule 25.06.2020
comment
Ээк, о боже лол!!! - person arled; 27.03.2021