Material-UI 列为 Card 的子项,在主展开时触发所有 onClick

Material-UI List as children of Card, fires all onClick on main expand

Material-UI、流星、React

所以我想在卡片中嵌套一个带有 onTouchTap(或 onClick)功能的下拉列表。

它似乎工作正常,没有任何麻烦 - 但是当您展开父卡时,列表中的所有内容都会同时触发 onTouchTap。

我已经厌倦了将其他 Card 元素相互嵌套以达到相同的效果。

这只是代码的限制,还是有一些解决方法?

                    <Card>
            <CardHeader
                title={this.props.foodItem.foodName}
                subtitle={this.genPrtnImg()}
                avatar={this.props.foodItem.imgURL}
                actAsExpander={true}
                showExpandableButton={true}

            />
            <CardText expandable={true}>
                <List subheader="Item Requests">
                    <ListItem
                    primaryText={userName}
                    secondaryText={"Has requested " + prtNo + " portions"}
                    leftAvatar={<Avatar src="http://thesocialmediamonthly.com/wp-content/uploads/2015/08/photo.png" />}
                    primaryTogglesNestedList={true}
                    nestedItems={[
                         <ListItem
                            key={1}
                            primaryText="Accept"
                            leftIcon={<SvgIcons.ActionCheckCircle color='Green'/>}
                            onTouchTap={this.handleAccept(userName, prtNo)}
                         />,
                         <ListItem
                            key={2}
                            primaryText="Reject"
                            leftIcon={<SvgIcons.ContentBlock color='Red'/>} 
                            onTouchTap={this.handleReject(userName)}
                         />,
                    ]}

                />
              </List>
            </CardText>

              </Card>

任何帮助将不胜感激,谢谢!

onClick={this.handleAccept(userName, prtNo)} 将不起作用。这将在实例化时调用 this.handleAccept,而不是在事件触发时调用。您必须使用部分或闭包来获取这些变量。

以下是使用闭包的方法:

getAcceptHandler: function(userName, prtNo) {
  handleAccept = function(event) {
    do_something_with_event_or_ignore_it = event.target...
    do_something_with_userName_and_or_prtNo = userName + prtNo
    this.save(do_something_with_userName_and_or_prtNo)
    ...
  }
  return handleAccept
}

然后像这样更改 JSX:

<ListItem
    key={1}
    primaryText="Accept"
    leftIcon={<SvgIcons.ActionCheckCircle color='Green'/>}
    onTouchTap={this.getAcceptHandler(userName, prtNo)}
/>,

如果您使用的是 ES6

,则有一种更简单的解决方法

您可以将您的 onClick 方法更改为:

onClick={() => { this.handleAccept(userName, prtNo) }}