@rachel
Чтобы сделать раскрывающийся блок в React Native, вы можете использовать анимацию и компоненты View и Text. Следующий код приведет вас в нужном направлении:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
import React, { useState } from 'react'; import { View, Text, StyleSheet, TouchableOpacity } from 'react-native'; const CollapsibleBlock = () => { const [expanded, setExpanded] = useState(false); return ( <View style={styles.container}> <TouchableOpacity onPress={() => setExpanded(!expanded)} style={styles.header} > <Text style={styles.headerText}>Нажмите здесь, чтобы раскрыть</Text> </TouchableOpacity> {expanded && ( <View style={styles.body}> <Text style={styles.bodyText}> Это содержимое раскрывающегося блока </Text> </View> )} </View> ); }; const styles = StyleSheet.create({ container: { backgroundColor: '#fff', margin: 10, overflow: 'hidden', }, header: { padding: 10, }, headerText: { fontWeight: 'bold', }, body: { padding: 10, backgroundColor: '#eee', }, bodyText: { fontSize: 16, }, }); export default CollapsibleBlock; |
Этот код создает раскрывающийся блок, который может быть раскрыт или скрыт при нажатии на заголовок. Когда раскрыт, он показывает содержимое внутри компонента View.
@rachel
Вы можете использовать компоненты Animated и LayoutAnimation для добавления анимации раскрытия блока.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
import React, { useState } from 'react';
import { View, Text, StyleSheet, TouchableOpacity, LayoutAnimation, Animated } from 'react-native';
const CollapsibleBlock = () => {
const [expanded, setExpanded] = useState(false);
const bodyHeight = new Animated.Value(0);
const toggleExpanded = () => {
LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut);
setExpanded(!expanded);
if (expanded) {
Animated.timing(bodyHeight, {
toValue: 0,
duration: 300,
useNativeDriver: false,
}).start();
} else {
Animated.timing(bodyHeight, {
toValue: 100,
duration: 300,
useNativeDriver: false,
}).start();
}
};
return (
<View style={styles.container}>
<TouchableOpacity
onPress={toggleExpanded}
style={styles.header}
>
<Text style={styles.headerText}>Нажмите здесь, чтобы раскрыть</Text>
</TouchableOpacity>
<Animated.View style={[styles.body, { height: bodyHeight }]}>
{expanded && (
<Text style={styles.bodyText}>
Это содержимое раскрывающегося блока
</Text>
)}
</Animated.View>
</View>
);
};
const styles = StyleSheet.create({
container: {
backgroundColor: '#fff',
margin: 10,
overflow: 'hidden',
},
header: {
padding: 10,
},
headerText: {
fontWeight: 'bold',
},
body: {
padding: 10,
backgroundColor: '#eee',
overflow: 'hidden',
},
bodyText: {
fontSize: 16,
},
});
export default CollapsibleBlock;
|
В этом коде мы использовали компонент Animated, чтобы анимировать значение высоты body блока в зависимости от того, активен ли блок или нет. Мы также использовали компонент LayoutAnimation для добавления стандартной анимации easing при расширении и сворачивании блока. В коде я задал высоту блока 100 для демонстрации анимации, вы можете настроить ее на свое усмотрение.