React Native: как добиться выпадающего меню при нажатии на 3 точки в верхнем заголовке?

#react-native #drop-down-menu

#react-native #выпадающее меню

Вопрос:

Нажмите здесь, чтобы просмотреть изображение

Я попробовал несколько подходов для достижения этой цели в своем приложении. Мое требование заключается в том, чтобы создать интерактивные 3 точки в заголовке экрана и по щелчку по этим 3 точкам открыть подменю с некоторыми пунктами. Далее при нажатии на эти элементы должен быть открыт отдельный экран.

Но каждый раз у меня возникают проблемы. Я попробовал нижеприведенный подход

  1. react-native-popup-menu: не удается его реализовать.

Я застрял в этом несколько дней, приветствуется любой подход / предложение.

Ответ №1:

Вы можете попробовать использовать react-native-element-dropdown

 import React, { useState } from 'react';
  import { StyleSheet, Text, View } from 'react-native';
  import { Dropdown } from 'react-native-element-dropdown';
  import AntDesign from 'react-native-vector-icons/AntDesign';

  const data = [
    { label: 'Item 1', value: '1' },
    { label: 'Item 2', value: '2' },
    { label: 'Item 3', value: '3' },
    { label: 'Item 4', value: '4' },
    { label: 'Item 5', value: '5' },
    { label: 'Item 6', value: '6' },
    { label: 'Item 7', value: '7' },
    { label: 'Item 8', value: '8' },
  ];

  const DropdownComponent = () => {
    const [value, setValue] = useState(null);
    const [isFocus, setIsFocus] = useState(false);

    const renderLabel = () => {
      if (value || isFocus) {
        return (
          <Text style={[styles.label, isFocus amp;amp; { color: 'blue' }]}>
            Dropdown label
          </Text>
        );
      }
      return null;
    };

    return (
      <View style={styles.container}>
        {renderLabel()}
        <Dropdown
          style={[styles.dropdown, isFocus amp;amp; { borderColor: 'blue' }]}
          placeholderStyle={styles.placeholderStyle}
          selectedTextStyle={styles.selectedTextStyle}
          inputSearchStyle={styles.inputSearchStyle}
          iconStyle={styles.iconStyle}
          data={data}
          search
          maxHeight={300}
          labelField="label"
          valueField="value"
          placeholder={!isFocus ? 'Select item' : '...'}
          searchPlaceholder="Search..."
          value={value}
          onFocus={() => setIsFocus(true)}
          onBlur={() => setIsFocus(false)}
          onChange={item => {
            setValue(item.value);
            setIsFocus(false);
          }}
          renderLeftIcon={() => (
            <AntDesign
              style={styles.icon}
              color={isFocus ? 'blue' : 'black'}
              name="Safety"
              size={20}
            />
          )}
        />
      </View>
    );
  };

  export default DropdownComponent;

  const styles = StyleSheet.create({
    container: {
      backgroundColor: 'white',
      padding: 16,
    },
    dropdown: {
      height: 50,
      borderColor: 'gray',
      borderWidth: 0.5,
      borderRadius: 8,
      paddingHorizontal: 8,
    },
    icon: {
      marginRight: 5,
    },
    label: {
      position: 'absolute',
      backgroundColor: 'white',
      left: 22,
      top: 8,
      zIndex: 999,
      paddingHorizontal: 8,
      fontSize: 14,
    },
    placeholderStyle: {
      fontSize: 16,
    },
    selectedTextStyle: {
      fontSize: 16,
    },
    iconStyle: {
      width: 20,
      height: 20,
    },
    inputSearchStyle: {
      height: 40,
      fontSize: 16,
    },
  });
 

Ответ №2:

Вы можете просто создать модальный. Создайте его в соответствии с вашими потребностями и откройте его по щелчку. Внутри modal вы можете просто создать массив действий, которые вы собираетесь выполнить, например:

 const actions=[
"Date range",
"Specific Merchant",
"Repayment History",
]
 

Затем используйте actions.map, чтобы сопоставить их с вашим дизайном.
После этого, для выполнения действия при нажатии любого элемента, вы можете получить индекс выбранного элемента и выполнить определенное действие.