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) }}
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) }}