Why developer prefer ReactJs over vanilla JavaScript?

·

9 min read

In the ever-evolving landscape of web development, two names stand out prominently: JavaScript and React. While JavaScript serves as the backbone of dynamic web experiences, React has emerged as a powerful tool for building interactive user interfaces. But what exactly sets these two apart? Let's delve into the nuances and distinctions between JavaScript and React.

Firstly let me introduce you to what ReactJs is.

ReactJs (or simply React) is an open-source JavaScript library developed by Facebook for building user interfaces (UIs), particularly for single-page applications (SPAs) and complex web interfaces. It was first released in 2013 and has since gained widespread adoption in the web development community.

We were already having JavaScript then why do we need ReactJs?

This is the simple question arises when we talk about React. So the answer is very simple, React give more power. But power in what sense? Powers like Component Based Architecture, Declarative Syntax, Virtual DOM, State Management and many more (we will learn about them further in this blog).

Let us first understand the process how JavaScript functions.

JavaScript is a versatile programming language that is used for a wide range of tasks, including web development, server-side programming, mobile app development, and more. That is, it's not only limited to web development. On the other hand React is a JS library used for building UIs for websites. JavaScript provides core language syntax and features for defining variables, functions, control structures, data types, and more. It allows for imperative, functional, and object-oriented programming paradigms. Talking about its use in web dev only, JS can manipulate the Document Object Model (DOM) of a web page directly, allowing developers to dynamically update the content, structure, and behavior of the page in response to user actions and events. All these feature supports are because JS is primarily executed on the client side, meaning it runs in the user's web browser rather than on a server. This allows JS to interact with the web page's HTML and CSS, making it possible to manipulate the content and behavior of a web page dynamically. It supports asynchronous programming through features like callbacks, promises, and async/await syntax. This allows non-blocking execution of tasks such as fetching data from servers or performing animations.

Till now we have a little idea about how JavaScript works and how it helps to build a web page. But again, the same question arises, Why React? Now it's the time to introduce you to working of React.

The Power of ReactJs

Introduction to React

React is just a UI library (not an independent language if you think) based on JavaScript that enhances the way we use JavaScript.

  • Component-Based Architecture: React promotes a component-based architecture allowing developers to break down UIs into reusable and encapsulated components. This modular approach enhances code organization, reusability, and maintainability, especially in large and complex applications.

  • Virtual DOM and Efficient Rendering: React introduces the concept of a virtual DOM, which is a lightweight representation of the actual DOM. By leveraging the virtual DOM, React minimizes DOM manipulations and efficiently updates only the parts of the UI that have changed, resulting in improved performance and responsiveness.

  • Declarative Syntax with JSX: React uses JSX (JS XML), a syntax extension that allows developers to write HTML-like code directly within JavaScript. JSX enhances readability and expressiveness by combining markup with JavaScript logic, making it easier to create and visualize UI components.

  • State Management: React provides built-in mechanisms for managing component state, allowing components to maintain their own state and trigger UI updates when the state changes. This simplifies state management and ensures consistency across the application, especially in applications with complex data flows.

  • Rich and Powerful Ecosystem and Developer Tools: React has a vibrant ecosystem of tools, libraries, and extensions that complement its core functionality. This includes tools for routing, state management, styling, testing, and more. Additionally, React's developer tools (e.g., React DevTools) provide powerful debugging and inspection capabilities, enhancing developer productivity and efficiency.

  • Community Support and Learning Resources: React has a large and active community of developers, contributors, and enthusiasts who contribute to its growth and evolution. The abundance of tutorials, documentation, forums, and online resources makes it easier for developers to learn React and troubleshoot issues, fostering knowledge sharing and collaboration.

  • Cross-Platform Compatibility: React can be used to build not only web applications but also mobile applications (using React Native) and desktop applications (using frameworks like Electron). This cross-platform compatibility allows developers to leverage their React skills to target multiple platforms with a single codebase.

Oh all these things sounds so powerful and magnificent. But ever wonder how does React withholds so much power within it? That's not only React alone, it combined with a lot of libraries designed for React that makes it so powerful and handy to use. But who make these libraries? As I already told that React is Open-Source language with a huge and active community which contributes for the good of the language.

Now let's know about the libraries and tools that we can use with React that makes it easier to use.

  • React Hooks: React Hooks are a powerful feature introduced in React 16.8 that allows developers to use state and other React features in functional components without using class components. React Hooks provide a more concise and expressive way to manage component state, side effects, and lifecycle events, leading to cleaner and more maintainable code.

    Some of the React Hooks are:

    1. useState: useState is the most commonly used Hook, allowing functional components to manage local state. It takes an initial state value as an argument and returns an array containing the current state value and a function to update that state.

       import React, { useState } from 'react';
      
       function Counter() {
         const [count, setCount] = useState(0);
      
         return (
           <div>
             <p>You clicked {count} times</p>
             <button onClick={() => setCount(count + 1)}>Click me</button>
           </div>
         );
       }
      
    2. useEffect: useEffect allows functional components to perform side effects, such as data fetching, DOM manipulation, or subscribing to external events. It accepts a function as its first argument, which will be executed after every render. Optionally, it can take a second argument, an array of dependencies, to control when the effect runs.

       import React, { useState, useEffect } from 'react';
      
       function Example() {
         const [count, setCount] = useState(0);
      
         useEffect(() => {
           document.title = `You clicked ${count} times`;
         });
      
         return (
           <div>
             <p>Count: {count}</p>
             <button onClick={() => setCount(count + 1)}>Increment</button>
           </div>
         );
       }
      
    3. useContext: useContext is a Hook that allows functional components to consume context. It enables components to access context values without nesting multiple components.

       import React, { useContext } from 'react';
       import ThemeContext from './ThemeContext';
      
       function ThemedButton() {
         const theme = useContext(ThemeContext);
      
         return <button style={{ background: theme.background, color: theme.foreground }}>Themed Button</button>;
       }
      
    4. useReducer: useReducer is a Hook that is similar to useState, but more powerful and flexible. It is commonly used for managing complex state logic in functional components.

       import React, { useReducer } from 'react';
      
       function reducer(state, action) {
         switch (action.type) {
           case 'increment':
             return { count: state.count + 1 };
           case 'decrement':
             return { count: state.count - 1 };
           default:
             throw new Error();
         }
       }
      
       function Counter() {
         const [state, dispatch] = useReducer(reducer, { count: 0 });
      
         return (
           <div>
             <p>Count: {state.count}</p>
             <button onClick={() => dispatch({ type: 'increment' })}>Increment</button>
             <button onClick={() => dispatch({ type: 'decrement' })}>Decrement</button>
           </div>
         );
       }
      
    5. useRef: The useRef hook in React provides a way to create a mutable reference to a DOM element or any value that persists across renders without causing the component to re-render when the reference changes. It is useful for accessing DOM elements, managing focus, and storing mutable values within functional components.

       import React, { useRef, useEffect } from 'react';
      
       function MyComponent() {
         const inputRef = useRef(null);
      
         useEffect(() => {
           inputRef.current.focus(); // Focuses the input element when the component mounts
         }, []);
      
         return <input type="text" ref={inputRef} />;
       }
      
  • React Redux: Redux is a library that serves as a bridge between React and Redux. It provides a set of tools and conventions for managing application state in React applications, making it easier to maintain and scale large and complex applications. Some of the key feature that Redux provide are:

    1. State Management: It provides a single source of truth for the entire application state, making it easier to debug, test, and reason about application behavior. In other words it maintains the entire state of the application in a single JavaScript object called the "store." This centralization simplifies state management by providing a single source of truth for the entire application.

      It follows a strict pattern of state updates, where state mutations are made by dispatching actions. Actions are plain JavaScript objects that describe the type of change that occurred and any associated data. Reducers are pure functions that take the current state and an action as arguments and return the new state based on the action type. Read more about actions and reducers

    2. Provider Component: Redux provides the <Provider> component, which wraps the root component of the React application. It makes the Redux store available to all components in the component tree using React's context API, eliminating the need to pass down the store manually through props.

    3. State Mapping: Redux allows developers to map slices of the Redux state to props of React components using the mapStateToProps function. This enables components to access relevant parts of the state and re-render when the state changes.

    4. DevTools Integration: Redux integrates with Redux DevTools, a browser extension and development tool, for inspecting and debugging application state changes, action dispatches, and time-travel debugging. DevTools provide powerful debugging capabilities for Redux applications, improving developer productivity and efficiency.

  • React Router: It's a powerful and flexible solution for managing routing in React applications, allowing developers to create dynamic and navigable user interfaces with ease. Its declarative API, support for nested and dynamic routing, and integration with React features make it a popular choice for building single-page applications (SPAs) and multi-page applications (MPAs) in React.

  • React Axios: Axios is a popular library used for making HTTP requests to external APIs or servers. It simplifies the process of sending asynchronous HTTP requests and handling responses in a consistent and efficient manner.

  • React Formik: Formik simplifies the process of building and validating forms in React applications by providing a declarative and intuitive API. It handles form state management, validation, and submission, allowing you to focus on building great user experiences without the hassle of managing form state manually.

  • Particle Js: It is a versatile and easy-to-use library for creating stunning particle effects on web pages. It provides a wide range of configuration options and interactivity features, allowing you to customize the particle effect to suit your design needs.

In summary, JavaScript and React serve distinct yet complementary roles in web development, each offering unique advantages and functionalities.

JavaScript, as the foundational programming language of the web, provides the core functionality for creating interactive and dynamic web applications. It enables developers to manipulate the DOM, handle user interactions, make asynchronous requests, and perform various other tasks crucial for building modern web experiences.

On the other hand, React is a JavaScript library specifically designed for building user interfaces. It introduces a component-based architecture, allowing developers to create reusable and modular UI components. React simplifies the process of managing UI state, rendering data-driven views, and handling complex UI logic, making it an ideal choice for building large-scale and maintainable web applications.

Although React gives you more power and functionality but "There is no React without JavaScript". So, whether you're just starting out on your coding journey or looking to level up your skills, I encourage you to explore more and more of JS first and when you become tired of it, jump to React. Dive into tutorials, documentation, online courses, and real-world projects to deepen your understanding and practical experience with these powerful technologies. The more you learn and practice, the more confident and proficient you'll become in building innovative and impactful web applications.