Переключить элемент массива в React Native?

По сути, это карта, на которой есть значки зданий, и когда вы нажимаете на здание, на ней отображается информация об этом здании. Я борюсь с логикой переключения отдельных элементов (строений) в моем массиве. Как, например, отображение только здания 1. Поэтому, когда я нажимаю на маркер, он должен показывать правильное здание в массиве. Я показываю частичный код для mapscreen.js, но при необходимости поделюсь всем.

Buildings.js

export const buildings = [
  {
    name: "Building1",
    description: "This is some information",
    xp: 25,
  },
  {
    name: "Building2",
    description: "This is some information.",
    xp: 25,
  },
];

Mapscreen.js

const [visible, setVisible] = useState(false);

//MAP THROUGH ARRAY, PASS ARRAY ITEMS AS PROPS TO OVERLAY COMPONENT 

const myBuilding = buildings.map((building, i) => (
    <OverlayBox key = {i} title = {building.name} info = {building.description} xp = {building.xp} />
  ));
  const toggleOverlay = () => {
    setVisible(!visible);
  };

return (
    <View>
      <Overlay isVisible = {visible} onBackdropPress = {toggleOverlay}>
        {myBuilding}**<--------DISPLAYS BOTH BUILDINGS RIGHT NOW**
      </Overlay>

      <Marker
          onPress = {toggleOverlay}**<--------WANT TO DISPLAY BUILDING 1**
          coordinate = {{ latitude: 34.0198536, longitude: -80.923467 }}
          title = {"Building1"}
          description = {"25 XP"}
        />
      <Marker
          onPress = {toggleOverlay}**<--------WANT TO DISPLAY BUILDING 2**
          coordinate = {{ latitude: 34.0195536, longitude: -80.924467 }}
          title = {"Building2"}
          description = {"25 XP"}
        />
</View>


Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
0
24
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Ваш подход немного странный

Я предлагаю тебе:

  1. Сделайте только один OverlayBox

  2. Перейдите в toggleOverlay индекс вашего здания, например

    <Маркер onPress = {() => toggleOverlay (0)}

  3. Установите индекс видимого здания в состояние, например

    const toggleOverlay = (индекс) => { setVisibleBuilding (индекс); ... };

  4. И передайте здание в свой OverlayBox, например

    <OverlayBox building = {Buildings [visibleBuildingIndex]} ... />

Я обновляю свой код, вы говорите на первом этапе, что мне действительно не нужно отображать? просто визуализируйте одно наложение правильно, а также что такое visiblebuildingIndex?

lache 06.04.2021 18:30

Я обновил его, но не уверен, что иду в правильном направлении? (размещено под предыдущим кодом)

lache 06.04.2021 18:37

Удалось исправить, при необходимости выложу свое решение.

lache 06.04.2021 19:29

Вы находитесь на правильном пути, нет необходимости создавать более одного оверлейбокса, но вы можете отображать здания для динамического создания маркеров, просто сохраняйте координаты, цвет и то, что в массиве зданий, и, наконец, убедитесь, что настроили индекс здания перед рендерингом вашего OverlayBox

BloodyMonkey 07.04.2021 10:53

Отметьте как решенное, если все готово!

BloodyMonkey 07.04.2021 13:16
//ANSWER
  const [visibleBuilding, setVisibleBuilding] = useState(0);
  const buildings = [
    {
      name: "Building1",
      description:
        " This is some information.",
      xp: 25,
    },
    {
      name: "Building2",
      description: "This is some information.",
      xp: 25,
    },
  ];
  const [visible, setVisible] = useState(false);

  const toggleOverlay = () => {
    setVisible(!visible);
  };

  return (
    <View style = {{ flex: 1 }}>
      <Overlay isVisible = {visible} onBackdropPress = {toggleOverlay}>
        <OverlayBox
          building = {buildings[visibleBuilding]}
          onPress = {() => toggleOverlay()}
          key = {visibleBuilding}
          title = {buildings[visibleBuilding].name}
          info = {buildings[visibleBuilding].description}
          xp = {buildings[visibleBuilding].xp}
        />
      </Overlay>
        <Marker
          onPress = {() => {
            toggleOverlay();
            setVisibleBuilding(0);
          }}
          coordinate = {{ latitude: 34.0198536, longitude: -80.923467 }}
          pinColor = "maroon"
          title = {"Rutledge"}
          description = {"25 XP"}
        />
        

        <Marker
          onPress = {() => {
            toggleOverlay();
            setVisibleBuilding(1);
          }}
          coordinate = {{ latitude: 34.0195536, longitude: -80.924467 }}
          pinColor = "maroon"
          title = {"Swearingen Engineering Center"}
          description = {"25 XP"}
        />
       
    </View>
  );

Другие вопросы по теме