DEV Community

Cover image for React Element vs Component: A deep dive into differences | iFour
Harshal Suthar
Harshal Suthar

Posted on • Originally published at ifourtechnolab.com

React Element vs Component: A deep dive into differences | iFour

Before we begin with React elements and components, let’s understand what makes ReactJS so popular among today’s top development platforms. It was initially designed to construct web app components, but as it gained popularity, its ecosystem grew dramatically, encompassing a wide range of use cases.

Even Facebook has experimented React.js for a limited number of adjustments in its app. Since it worked perfectly, the firm ended up switching the whole project onto React.js.

React.js is preferred for creating dynamic UIs and web apps faster. The terms elements, instances, and components work differently in React. Despite their functional differences, they work collaboratively while application development.

In this blog, we will deep dive into the major differences between React elements and components practically.

What is a React Component?

React components are independent units of code that serve as JavaScript functions. There are two types of components in React.js.

  • Functional Component
  • Class Component

A class component is a set of methods that offer functionality to an application, whereas a functional component is a JavaScript-like function that provides React JSX (a hybrid of HTML and JavaScript) as output during the execution.

A component can return anything from a simple HTML element with some inside content to a comprehensive logic-filled UI and functionality.

Below example shows one Functional component:


const App = () => {
    return (
       <div>
           <h1>Hello React from localhost</h1>

<h2>Welcome to React, Best frontend Framework</h2>
       </div>
    );
};


Enter fullscreen mode Exit fullscreen mode

In React, we can render the component inside another component. To do so, we wrap that component inside angle brackets like React element inside another component as shown:


const Greetings = ({ msg }) => {
    return<p>{msg}</p>;
};

const App = () => {
    return <greetings msg="Hello React from localhost" />;
};

Enter fullscreen mode Exit fullscreen mode

We can render the same component several times. When we render a React component as a React element, we generate an instance of that component.



const Greetings = ({ text }) => {
    return<p>{text}</p>;
};

const App = () => {
    return (
        <>
            <greetings text="Instance 1 of Greeting" />
            <greetings text="Instance 2 of Greeting" />
            <greetings text="Instance 3 of Greeting" />
             </>
    );
};


Enter fullscreen mode Exit fullscreen mode

It should be noted that the React component is only declared once. However, we can use the same component multiple times as React Element in JSX. Every time React element is used it becomes the instance of that component.

Looking to hire ReactJS developer? Your search ends here.

What is a React Element?

React element is something that describes DOM nodes and properties virtually. It holds the component related information such as component type, child elements, color and other attributes. Take a look at the below code.


const App = () => {
    return (
       <div><span>&#60;</span>

<h1>Hello React from localhost</h1>

<h2>Welcome to React, Best frontend Framework</h2><span>&#62;</span>
       </div>
    );
};

Enter fullscreen mode Exit fullscreen mode

console.log(App());

// {
//   $$typeof: Symbol(react.element)
//   &quot;type&quot;: &quot;h1&quot;,
//   &quot;key&quot;: null,
//   &quot;ref&quot;: null,
//   &quot;props&quot;: {
//     &quot;children&quot;: &quot;Hello React from localhost&quot;
//   },
//   &quot;_owner&quot;: null,
//   &quot;_store&quot;: {}
// }

Enter fullscreen mode Exit fullscreen mode

In the above code, type denotes the type of actual HTML element while Props represents the HTML attributes, and inner HTML content that will be passed to the HTML element. To learn more about Props and states, check out our complete guide on React fundamentals: Props and State.

From the above example, you might have noticed that no props are passed to the HTML element. Since React treats children as a pseudo attribute, inner HTML falls under children as well because it represents everything that is rendered between the HTML tags.


const App = () => {
  return<h1 classname="danger">Hello React from localhost</h1>;
};

console.log(App());

// {
//   $$typeof: Symbol(react.element)
//   &quot;type&quot;: &quot;p&quot;,
//   &quot;key&quot;: null,
//   &quot;ref&quot;: null,
//   &quot;props&quot;: {
//     &quot;children&quot;: &quot;Hello React&quot;,
//     &quot;className&quot;: &quot;danger&quot;
//   },
//   &quot;_owner&quot;: null,
//   &quot;_store&quot;: {}
// }

Enter fullscreen mode Exit fullscreen mode

To put it simply here, all HTML attributes are considered as React props and inner content as a children property.


const App = () => {
    // return<h1 classname="danger">Hello React from localhost</h1>;
    return React.createElement(
        &#39;h1&#39;,
        { className: &#39;danger&#39; },
        &#39;Hello React from localhost&#39;
    );
};

Enter fullscreen mode Exit fullscreen mode

This

element internally calls this React.createElement under the hood. It takes element type, props, and children as its argument.

Read More: A step-by-step guide on using Redux Toolkit with React

How to call a React Function Component?

Consider the following example, which demonstrates the difference between the object returned when calling a "React component" and calling a "React component" as a React element.


const App = () => {
    return<h1>Hello React from localhost</h1>;
};

console.log(App());
// {
//   $$typeof: Symbol(react.element),
//   &quot;type&quot;: &quot;h1&quot;,
//   &quot;key&quot;: null,
//   &quot;ref&quot;: null,
//   &quot;props&quot;: {
//     &quot;children&quot;: &quot;Hello React from localhost&quot;
//   },
//   &quot;_owner&quot;: null,
//   &quot;_store&quot;: {}
// }

console.log(<app />);
// {
//   $$typeof: Symbol(react.element),
//   &quot;key&quot;: null,
//   &quot;ref&quot;: null,
//   &quot;props&quot;: {},
//   &quot;type&quot;: () => {&hellip;},
//   &quot;_owner&quot;: null,
//   &quot;_store&quot;: {}
// }

Enter fullscreen mode Exit fullscreen mode

When we call the React component as an element, we access the type() method in the object. The type() method includes all data regarding the component's implementation, such as (children, hooks, etc).

Using React functional component as a Type

Let’s understand what it means for a React component when the type is function rather than string and making a call to element.


const Counter = ({initialCount }) => {
    const [counts, setCounts] = React.useState(initialCount);

    return (
       <div>
           <button onclick="{()"> setCounts(counts + 1)}>plus</button>
           <button onclick="{()"> setCounts(counts - 1)}>minus</button>


<div>{counts}</div>
       </div>
    );
};

const App = () => {
    return (

<div>
            <counter initialcount="{42}" />
       </div>
    );
};

Enter fullscreen mode Exit fullscreen mode

Now, let’s call React functional component:

const App = () => {
    return<div>{Counter({ initialCount: 42 })}</div>;
};

Enter fullscreen mode Exit fullscreen mode

Searching for a reliable Angular development company? Contact us now.

Now, let’s see why we should not call React component and render it as an element. For that we will be using conditional rendering to render the child component that can be toggled with a button.


const App = () => {
    const [isVisibleChild, setVisibleChild] = React.useState(true);

    return (
       <div>
           <button onclick="{()"> setVisible(!isVisible)}>Switch</button>

            {isVisibleChild?Counter({ initialCount: 42 }) : null}
       </div>
    );
};

Enter fullscreen mode Exit fullscreen mode

Whenever we switch the visibility of the child component to invisible, will get an error that says, “Uncaught Error: Rendered fewer hooks than expected.”. It happens due to the existence of hooks in the child component (counter). It is conditionally rendered when it is false, and the unmounted hooks may be removed without returning any errors.

How to handle Errors while testing the React Hooks?

Unless the mounting component (App) in React is altered, it should not return any error nor crash anyway. But here the app crashes due to the number of hooks in the mounted component (App) being changed.

Why did this happen? Because the child component(counter) gets called as a function and React does not consider it as an instance of a React component.

Instead, it just places all the information in the hooks of the child component inside its parent’s component. Now when we switch the child component to invisible, the hooks are removed from the mounted component. This is due to conditional rendering in the App component, making the app crash.

How to fix this error? Simply by rendering this React component as a component instance. It will offer implementation information for the component within the component instance.


const App = () => {
    const [isVisibleChild, setVisibleChild] = React.useState(true);

    return (
       <div>
           <button onclick="{()"> setVisible(!isVisibleChild)}>Switch</button>

            {isVisibleChild ? <counter initialcount="{42}" /> : null}
       </div>
    );
};


Enter fullscreen mode Exit fullscreen mode

Conclusion

React.js is ideal for generating dynamic UIs and web apps quickly. In React, the terms - elements, instances, and components all have different functionalities. Despite their functional distinctions, they collaborate throughout app development.

In this article, we looked at the practical distinctions between React elements and components. We went over the ways to call a React Function Component and discovered that a React component may be defined once but used numerous times as a React element in JSX. Furthermore, we discussed utilizing React component with type as function and why we should not call React component and render it as an element.

Top comments (0)