【问题标题】:Using onClick event in React map function在 React 地图函数中使用 onClick 事件
【发布时间】:2022-08-04 00:08:00
【问题描述】:

我正在尝试在 MUI 的 List Component 上使用 map 来遍历嵌套对象。执行单击时,所有元素都被单击。

这是我的类组件:

class TablePivot extends React.Component {
    constructor(props) {
        super(props)
        this.state = {
            pivotData: [],
            firstLevelOpen: false,
            secondLevelOpen: false,
            thirdLevelOpen: false,
        }
    handleFirstListClick = () =>{
        this.setState({firstLevelOpen:!this.firstLevelOpen})
        console.log(this.secondLevelOpen)
    }

    handleSecondListClick = () =>{
        this.setState({secondLevelOpen:!this.secondLevelOpen})
        console.log(this.secondLevelOpen)
    }
    
    handleThirdListClick = () =>{
        this.setState({thirdLevelOpen:!this.thirdLevelOpen})
        console.log(this.thirdLevelOpen)
    }

    render () {
        
        return (
            <>
                
                <List>
                    {Object.entries(this.state.pivotData).map((key, val) =>{
                        // console.log(key[1])
                        return (
                        <ListItemButton onClick = {event => this.handleFirstListClick}>
                            <ListItemText primary={key[0]} />
                            {this.state.firstLevelOpen ? <ExpandLess /> : <ExpandMore />}
                            {Object.entries(key[1]).map((key,index) =>{
                                return (
                                    <Collapse in={this.state.firstLevelOpen} timeout=\"auto\" unmountOnExit>
                                        <List component=\"div\" disablePadding>
                                        <ListItemButton onClick = {this.handleSecondListClick} sx={{ pl: 4 }}>
                                            <ListItemText primary={key[0]} />
                                            {this.state.secondLevelOpen ? <ExpandLess /> : <ExpandMore />}
                                            {Object.entries(key[1]).map((key,index) =>{
                                                    <Collapse in={this.state.secondLevelOpen} timeout=\"auto\" unmountOnExit>
                                                        <List component=\"div\" disablePadding>
                                                        <ListItemButton onClick = {this.handleThirdListClick} sx={{ pl: 4 }}>
                                                            <ListItemText primary={key[1]} />
                                                            {this.state.thirdLevelOpen ? <ExpandLess /> : <ExpandMore />}
                                                            {/* {
                                                                Object.entries(key[1]).map((key,index) =>{
                                                                    return (console.log[key])
                                                                })
                                                            } */}
                                                        </ListItemButton>
                                                        </List>
                                                    </Collapse>
                                                })
                                            }
                                        </ListItemButton>
                                        </List>
                                    </Collapse>
                                    
                                )
                            })}
                        </ListItemButton>
                    )
                    
                    
                    })}
                </List>

                
                
                <Snackbar anchorOrigin={{ vertical : \"top\", horizontal : \"right\" }} open={this.state.alert} autoHideDuration={5000} onClose={() => this.setState({alert : false})}>
                    <Alert variant=\"filled\" elevation={6} onClose={() => this.setState({alert : false})} severity={this.state.severity}>
                        {this.state.alertMsg}
                    </Alert>
                </Snackbar>
            </>
        )
    }

我曾尝试在 onclick 中传递索引和事件,如下所示:

handleFirstListClick(event, index) {
        console.log(event.target)

        this.setState(
            prevState => ({
                ...prevState.firstLevelOpen,
                [index]: !prevState.firstLevelOpen
            })
        )

        console.log(this.state.firstLevelOpen)


        // if (this.state.firstLevel === true)
        //     firstLevel[index] = false
        // else
        //     firstLevel[index] = true

        // this.setState({firstLevelOpen:firstLevel});

    }

// Changes inside render() inside list component for passing value
<ListItemButton onClick = {event => this.handleFirstListClick(event, val)}>

但是这样做不会正确更新状态。我不明白出了什么问题。我正在学习使用项目做出反应。我为这个点击事件苦苦挣扎。

    标签: javascript reactjs


    【解决方案1】:

    当您单击第一个ListItemButton 时,它会将firstLevelOpen 状态设置为true

    在这部分代码 {this.state.firstLevelOpen ? &lt;ExpandLess /&gt; : &lt;ExpandMore /&gt;} 因为firstLevelOpen 现在是true,所有第一级ExpandLess 组件都将可见。

    要处理列表中每个按钮的状态,您可以将状态从布尔值更改为对象。您已经做的与下面的代码非常相似。

    this.state = {
        pivotData: [],
        firstLevelOpen: {},
        secondLevelOpen: {},
        thirdLevelOpen: {},
    }
    

    在点击处理程序上

    handleFirstListClick(event, index) {
        this.setState(
            prevState => ({
                firstLevelOpen: {
                    ...prevState.firstLevelOpen,
                    [index]: !prevState.firstLevelOpen[index]
                }
            })
        )
    }
    

    我还没有测试它,但我想它应该可以工作。

    【讨论】:

      猜你喜欢
      • 2021-08-24
      • 2016-12-21
      • 2017-04-06
      • 1970-01-01
      • 1970-01-01
      • 2011-05-13
      • 2022-10-23
      • 2019-07-31
      相关资源
      最近更新 更多