Unlocking Communication in React: A Journey into the Power of Signals

Marian Babić
comsystoreply
Published in
3 min readDec 1, 2023
React state management

Introduction

In the ever-evolving world of web development, React has become a go-to library for building dynamic user interfaces. With its declarative syntax and efficient rendering, React has gained widespread adoption. However, as developers, we always seek ways to enhance our applications and explore alternative solutions. One intriguing avenue is delving into the world of Signals.

Understanding Signals

What are Signals?

Signals, also known as events or messages, serve as a universal means of communication between various parts of a software system. Unlike direct method calls or tight coupling, signals provide a flexible and decoupled way for components to notify, listen, and respond to events.

How Signals Work

In a general sense, signals operate on a publish-subscribe model. A component (the publisher) emits a signal when a particular event occurs, and other components (subscribers) can listen for and react to that signal without needing direct knowledge of each other.

Use Cases for Signals

  1. User Interface Interactions: Signals are commonly used in graphical user interfaces to handle user interactions such as button clicks, mouse movements, or keyboard inputs.
  2. Cross-Component Communication: Signals facilitate communication between different components or modules, allowing them to coordinate actions without tight coupling.
  3. System-Level Events: In larger software systems, signals can be employed to handle system-level events, such as data updates, network activity, or error notifications.

Understanding Signals in React

Signals provide a powerful mechanism for communication between components in a React application. Rather than relying solely on traditional state management, Signals in React introduces a more event-driven approach. Components can emit signals, and other components can listen for these signals, allowing for a more loosely coupled and responsive architecture.

Key Benefits of Signals in React

  1. Decoupling Components: Signals facilitate communication between components without creating direct dependencies, promoting a more modular and maintainable codebase.
  2. Event-Driven Architecture: By embracing an event-driven architecture, Signals enable a flexible and scalable design. Components respond to signals based on their specific concerns, leading to a more responsive and intuitive user interface.
  3. Simplified State Management: While React has a robust state management system, Signals offer an alternative that might be more suitable for certain scenarios. Signals can be employed to manage specific aspects of the application state without the need for a centralised state management solution.

Signals in Action

The most effective approach to learning is through practical examples. Here’s a straightforward signal implementation for managing todos. The todos will be stored in local storage, and the initial value of the signal is established by retrieving data from local storage.

const LOCAL_STORAGE_KEY = "todos";

export const getTodosFromLocalStorage = () => {
const todos = localStorage.getItem(LOCAL_STORAGE_KEY);
return todos ? JSON.parse(todos) : [];
};

export const todosSignal = signal(getTodosFromLocalStorage());

Whenever the signal’s value changes, an effect will be triggered to save the updated data back into local storage.

export const setTodosToLocalStorage = (todos) => {
localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(todos));
};

effect(() => {
setTodosToLocalStorage(todosSignal.value);
});

Additionally, there is a computed function that dynamically revalidates a variable whenever any signal within the function changes, as is the case with the todos signal.

export const completedTodoCount = computed(
() => todosSignal.value.filter((todo) => todo.isDone).length,
);

This function is activated when adding a new todo to our list. By directly modifying the value, signals take care of the rest.

const onAddTodo = () => {
const todo = {
id: uuidV4(),
text,
isDone: false,
};
todosSignal.value = [todo, ...todosSignal.value];
setText("");
};

Example can be found in GitHub repo.

Conclusion: The Power of Signals in React

Signals provide a versatile toolset for handling various scenarios in a React application. Whether it’s broadcasting changes, triggering animations, or orchestrating complex workflows, signals offer a clean and efficient way to manage communication between different parts of your application.

Incorporating Signals into your development workflow encourages a more modular and scalable application architecture. It allows components to communicate in a decoupled manner, making your codebase easier to understand, maintain, and extend as your project evolves.

As you explore the potential of Signals in your projects, consider the specific needs and constraints of your application. Experiment with different signal patterns, and leverage the power of signals to create more dynamic and responsive user interfaces.

This blogpost is published by Comsysto Reply GmbH

--

--

Marian Babić
comsystoreply

Software engineer on a mission to turn code into solutions. By day, I'm crafting clean and efficient code. By night, I'm exploring the latest tech trends.