The state is a region or store where all the data we want comes from. The state of any given component should be as minimal as possible. A state is a JavaScript object containing data we would like to use in our app. In our earlier example of an e-commerce website, the state of our products should be present in the <Body/> component and can then be passed down as props to its children's component.
A state can be created with a class component like below, a class function has a built-in state object:
Product.js:
import React from 'react'
export default class Product extends React.Component {
constructor(props) {
super(props);
this.state = {
product: "ice-cream",
};
}
render() {
return (
<div>
<h3> I love {this.props.product} from props </h3>
<p> I love {this.state.product} from state</p>
</div>
);
}
}

State originally belonged only to the class-based components, giving functional components the name ‘stateless components’ but that became false when Hooks were introduced in 2019.
The state of a class component can be changed only by using the function this.setState(). For example,
import React from 'react'
export default class Product extends React.Component {
constructor() {
super()
this.state = {
product: 'ice-cream'
}
}
changeProduct = () => {
this.setState({
product: 'Doughnuts'
})
}
render() {
return (
<div>
<p> I love {this.state.product}</p>
<button onClick={this.changeProduct}>change product</button>
</div>
)
}
}

The original state contained data ‘product’ with value ‘ice-cream’, when the button is clicked, the event ‘onClick’ is triggered and a function changeProduct() is activated that changes the state object’s product value to ‘Doughnut’. Open the browser’s console and navigate to the root <div>, then check the <p> element. Click the button, notice that only ‘ice-cream’ is changed without the whole page re-rendering. That is the power of React virtual DOM.
Let’s create an example where we initialize a state in a Products component and render their value to the browser.
Products.js:
import React, { Component } from 'react'
export default class Products extends Component {
state = {
productName: 'Doughnuts',
id: 20092,
company: 'Doughnuts & Co.'
}
render() {
return (
<div>
<></>
</div>
)
}
}
In Products.js, we initialized a state containing a product name, id, and the company. We now desire to render their values to the screen:
Products.js:
import React, { Component } from 'react'
export default class Products extends Component {
state = {
productName: 'Doughnuts',
id: 20092,
company: 'Doughnuts & Co.'
}
render() {
return (
<div>
<h1>Product</h1>
<h3>{this.state.productName}</h3>
<p>Product ID: {this.state.id}</p>
<p>Courtesy of <strong>{this.state.company}</strong> </p>
</div>
)
}
}
We refer to the state by using the ‘this’ keyword to indicate the current class followed by the property name, this.state.propertyName.

React gives us the opportunity to think more, so as to write less.