Как сделать раскрывающийся блок в react native?

Пользователь

от rachel , в категории: JavaScript , 2 года назад

Как сделать раскрывающийся блок в react native?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от jensen , 2 года назад

@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.

Пользователь

от brook , 10 месяцев назад

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