React's props with the same name as their value

Reactjs

Reactjs Problem Overview


Can we pass props to a component that has the same name and value implicitly?

Example: Let's say that I have a variable called x: const x = 1; and I have a component that has a prop called x. Can I pass it this variable as value implicitly? like that: <div x/>?

Reactjs Solutions


Solution 1 - Reactjs

Booleans can be passed implicitly to the component as @Ajay also pointed out in comments, like

<div x />

which is basically equivalent to

<div x={true} />

However, if your variable is something other than a boolean, then you need to write it like

<div x={x} />

Or if you have a number of such props, you can form an object like

const cmpProps = {
   x,
   y,
   foo,
   bar
}

and pass them using Spread attributes like

<Comp {...cmpProps} />

Solution 2 - Reactjs

I had a slight epiphany when reading these answers. Since in ES6+ you can add an existing variable to an object like this:

const x = 42;
const obj = { x, y: 1337 };
console.log(obj); // result { x: 42, y: 1337 }

That means you can add a named prop to a React component like:

const x = 42;
const elm = <MyComponent {...{x}} />;

Solution 3 - Reactjs

You can't, a prop with no assigned value (<div x />) is a shortener for (<div x={true} />) (as Ajay Varghese pointed out);

Passing the same variable name would be <div x={x} />

If you need to pass multiple values directly in JSX props you can use the JSX Spread Attributes.

const divProps = { x: 1, y: 2 };
...
<div {...divProps} />

It is often used to pass all props from parent to children.

You can also override a prop by assigning it after the spread :

<div {...divProps} x=3 />

Solution 4 - Reactjs

I also had the ViggoV's approach.
To clarify destructuring within react props and knowing props are objects literal:

let text = "Aloha";

console.log( text );        //"Aloha"

// ❌ wrong one
console.log({ text })       /* { a : "Aloha" } indeed, this transforms variable
                               text into object but at reception of  
                               a component this one would result as "{}"  
                               as here we only pass the props' name -->  
                               returning indeed a value hence implicitly
                               == true */


// ✅ good one
console.log({ ...{ text }}) /* { a : "Aloha" } also transforms variable text  
                               into an object but this trick ( for 
                               component ) actually returns the  
                               - the props' name: "text"
                               - the props' value : which is now an 
                               object { text : 'Hello' }
                             */
   

➡️Example: showing the effects of destructured props passed

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionPistolpete .View Question on Stackoverflow
Solution 1 - ReactjsShubham KhatriView Answer on Stackoverflow
Solution 2 - ReactjsViggoVView Answer on Stackoverflow
Solution 3 - ReactjsDyoView Answer on Stackoverflow
Solution 4 - ReactjsLaurelineView Answer on Stackoverflow