Анимация при удалении из dom

Как правильно создавать анимацию при удалении чего-либо из DOM?

Кажется, что независимо от того, что я делаю, когда я удаляю что-то из dom, это не запускает повторный рендеринг до тех пор, пока элементы не будут удалены, а затем он исчезает из поля зрения вместо перехода, прежде чем он удалит данные. Вот пример того, что я пробовал.

  const [isExpanded, setIsExpanded] = useState(false);
  const [isVisible, setIsVisible] = useState(false);

  const toggleReplies = () => {
    LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut);

    if (isExpanded) {
      setIsVisible(false);
      setTimeout(() => {
        setIsExpanded(false);
      }, 300);
    } else {
      setIsExpanded(true);
      setIsVisible(true);
    }
  };

  return (
    <View style = {styles.container}>
      <Button title = "Toggle Replies" onPress = {toggleReplies} />
      {isVisible && (
        <View style = {styles.replyBox}>
          <Text>This is a reply!</Text>
        </View>
      )}
    </View>
  );
};

При всем уважении, пока вы говорите DOM, в мире React Native вы никогда не достигнете своих целей, друг мой. DOM предназначен для браузера. Здесь нет никакого документа, поэтому у нас нет для него объектной модели. React Native — это платформа, основанная на библиотеке ReactJs, которая имеет VirtualDOM, а средство рендеринга React Native подключает окончательное состояние VDOM к Fiber, Fiber создает ДЕРЕВО, макет и фиксирует его для монтирования в UI_Manager. ссылка для чтения

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

Ответы 4

Это распространенная проблема при анимации компонентов и элементов реакции. Реакция создает и уничтожает узлы dom, поэтому браузер не применяет никаких стилей к несуществующим элементам.

2 варианта достижения того, чего вы хотите, просто измените стили и сохраните узлы в dom, или вы можете использовать https://reactcommunity.org/react-transition-group/css-transition для добавления «выхода», " введите» стили для элементов непосредственно перед тем, как они будут уничтожены/созданы.

Это реакция нативная. реакция-переходная группа предназначена только для Интернета.

Christopher Mellor 15.07.2024 18:26

Кристофер.

Анимирование элементов после их удаления из DOM может быть сложной задачей, поскольку React удаляет элемент без лишних слов, и по этой причине элемент просто «выскакивает» и не анимируется, как ожидалось. Есть два надежных подхода, чтобы это исправить:

Решение с использованием анимированного API:

  1. Импортируйте Animated и используйте ссылку:

    import React, { useState, useRef } from 'react';
    import { View, Text, Button, Animated, StyleSheet } from 'react-native';
    
  2. Настройка анимации:

    const MyComponent = () => {
      const [isVisible, setIsVisible] = useState(true);
      const fadeAnim = useRef(new Animated.Value(1)).current; // Initial opacity value
    
      const toggleReplies = () => {
        if (isVisible) {
          // Fade out animation
          Animated.timing(fadeAnim, {
            toValue: 0,
            duration: 300,
            useNativeDriver: true,
          }).start(() => {
            setIsVisible(false); // Hide component after fade out
          });
        } else {
          setIsVisible(true); // Show component
          // Reset opacity to 1 before fade in
          fadeAnim.setValue(0);
          // Fade in animation
          Animated.timing(fadeAnim, {
            toValue: 1,
            duration: 300,
            useNativeDriver: true,
          }).start();
        }
      };
    
      return (
        <View style = {styles.container}>
          <Button title = "Toggle Replies" onPress = {toggleReplies} />
          {isVisible && (
            <Animated.View style = {{ ...styles.replyBox, opacity: fadeAnim }}>
              <Text>This is a reply!</Text>
            </Animated.View>
          )}
        </View>
      );
    };
    
    const styles = StyleSheet.create({
      container: {
        flex: 1,
        justifyContent: 'center',
        alignItems: 'center',
      },
      replyBox: {
        padding: 20,
        backgroundColor: 'lightgray',
        marginTop: 10,
      },
    });
    
    export default MyComponent;
    

Объяснение:

  1. Animated API: используется для создания анимации постепенного появления и исчезновения.
  2. Функция toggleReplies: управляет видимостью компонента и запускает анимацию.
  3. Условный рендеринг: компонент условно визуализируется на основе состояния isVisible.

Дополнительные советы:

  • Обязательно используйте useNativeDriver: true для повышения производительности.
  • Отрегулируйте значение duration, чтобы контролировать скорость анимации.

Этот метод обеспечивает эффект плавного перехода при отображении и скрытии компонентов в React Native.

Надеюсь это поможет! Позвольте мне знать, если у вас есть еще вопросы.

группа реакции-перехода не работает для реакции нативного

Christopher Mellor 15.07.2024 19:20

Изменено, как вы можете использовать анимированные

Cafer Yükseloğlu 17.07.2024 00:16

Раньше я видел ошибку, когда вам приходилось переносить Layoutanimation.Confi.. за пределы вызова функции. Может быть, в useEffect или просто в рендере функции после инициализации и посмотрим, сработает ли это.

Чтобы Layout Animation работала на Android, вам необходимо включить setLayoutAnimationEnabledExperimental.

Я предполагаю, что вы уже используете React Navigation, поэтому в вашем проекте уже будет доступен React Native Reanimated . Вы можете начать с добавления его в свой package.json, если он еще не присутствует. Затем вы сможете использовать его для входа/выхода из анимации довольно легко.

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

Я не знаю, что именно вы хотите сделать с исчезновением, но определенно ваше решение — анимация. Я думаю, что следующие коды помогут вам достичь вашей цели:

import React from 'react';
import type {FC, ReactNode} from 'react';
import Animated, {
  FadeInUp,
  FadeOutUp,
  useAnimatedStyle,
  useSharedValue,
} from 'react-native-reanimated';


interface FadeViewProps {
  id: string | number; // <== pass a unique id here
  children?: ReactNode;
}

const FadeView: FC<FadeViewProps> = ({ id, children }) => {
  const opacity = useSharedValue(1);

  const wrapperAnimantedStype = useAnimatedStyle(() => {
    opacity: opacity.value,
  });

  return (
    <Animated.View
      key = {id}
      entering = {FadeInUp}
      exiting = {FadeOutUp}
      style = {[wrapperAnimantedStype]}
    >
     {children}
    </Animated.View>

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

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