Swiftorial Logo
Home
Swift Lessons
Matchups
CodeSnaps
Tutorials
Career
Resources

Advanced Redux Patterns

1. Introduction

Redux is a predictable state container for JavaScript apps. It is often used with React to manage the state of applications. Advanced Redux patterns help in organizing and maintaining complex state management logic.

2. Middleware

Middleware provides a way to enhance Redux with custom functionality. Common use cases include logging, crash reporting, and handling asynchronous actions.

const logger = store => next => action => {
                console.log('dispatching', action);
                return next(action);
            };
Middleware is applied in the order they are defined. Be cautious of the order of execution as it can affect the behavior of your application.

3. Selectors

Selectors are pure functions that take the state and return some data. They can be used to encapsulate complex logic and memoize results for performance optimization.

import { createSelector } from 'reselect';

            const selectItems = state => state.items;
            const selectVisibleItems = createSelector(
              [selectItems],
              items => items.filter(item => item.visible)
            );

4. Ducks Pattern

The Ducks pattern is a way to bundle Redux logic in a single file, combining actions, reducers, and selectors. This helps in organizing code better.

// ducks/todos.js
            const ADD_TODO = 'ADD_TODO';

            export const addTodo = (todo) => ({
                type: ADD_TODO,
                payload: todo
            });

            const initialState = [];

            const todosReducer = (state = initialState, action) => {
                switch (action.type) {
                    case ADD_TODO:
                        return [...state, action.payload];
                    default:
                        return state;
                }
            };

            export default todosReducer;

5. Normalization

Normalizing state shape is essential for avoiding deeply nested structures that complicate updates and retrieval. Using libraries like normalizr can help in managing denormalized data.

import { normalize, schema } from 'normalizr';

            const user = new schema.Entity('users');
            const post = new schema.Entity('posts', { author: user });

            const data = {
                id: 1,
                author: { id: 1, name: 'Paul' },
                title: 'My Post',
                comments: []
            };

            const normalizedData = normalize(data, post);

6. FAQ

What is Redux Thunk?

Redux Thunk is a middleware that allows you to write action creators that return a function instead of an action. This function can perform asynchronous dispatches.

How do I handle side effects in Redux?

Side effects can be managed using middleware like Redux Saga or Redux Thunk, allowing you to coordinate asynchronous actions.

What are the performance implications of using selectors?

Selectors can improve performance by memoizing results and preventing unnecessary re-renders as they return the same output for the same input state.