Вы должны создать переменную состояния для хранения статуса clickkec или не щелкнул вас, что вы можете использовать его, чтобы поменять местами значок
import React from 'react'
import {List, ListItem} from '@material-ui/core'
import AddCircleIcon from '@material-ui/icons/AddCircleOutline'
import BlockIcon from '@material-ui/icons/BlockOutlined'
const StackOverflow = () => {
const [clicked, setClicked] = useState(false)
const handleIconClick = (id) => {
setClicked(true)
// change <AddCircleIcon /> to <BlockIcon /> at "id"
}
return (
<List component="nav">
<ListItem>
<ListItem button onClick={handleIconClick(101)}>
{clicked ? <BlockIcon /> : <AddCircleIcon /> }
</ListItem>
</ListItem>
</List>
)
}
export default StackOverflow
Я также заметил, что, так как вы используете список, вы будетеВозможно, вы захотите щелкнуть по нескольким элементам, и если это так, то вам лучше иметь его в форме ниже
const StackOverflow = () => {
const [clicks, setClicks] = useState([])
//add the id to the array of clicked items if it doesn't exist but if it does exist remove it. this makes sure that double clicking on an item brings it back to normal
const handleIconClick = (id) => {
let result = clicks.includes(id)? clicks.filter(click => click != id): [...clicks, id]
setClicks(result)
// change <AddCircleIcon /> to <BlockIcon /> at "id"
}
return (
<List component="nav">
<ListItem>
<ListItem button onClick={handleIconClick(101)}>
{clicks.includes(101) ? <BlockIcon /> : <AddCircleIcon /> }
</ListItem>
</ListItem>
</List>
)
}
export default StackOverflow
В операторе возврата обратите внимание, что если вы просматриваете элементы перед отображением, то выпридется отправить, но идентификатор в clicks.include(id)
и handleIconClick (id) теперь будет использовать идентификатор, а не жестко закодированный номер