First of all, JSX is just a syntactic sugar for React.createElement
. So, it may look like, but, in reality, you don't specify html attributes
: in fact, you are always passing props
.
For instance, the JSX code <input type="button" value="My button" />
is transpiled into React.createElement('input',{type:'button',value:'My Button'})
. And, when necessary, React engine renders this React Element
to the DOM as a HTML element.
That said, we have that JSX transpiles a prop
without a value as true (check docs). For instance: <Button active></Button>
is transpiled to React.createElement(Button, { active: true });
.
But, we know that HTML5 specification does not accept attribute=true
(as pointed here). For instance: <button disabled=true></button>
is invalid. The correct is <button disabled></button>
.
So, to render the HTML element to the DOM, React considers only props
that are valid attributes
(if not, the attribute is not rendered). Check all supported html attributes. And, then, finally, if it's a boolean attribute, it removes the true/false value, rendering it properly.
For instance: <button active={true}></button>
is transpiled to React.createElement("button", { active: true });
and then React renders to the DOM <button></button>
, because there is no active
attribute in HTML specification for the <button/>
tag (is not in the supported attributes list).
But <button disabled={true}></button>
is transpiled to React.createElement("button", { disabled: true });
and React renders to the DOM <button disabled></button>
.
I just said that to clarify your case.
You're trying to pass an active
prop to the Button
component (first letter uppercase means that's a React component: there is a React Component called Button
handled somewhere in your code).
That means:
<Button active></Button>
is transpiled to React.createElement(Button, { active: true });
and
<Button active={true}></Button>
is transpiled to React.createElement(Button, { active: true });
The same thing!
So, if you want to do a conditional prop
, you can simply do something like that:
<Button active={this.state.view === 'default'}></Button>
You have a condition inside brackets. Means that, if your this.state.view
is equal to default
(true), active
prop will be passwed down to the component with the true
value. If not equal, with the false
value.
Button
Component, then, must someway handle this active
prop. It can render the button
element and, for instance, change it's style, pass the disabled
prop... I created a fiddle to demonstrate this: https://jsfiddle.net/mrlew/5rsx40gu/