简体   繁体   中英

Stop parent component ripple being triggered from child component

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?

Use event.stopPropagation() inside the click handler of the button. In your case, inside the foo() function

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

I updated my STACKBLITZ with this solution

<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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM