Utk*_*mir 2 javascript reactjs material-ui
我想创建一个国家/地区列表,其中的 ListItems 是可单击的,并且每个 ListItem 在单击时在文本附近都有一个图标。我创建了一个列表并实现了列表的可点击属性。但是,当我单击列表中的一个列表项时,我无法一次性选择其他项目,它首先取消选择前一个项目,然后选择另一个项目。这是我的实现中包含的代码部分:
\nclass CountryList extends Component {\n constructor(props) {\n super(props);\n this.state = {clicked: false};\n this.handleClick = this.handleClick.bind(this);\n }\n\n handleClick() {\n this.setState(state => ({\n clicked: !state.clicked\n }));\n }\n\n render()\xc2\xa0{\n const {classes} = this.props;\n const { clicked } = this.state;\n\n let listItems = myList.map((item) =>\n <>\n <ListItem className={ clicked ? classes.listItemClicked : classes.listItemNotClicked }\n onClick={this.handleClick} classes={classes.ListItem} button key={item.id}>\n \n {clicked ? \n <ListItemIcon><DoneIcon style={{ color: \'rgb(239, 239, 239)\', fontSize: \'2.2rem\' }}/></ListItemIcon>\n : <ListItemIcon><DoneIcon style={{ display: \'none\', color: \'rgb(239, 239, 239)\', fontSize: \'2.2rem\', backgroundColor: \'rgb(239, 239, 239)\' }}/></ListItemIcon>}\n\n <ListItemText classes={{primary: classes.listItemText}} primary={item.value} />\n </ListItem>\n <Divider /> \n </>\n );\n\n return (\n <List className={classes.list}>{listItems}</List>\n );\n }\n}\n\n\nconst myList = [\n {id: 1, value: \'Albania\'}, {id: 2, value: \'Austria\'}, {id: 3, value: \'Belarus\'}, {id: 4, value: \'Belgium\'}, \n {id: 5, value: \'Bosnia\'}, {id: 6, value: \'Bulgaria\'}, {id: 7, value: \'Croatia\'}, {id: 8, value: \'Cyprus\'}, \n {id: 9, value: \'Czech\'}, {id: 10, value: \'Denmark\'}, {id: 11, value: \'Estonia\'}, {id: 12, value: \'Finland\'}, \n {id: 13, value: \'France\'}, {id: 14, value: \'Germany\'}, {id: 15, value: \'Greece\'}, {id: 16, value: \'Hungary\'}, \n {id: 17, value: \'Iceland\'}, {id: 18, value: \'Ireland\'}, {id: 19, value: \'Italy\'}, {id: 20, value: \'Latvia\'}, \n {id: 21, value: \'Lithuania\'}, {id: 22, value: \'Luxembourg\'}, {id: 23, value: \'Macedonia\'}, \n {id: 24, value: \'Malta\'}, {id: 25, value: \'Moldova\'}, {id: 26, value: \'Montenegro\'}, \n {id: 27, value: \'Netherlands\'}, {id: 28, value: \'Norway\'}, {id: 29, value: \'Pakistan\'}, \n {id: 30, value: \'Poland\'}, {id: 31, value: \'Portugal\'}, {id: 32, value: \'Romania\'}, {id: 33, value: \'Russia\'}, \n {id: 34, value: \'Serbia\'}, {id: 35, value: \'Slovakia\'}, {id: 36, value: \'Slovenia\'}, \n {id: 37, value: \'Spain\'}, {id: 38, value: \'Sweden\'}, {id: 39, value: \'Switzerland\'}, {id: 40, value: \'Turkey\'}, \n {id: 41, value: \'Ukraine\'}, {id: 42, value: \'Others\'}\n];\nRun Code Online (Sandbox Code Playgroud)\n这是 App.js 文件中的代码:
\n<CountryList myList={myList} />\nRun Code Online (Sandbox Code Playgroud)\n另外,我在文本之前添加了一个图标。当我单击 1 个项目时,它会显示该图标,但是如果我的鼠标位于其上,它还会显示另一个元素图标。我想显示单击元素的图标。我怎样才能实现这个目标?
\n这是截图:
\n\n如果你仔细看的话,比利时旁边有一个图标。
\n这是codesandbox中代码的链接: https://codesandbox.io/s/gifted-snow-5p1gd ?file=/src/Country.js
\n这是一个工作演示
您需要将活动列表项保持在某种状态,正如我在代码中看到的那样,它this.state.clicked是一个布尔值,所以现在您没有办法设置单击元素的样式,因为没有对所选元素的引用
设置状态以保留单击的项目
this.state = { clickedItem: "" };
Run Code Online (Sandbox Code Playgroud)
将 onClick 更改为。
<ListItem
key={item.id}
className={
this.state.clickedItem === item.id
? classes.listItemClicked
: classes.listItemNotClicked
}
onClick={() => this.handleClick(item)}
>
Run Code Online (Sandbox Code Playgroud)
在onCLick中将点击的项目设置为状态
handleClick(item) {
this.setState({
clickedItem: item.id
});
}
Run Code Online (Sandbox Code Playgroud)
现在您已在状态中单击了项目,在下一个渲染中(这将由于上述状态更改而发生),您可以在渲染中具有以下逻辑
<ListItem
key={item.id}
className={
this.state.clickedItem === item.id //if item.id === clickedItemId then add a separate css class
? classes.listItemClicked
: classes.listItemNotClicked
}
onClick={() => this.handleClick(item)}
>
<ListItemIcon>
//if item.id === clickedItemId then show the DoneIcon
{this.state.clickedItem === item.id && (
<DoneIcon
style={{ color: "rgb(239, 239, 239)", fontSize: "2.2rem" }}
/>
)}
</ListItemIcon>
<ListItemText primary={item.value} />
</ListItem>
Run Code Online (Sandbox Code Playgroud)