What you'll learn:
You’ve learned about the spread operator which breaks apart an object and uses its properties to set the attributes of a JSX tag.
If we want to write our RadioGroup in JavaScript, we use the spread operator in a similar way to JSX.
Since JSX tags are simply JavaScript calls, we can re-write the <Frame> of our RadioGroup component as follows:
function RadioGroup(){
return(
React.createElement(Frame, {background: null, ...props}
, ...
)
)
}
In the attribute parameter of createElement we can place the spread operator right inside the curly brackets when we construct an object. Don't forget to use a comma when separating parameters!
All in all, the spread operator takes an object, breaks apart all its properties, and spreads them around in a new object.
To illustrate, let's use the console for our next example.
Copy and paste this piece of code:
person = { name: 'Linton', age: Infinity }
We are creating an object called person which has two properties, name and age.
After we press return, we can use the person object to construct a new object.
Let's type this statement inside our console:
{ hobby: "Lie about his age", ...person }
After we press return again, we'll get a new object with a hobby property and all of the person object's properties: name and age.
Furthermore, the parameter position/order of the spread operator, ...person matters!
For example if we type this into the console,
{ age:0, ...person }
The person object's age property is overrides age:0 because the spread operator is last.
Vice versa:
{...person, age:0 }
This time, age:0 overrides the person object's properties.
Therefore, we can conclude that whatever appears last in parameter order has the final say.
The three-dot operator can be used together with object destructuring as well. In fact, it is very common.
function RadioGroup(props) {
return (
<Frame background={null} {...props}>
{props.choices.map(choice => (
<Radio key={choice}>{choice}</Radio>
))}
</Frame>
)
}
{...props}In our case, we are using ...props here to forward the RadioGroup attributes to the Frame. Although it works, we can pass too many properties to the <Frame> tag. For example, when using ...props we are also passing on choices to the <Frame>. However, since choices is not an attribute supported by Frame, we just don't see it, but to be efficient and clear, how can we choose a property to exclude from being passed on?
If you remember, with object destructuring, we can replace props in our RadioGroup parameter with an object.
function RadioGroup({choices}) {
return (
<Frame background={null} {...props}>
{choices.map(choice => (
<Radio key={choice}>{choice}</Radio>
))}
</Frame>
)
}
This change assumes the parameter to be an object, extracts the choices property, and defines a new variable of our choice, in which we named, choices.
We can now change props.choices to choices, but now ...props is undefined.
How can we capture the rest of the properties?
function RadioGroup({choices, ...rest}) {
return (
<Frame background={null} {...rest}>
{choices.map(choice => (
<Radio key={choice}>{choice}</Radio>
))}
</Frame>
)
}
The rest object will have all the properties of the original parameter except the choices property.
As a reminder, object destructuring allows us to create new variables. Therefore, we can name them however we like.
function RadioGroup({optionChoices, ...newProps}) {
return (
<Frame background={null} {...newProps}>
{optionChoices.map(choice => (
<Radio key={choice}>{choice}</Radio>
))}
</Frame>
)
}
Unlike our previous examples, the three-dot operator is working the opposite way. Instead of breaking apart properties, it is collecting the rest of them and assembling them into a new object.
Alright, that’s a short summary about the spread operator. It is commonly used in modern JavaScript due to how convenient the spread operator is.
In the next post, we'll add a React State to our RadioGroup and make it finally functional!