@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 для демонстрации анимации, вы можете настроить ее на свое усмотрение.