I'm trying to hide a Material-UI Button
ponent by adding the hidden
attribute, but it appears the attribute is ignored. I've used the hidden
attribute on other Material-UI ponents such as Typography
, Grid
and Box
and there it works fine. Below is a simplified snippet of my code. Click here to try it out on CodeSandbox.
<Typography hidden={loading}>
Works. This text is not displayed when `loading` is truthy.
</Typography>
<Button hidden={loading}>
Doesn't work. This Button is still there!
</Button >
I'm trying to hide a Material-UI Button
ponent by adding the hidden
attribute, but it appears the attribute is ignored. I've used the hidden
attribute on other Material-UI ponents such as Typography
, Grid
and Box
and there it works fine. Below is a simplified snippet of my code. Click here to try it out on CodeSandbox.
<Typography hidden={loading}>
Works. This text is not displayed when `loading` is truthy.
</Typography>
<Button hidden={loading}>
Doesn't work. This Button is still there!
</Button >
Share
Improve this question
asked Jan 12, 2021 at 13:53
Martin DevillersMartin Devillers
18k6 gold badges50 silver badges92 bronze badges
3
- material-ui./api/button It does not have hidden prop. I'd suggest conditional rendering. – Mindaugas Nakrosis Commented Jan 12, 2021 at 13:58
-
@MindaugasNakrosis neither material-ui./api/typography has a
hidden
prop. While I do agree with your suggestion of using conditional rendering, it would still be interesting to understand why the two ponents behave differently. – secan Commented Jan 12, 2021 at 14:17 -
Both ponents inherit their
hidden
prop fromHTMLAttributes
, along with a bunch of other standard props likeid
,style
,className
, etc. Am I not supposed to use these properties? – Martin Devillers Commented Jan 13, 2021 at 12:53
1 Answer
Reset to default 14TLDR: Don't use the hidden
attribute. Use conditional rendering like {loading && <Component/>}
or a style like <Component style={{ display: loading ? 'none' : undefined }} />
First, the hidden
attribute has nothing to do with Material UI or React, but is a default HTML attribute from the web standard. Second, the hidden
attribute is overridden if a display: ...
style is applied to the same element. It doesn't matter if these styles are inline or ing from CSS. As a result, the hidden
attribute is "ignored" by any Material-UI ponent that happens to set the display
attribute.
You can try this on any of the examples from the official docs. For example, playing around with CodeSandbox you can see hidden
work on Card
, CardContent
and Typography
, but ignored on CardActionArea
, CardMedia
, CardActions
and Button
.
Considering the above it's best to avoid the hidden
attribute as its behavior is different on a per-ponent basis. Moreover, if in any next version of Material UI a ponent is updated to use display
internally, it'll change the semantics of hidden
for that ponent and break stuff in your code base.