Reputation: 137
Let's say I have a simple code like:
<ListItem
button={true}
>
<Typography variant='caption' color='primary'>
{value}
</Typography>
<Button
onClick={foo}
>
Button
</Button>
</ListItem>
When I click anything inside the ListItem the ripple effect is trigger, which is ok, but when I click the button I don't want the ripple effect of the parent component to be triggered. How do I do that?
Upvotes: 1
Views: 2452
Reputation: 975
<ListItem button={true} matRipple #parent>
<Typography variant='caption' color='primary' matRipple [matRippleTrigger]="parent"
[matRippleDisabled]="true">
{value}
</Typography>
<Button onClick={foo}>
Button
</Button>
</ListItem>
You need something like this: Add Template variable that element which should be animated. And trigger parent ripple by children with [matRippleTrigger] option.
Upvotes: 0
Reputation: 15452
You can try to use disableRipple
property of ListItem
. Set it to true
when clicking on button and set it to false
when clicking on list item, something like:
const foo = () => this.setState(prevState => ({
...prevState,
parentDisableRipple: true
}));
const enableRipple = () => this.state.parentDisableRipple && this.setState(prevState => ({
...prevState,
parentDisableRipple: false
}));
return (
<div>
<Hello name={this.state.name} />
<p>
Start editing to see some magic happen :)
</p>
<ListItem button={true}
disableRipple={this.state.parentDisableRipple}
onClick={enableRipple()}>
<Typography variant='caption' color='primary'>
{value}
</Typography>
<Button onClick={foo} >Button</Button>
</ListItem>
</div>
);
I created a STACKBLITZ to play with
UPDATE
There is a better solution by @Domino987 using onMouseDown
and event.stopPropagation()
(already mentioned here by @vasanthcullen) and <ListItemSecondaryAction>
wrapper.
I updated my STACKBLITZ with both these solutions
Upvotes: 6
Reputation: 386
Use event.stopPropagation() inside the click handler of the button. In your case, inside the foo() function
Upvotes: 5