How to Upgrade Your React Skills with Three Helpful Tools

Author Photo

Stefan Gogov

· 10 min read
Thumbnail

Since its announcement in 2013, React.js continues to be one of the most widely used JavaScript tools, thanks to its unmatched versatility and efficiency.

Backed by its component-based architecture and virtual DOM implementation, React.js excels in building modern and dynamic web applications. It enables developers to create reusable UI elements, which boosts productivity.

Due to its extensive tooling and robust ecosystem, React.js remains the library of choice for countless developers, powering numerous websites and applications.

But the rapidly evolving React ecosystem can present challenges to developers, particularly those who are new to it. This article will provide insights and information on powerful tools within the React ecosystem. Its purpose is to help you enhance your skills and stay ahead in the world of React development.

By staying informed about the latest tools, you can navigate the React ecosystem more effectively and improve your development process.

Recoil.js for State Management

What is Recoil.js?

Recoil.js is an open-source state management library developed by Facebook. It offers distinct advantages over other state management libraries like Redux, MobX, Zustand, and others.

The primary advantages of Recoil are its simplicity, flexibility, debugging support, and compatibility with existing projects. These features and more make Recoil a top choice for managing state in React applications.

Key Features of Recoil.js

Recoil has two Key features that contribute to its effectiveness in state management.

Atoms

An Atom in Recoil.js is a shareable piece of state that React components can read from and write to. Subscribed components can access and modify the Atom’s value (data).

The code block below shows an example of Atom definition:

import React from "react"; // Importing the React library

import { atom } from "recoil"; // Importing the 'atom' function from the Recoil library

// Define the Atom
const counter = atom({
  // Defining an Atom called 'counter'
  key: "count", // Unique identifier for the Atom
  default: 0, // Initial value of the Atom is set to 0
});

export default counter; // Exporting the 'counter' Atom as the default export of the module

The code above shows how you can use Recoil. It defines an Atom called counter using the atom function provided by Recoil. The Atom has its unique identifier set to ‘count’ and default value set to 0. The Atom is then exported, making it accessible for other components to use and manage state.

After defining an Atom, it can be shared and used in other React Components:

import React from "react"; // Importing the React library

import { useRecoilValue } from "recoil"; // Importing the 'useRecoilValue' hook from the Recoil library

import { counter } from "./atom"; // Importing the 'counter' Atom from the './atom' file

function CounterComponent() {
  // Declaring a functional component named 'CounterComponent'
  const count = useRecoilValue(countAtom); // Using the 'useRecoilValue' hook to get the current value of the 'countAtom' Atom

  return (
    <div>
      <h1>Count: {count}</h1>{" "}
      {/* Displaying the value of 'count' in the component's UI */}
    </div>
  );
}

The code block above demonstrates the usage of a Recoil Atom in the CounterComponent. It imports the useRecoilValue hook from the Recoil library and the counter Atom. The CounterComponent uses the useRecoilValue hook to retrieve the current value of the counter Atom. It then displays the value of ‘count’ in the component’s h1 element.

Selectors

Recoil.js also incorporates selectors, which enable developers to transform or mutate states synchronously or asynchronously based on the existing state data.

Selectors in Recoil provide a powerful mechanism to manipulate state and facilitate advanced data transformations within a Recoil-based application.

One use case where Recoil selectors shine is in applications that require constant updates, for example a shopping cart application.

Let’s say we have a Recoil atom called cartItems that stores an array of items added to the shopping cart. Each item in the cart has properties like id, price, and quantity.

We can define a Recoil selector called totalPriceSelector that calculates the total price of all the items in the cart based on their quantities and prices. Here’s an example:

import { selector, useRecoilValue } from "recoil"; // Importing the 'selector' and 'useRecoilValue' from Recoil library

import { cartItems } from "./atom"; // Importing the 'cartItems' Atom from the './atom' file

const totalPriceSelector = selector({
  // Defining a selector called 'totalPriceSelector'
  key: "totalPrice", // Unique identifier for the selector
  get: ({ get }) => {
    // 'get' function that calculates the total price based on the cart items
    const items = get(cartItems); // Getting the value of the 'cartItems' Atom
    let total = 0; // Initializing the total price

    items.forEach((item) => {
      // Iterating over the items in the cart
      total += item.price * item.quantity; // Calculating the total price based on item prices and quantities
    });

    return total; // Returning the calculated total price
  },
});

function ShoppingCart() {
  // Declaring a functional component named 'ShoppingCart'
  const totalPrice = useRecoilValue(totalPriceSelector); // Using the 'useRecoilValue' hook to get the value of 'totalPriceSelector'

  return (
    <div>
      <h2>Shopping Cart</h2>
      <p>Total Price: ${totalPrice}</p> // Displaying the total price in the component's
      UI
    </div>
  );
}

In the example above, by using Recoil selectors, we can easily derive and update the total price based on the current state of the cart items. This allows for a reactive and efficient approach to managing complex state transformations in the shopping cart application.

SWR (Stale-While-Revalidate) for Data Fetching

What is SWR?

SWR is a React tool that uses a powerful data fetching technique called Stale-While-Revalidate. It serves cached (stale) data to the user while simultaneously initiating a request to refresh or revalidate the data.

Over time there have been debates among developers about the most effective approach to data retrieval and how to eliminate the wait time needed to load data. By leveraging SWR in React, you can optimize performance, minimize network requests, and provide users with a seamless experience by displaying immediate data while updating it in the background.

Due to its simplicity and flexibility, SWR has become a popular choice for handling complex data fetching in React.

Key Components of SWR

  • Stale While Revalidate Strategy: SWR serves cached data to the user while simultaneously initiating requests to revalidate the data in the background. This reduces page loading time
  • Automatic Caching: SWR includes a built-in caching mechanism that automatically stores and retrieves fetched data. This allows subsequent requests for the same data to be served from cache.
  • Automatic Revalidation: SWR automatically revalidates stale data based on certain conditions set by the developer – for example, when a component is brought to focus, on mount, and so on.
  • useSWR Hook: This hook is the primary interface to use SWR in React. It takes in a config parameter and returns an object with data, error, and isValidating keys.
  • Dependency Tracking: SWR tracks the dependencies of data fetching functions and it automatically revalidates data when the dependent variables changes

How to Implement SWR in React Apps

Below is an example of SWR implementation in a simple React Component that fetches and loads data on a page:

import React from "react"; // Importing React library

import useSWR from "swr"; // Importing the useSWR hook from the SWR library

const fetchData = async (url) => {
  const response = await fetch(url); // Making an HTTP request to the provided URL
  const data = await response.json(); // Parsing the response data as JSON
  return data; // Returning the fetched data
};

function MyComponent() {
  const { data, error, isValidating } = useSWR(
    "https://api.example.com/data",
    fetchData,
    {
      refreshInterval: 3000, // Refresh data every 3 seconds
      revalidateOnFocus: True, // enable revalidation when the component regains focus
    }
  );

  if (error) {
    return <p>Error occurred: {error.message}</p>; // Displaying an error message if an error occurred during data fetching
  }

  if (!data) {
    return <p>Loading...</p>; // Displaying a loading indicator while data is being fetched
  }

  return (
    <div>
      <h1>Data: {data}</h1> // Displaying the fetched data
    </div>
  );
}

export default MyComponent; // Exporting the MyComponent function as the default export

The code block above illustrates the usage of the useSWR hook from the SWR library in a React Component. It imports the necessary dependencies and defines a function called fetchData to fetch data from a provided URL.

Inside the MyComponent function, the useSWR hook is used to fetch data. The hook takes some config parameters and provides three variables: data, error, and isValidating.

If an error occurs during the data fetching process, an error message is displayed. While the data is being fetched, a loading indicator is shown. Once the data is successfully fetched, it is displayed in an <h1> element.

Formik for Integrating Modern Forms and Form Functionalities

What is Formik?

Responsive forms have become an integral part of modern software development, especially because of the need to collect user data and record interactions.

For React apps, Formik is a popular form management library that simplifies the process of building and managing responsive forms.

Formik is highly customizable. One of its primary strengths is the Field array feature, which lets you add and remove form fields dynamically based on user inputs.

Formik’s simplicity, state management feature, data validation capabilities, better integration with the React ecosystem, and smaller file size are some of the reasons why many developers prefer using it over Redux Form.

Key Components of Formik

  • Built-in form state management: Formik ships with a built-in form state management feature that eliminates the need for other state management libraries.
  • Data Validation and Error handling: Formik offers easy-to-integrate data validation and error handling features, thus simplifying the process of responsive form making.
  • Field array: FieldArray is a Formik component that is used to manage an array of form fields. It gives you functionality that allows dynamic manipulation of form fields (that is, dynamic addition or removal of fields).
  • Fast Field: Fastfield is a Formik component that prevents unnecessary re-renders for form fields that have not changed. This optimization can largely improve the performance of large forms with many fields.

How to Implement Formik in React Apps

Below is a simple implementation of Formik in a basic React from component:

import React from "react";
import { Formik, Field, ErrorMessage, Form, resetForm } from "formik";

function MyForm() {
  // Initial form values
  const initialValues = {
    name: "",
    email: "",
  };

  // Form validation function
  const validateForm = (values) => {
    const errors = {};

    // Check if name field is empty
    if (!values.name) {
      errors.name = "Name is required";
    }

    // Check if email field is empty or invalid
    if (!values.email) {
      errors.email = "Email is required";
    } else if (!/\S+@\S+\.\S+/.test(values.email)) {
      errors.email = "Invalid email format";
    }

    return errors;
  };

  // Form submission handler
  const handleSubmit = (values, { resetForm }) => {
    // Perform form submission logic, e.g API call
    console.log(values);

    // Reset the form after successful submission
    resetForm();
  };

  return (
    <div>
      <h1>My Form</h1>
      <Formik
        initialValues={initialValues}
        validate={validateForm}
        onSubmit={handleSubmit}>
        <Form>
          <div>
            <label htmlFor="name">Name:</label>
            <Field type="text" id="name" name="name" />
            <ErrorMessage name="name" component="div" />
          </div>

          <div>
            <label htmlFor="email">Email:</label>
            <Field type="email" id="email" name="email" />
            <ErrorMessage name="email" component="div" />
          </div>

          <button type="submit">Submit</button>
        </Form>
      </Formik>
    </div>
  );
}

export default MyForm;

The code block above demonstrates the implementation of a responsive form using the Formik library.

The MyForm component defines the initial form values and implements form validation logic using a validateForm function. The form submission is handled by the handleSubmit function.

The form is rendered in the JSX code using the Formik component, and form fields are defined using the Field component.

Error messages are displayed using the ErrorMessage component provided by Formik.

Upon submission, the form values are logged to the console, and the form is reset using the resetForm function.

Conclusion

This article explored three powerful React.js tools: Recoil for state management, SWR for data fetching, and Formik for reactive forms.

By utilizing these tools, you can enhance your React.js skills and stay ahead in the dynamic React ecosystem. For more on these tools, you can check out the Recoil.js Docs, SWR Docs, and Formik Docs .

That’s all for now folks. Keep coding, keep learning, and embrace the Code-Eat-Sleep-Repeat mantra for continuous growth. Happy coding!

#react#tools#helpful#upgrade#skills
Author Photo

About Stefan Gogov

Stefan is a programming enthusiast from Bulgaria, residing in Asenovgrad, who has a true passion for solving complex problems and developing software solutions. Through his blog, he aims to share his experiences and offer helpful insights to others.