Как правильно создавать анимацию при удалении чего-либо из 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, поэтому браузер не применяет никаких стилей к несуществующим элементам.
2 варианта достижения того, чего вы хотите, просто измените стили и сохраните узлы в dom, или вы можете использовать https://reactcommunity.org/react-transition-group/css-transition для добавления «выхода», " введите» стили для элементов непосредственно перед тем, как они будут уничтожены/созданы.
Это реакция нативная. реакция-переходная группа предназначена только для Интернета.
Кристофер.
Анимирование элементов после их удаления из DOM может быть сложной задачей, поскольку React удаляет элемент без лишних слов, и по этой причине элемент просто «выскакивает» и не анимируется, как ожидалось. Есть два надежных подхода, чтобы это исправить:
Импортируйте Animated и используйте ссылку:
import React, { useState, useRef } from 'react';
import { View, Text, Button, Animated, StyleSheet } from 'react-native';
Настройка анимации:
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;
isVisible.useNativeDriver: true для повышения производительности.duration, чтобы контролировать скорость анимации.Этот метод обеспечивает эффект плавного перехода при отображении и скрытии компонентов в React Native.
Надеюсь это поможет! Позвольте мне знать, если у вас есть еще вопросы.
группа реакции-перехода не работает для реакции нативного
Изменено, как вы можете использовать анимированные
Раньше я видел ошибку, когда вам приходилось переносить 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>
Когда вы попытаетесь визуализировать его или удалить из пользовательского интерфейса, он покажет вам анимацию затухания. Вы можете вдохновиться этим, чтобы улучшить свое конкретное желание.
При всем уважении, пока вы говорите DOM, в мире React Native вы никогда не достигнете своих целей, друг мой. DOM предназначен для браузера. Здесь нет никакого документа, поэтому у нас нет для него объектной модели. React Native — это платформа, основанная на библиотеке ReactJs, которая имеет VirtualDOM, а средство рендеринга React Native подключает окончательное состояние VDOM к Fiber, Fiber создает ДЕРЕВО, макет и фиксирует его для монтирования в UI_Manager. ссылка для чтения