上下文 API 没有返回被点击元素的 ID

Context API isn't returning the id of clicked element

我正在构建一个 React 应用程序,用户可以在其中选择他们想要的门票数量,然后从布局中选择他们的座位。

我正在使用适用于各种元素的上下文 API,但我正在尝试 return 用户选择的席位的 id .

这是具有可点击元素的组件,我需要从中获取 ID -

class ChooseSeats extends React.Component {
    render(){
        return(<Context.Consumer>
            {(context) => {
                return (
                    <div>
                        <p>Remaining tickets: {context.state.remainingSeats}</p>
                        <p>Chosen seat: {context.state.chosenSeat}</p>

                        <div>
                        <div id="A1" onClick={context.chooseSeats}>
                            <img src={freeSeat} alt="freeSeat"/>
                        </div>
                        <div id="A2" onClick={context.chooseSeats}>
                            <img src={freeSeat} alt="freeSeat"/>
                        </div>
                        <div id="A3" onClick={context.chooseSeats}>
                            <img src={freeSeat} alt="freeSeat"/>
                        </div>
                        </div>
                    </div>  
                
                )}
            }
        </Context.Consumer>
        )
    }
}

这是上下文文件 -

export class Provider extends React.Component {
    state = {
        chosenSeat: " ",
        remainingSeats: 8
    }

    render() {
        const { remainingSeats, chosenSeat } = this.state
        
        return(
            <Context.Provider value={{
                state: this.state,
                chooseSeats: (event) => {
                    this.setState({
                        chosenSeat: event.target.id,
                        remainingSeats: remainingSeats - 1
                    })
                    console.log(chosenSeat)
                },
            }}>
                {this.props.children}
            </Context.Provider>
        )
    }
}

在我的实际应用中,remainingSeats 值最初取自一些下拉菜单,用户在这些菜单中选择他们的票,但为了简单起见,在这种情况下我只给它一个默认值 8。

choseSeats 函数是 运行 因为每次单击座位时 remainingSeats 值都会减 1 但它不会 return chosenSeat。我试过 chosenSeat 作为字符串和数组,但都没有 return 任何东西。

谁能告诉我哪里出错了?

因为 event.target.id 是一个空的 string。尽管您将 onClick 附加到 div 上(应该是 button 以使其可访问),但如果您单击子项 imgevent.targetimg.

您可以使用 event.currentTarget - 它指的是事件处理程序已附加到的元素 (div) - 或者您可以改为创建内联函数并传递 ID。

所以,而不是

<div id="A3" onClick={context.chooseSeats}><img ...

你可以使用

<button onClick={() => context.chooseSeats('A3')}><img ...

并更新您的 chooseSeats,它现在收到一个 ID,而不是 event:

chooseSeats: (id) => {
  this.setState({
    chosenSeat: id,
    remainingSeats: remainingSeats - 1,
  })
  console.log(chosenSeat)
},