Попытка изменить значок для одного элемента списка

Я пытаюсь создать компонент расширяемого списка. Когда я нажимаю на элемент списка, Я хочу, чтобы значок справа от него изменился. Прямо сейчас, когда нажимается элемент списка, каждая иконка будет изменена. Я хочу, чтобы изменился только значок этого конкретного элемента. Был думал об этом в течение 20 минут и решил, что обращусь за помощью. Спасибо!

import { List, ListItem } from 'react-native-elements';

export default class ExpandingList extends Component {

  constructor(props){
    super(props)

    this.state = {
      visibleItems: false
    }
  }

  toggleMenu(){
    this.setState({
      visibleItems: !this.state.visibleItems
    })
  };

  render() {
    const list = "list 1, list 2, list 3";

    return (
    <View>
      <List>
        {
        list.map((item, i) => (
          <ListItem
            onPress = { () => this.toggleMenu() }
            key = {i}
            rightIcon = {this.state.visibleItems ? iconRight : iconDown}
            title = {item} />
        ))
        }
      </List
    </View
    )


  }
}

Что должны удерживать видимые предметы?

Colin Ricardo 26.06.2018 18:56

логическое извинение по этому поводу

Dres 26.06.2018 19:19

Вам нужно поддерживать список элементов, по которым щелкнули, а не одно логическое значение.

Colin Ricardo 26.06.2018 19:22

понятно. Кевин помог мне внизу. Спасибо!

Dres 26.06.2018 19:25
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
0
4
1 403
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

Ниже должно быть достигнуто то, что вы ищете

import { List, ListItem } from 'react-native-elements';

export default class ExpandingList extends Component {

  constructor(props){
    super(props)

    this.state = {
      visibleItems: null
    }
  }

  toggleMenu(itemIndex){
    this.setState({
      visibleItems: itemIndex
    })
  };

  render() {
    const list = "list 1, list 2, list 3";

    return (
    <View>
      <List>
        {
        list.map((item, i) => (
          <ListItem
            onPress = { () => this.toggleMenu(i) }
            key = {i}
            rightIcon = {this.state.visibleItems === i ? iconRight : iconDown}
            title = {item} />
        ))
        }
      </List
    </View
    )


  }
}

Примечание: я предполагаю, что у вас уже есть этот рендеринг, но для других людей. Список const представляет собой строку, разделенную запятыми, а строка не имеет функции сопоставления.

Также в приведенном выше коде не учитывается отмена выбора элемента списка, который уже был выбран. Это можно сделать, проверив значение в состоянии и вернув значение обратно к нулю, если оно такое же.

вот и получилось! да, я набирал его из своего фактического кода вместо того, чтобы копировать / вставлять. Изначально это был массив строк list = ["list 1" , "list 2", ... ] . хороший улов! спасибо за вашу помощь: D

Dres 26.06.2018 19:24

Вот способ сделать это также:

import React from "react";
import ReactDOM from "react-dom";

class App extends React.Component {
  state = {
    visibleItem: 0
  };

  select = i => {
    this.setState({
      visibleItem: i
    });
  };

  render() {
    const items = [1, 2, 3, 4];

    return (
      <React.Fragment>
        {items.map((v, i) => {
          return (
            <div
              style = {{ color: this.state.visibleItem === i ? "red" : "black" }}
              onClick = {() => this.select(i)}
            >
              {v}
            </div>
          );
        })}
      </React.Fragment>
    );
  }
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

Рабочий пример здесь.

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