Sunday, January 19, 2025

Blazor .NET State Management Tips and Tricks

Blazor .NET Tips and Tricks for State Management

Blazor provides a robust framework for building modern web applications. Effective state management is essential to ensure the app remains efficient, scalable, and user-friendly. Here's a guide to managing state at the application, user, and component levels in Blazor:

1. Application-Level State Management

Application-level state refers to data shared across the entire app, such as configuration settings or global variables.

Techniques:

  • Singleton Services: Use Dependency Injection (DI) to register a singleton service that stores application-wide state.

Example:

// Define the application state service
public class AppState
{
    public string GlobalSetting { get; set; } = "Default Value";
}

// Register in Program.cs
builder.Services.AddSingleton<AppState>();

// Inject into a component
@inject AppState AppState

Application-Level State

Global Setting: @AppState.GlobalSetting

@code { private void ChangeSetting() { AppState.GlobalSetting = "Updated Value"; } }

2. User-Level State Management

User-level state is specific to a logged-in user and often includes profile data, session information, or preferences.

Techniques:

  • Scoped Services: Use scoped DI services to store user-specific data for the duration of their session.
  • Session Storage or Local Storage: Leverage browser storage for maintaining state across page reloads.

Example: Using Scoped Services

// Define user state service
public class UserState
{
    public string UserName { get; set; }
    public bool IsLoggedIn { get; set; }
}

// Register in Program.cs
builder.Services.AddScoped<UserState>();

// Inject into a component
@inject UserState UserState

User-Level State

User Name: @UserState.UserName

Logged In: @UserState.IsLoggedIn

@code { private void Login() { UserState.UserName = "JohnDoe"; UserState.IsLoggedIn = true; } }

Example: Using Local Storage

// Install package
// dotnet add package Blazored.LocalStorage

// Inject Blazored LocalStorage
@inject Blazored.LocalStorage.ILocalStorageService LocalStorage

User Preferences

Preferred Theme: @PreferredTheme

@code { private string PreferredTheme; protected override async Task OnInitializedAsync() { PreferredTheme = await LocalStorage.GetItemAsync<string>("theme") ?? "Light"; } private async Task SetTheme() { PreferredTheme = "Dark"; await LocalStorage.SetItemAsync("theme", PreferredTheme); } }

3. Component-Level State Management

Component-level state refers to data managed within an individual Blazor component.

Techniques:

  • Component Parameters: Pass data between parent and child components.
  • State HasChanged: Manually trigger UI updates when the state changes.

Example: Using Component Parameters

// Parent Component


// Child Component
@code {
    [Parameter]
    public string Message { get; set; }
}

Child Component

Message: @Message

Example: Using State HasChanged

@code {
    private int Counter = 0;

    private void Increment()
    {
        Counter++;
        StateHasChanged(); // Forces UI update
    }
}

Component-Level State

Counter: @Counter

Conclusion

State management in Blazor requires balancing simplicity, scalability, and persistence. By leveraging application-level, user-level, and component-level strategies, you can build responsive, stateful applications that enhance the user experience. Choose the right approach based on your application's complexity and requirements.

No comments :