尝试更改单个列表项的图标

时间:2018-06-26 16:52:00

标签: css reactjs react-native

我正在尝试创建一个可扩展的列表组件。当我单击列表项时, 我想更改它右边的图标。现在,当点击列表项时, 每个图标都会更改。我只希望更改该特定项目的图标。是 考虑了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
    )


  }
}

2 个答案:

答案 0 :(得分:1)

您正在执行布尔值,并且所有列表项都在寻找相同的值。为了实现所需的值,您需要传递一个唯一值,在这种情况下,我正在使用索引,但理想情况下,除了索引之外,您还将拥有一个唯一的标识符。

下面应该能够满足您的需求

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是用逗号分隔的字符串,并且该字符串没有映射功能。

上面的代码也没有考虑取消选择已经选择的列表项。可以通过检查状态中的值以及将其重置为空来确定状态是否相同。

答案 1 :(得分:1)

这也是一种方法:

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);

工作示例here