Blazor में State Management
service singletons, Fluxor या cascading AppState की सहायता से shared state प्रबंधित करें, ताकि सभी components में UI एकसमान रहे।
Blazor में State Management, CoddyKit पर C# अकादमी का एक निःशुल्क पाठ है। यह 4 में से 4वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह C# अकादमी सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। C# अकादमी पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
Blazor में स्थिति प्रबंधन की चुनौतियाँ
जैसे-जैसे Blazor ऐप बड़े होते जाते हैं, कई असंबंधित कंपोनेंट में साझा की जाने वाली स्थिति का प्रबंधन जटिल हो जाता है। सरल प्रॉप-ड्रिलिंग पर्याप्त नहीं रहती; आपको एक केंद्रीकृत, प्रतिक्रियाशील स्थिति स्टोर की आवश्यकता होती है।
स्कोप वाली सेवा से सरल स्थिति
Blazor में स्थिति प्रबंधन का सबसे सरल तरीका है: ऐसी स्कोप वाली सेवा जो स्थिति रखे और एक इवेंट उपलब्ध कराए, ताकि कंपोनेंट बदलावों की सदस्यता ले सकें।
public class CartState
{
private readonly List<CartItem> _items = new();
public IReadOnlyList<CartItem> Items => _items;
public int Count => _items.Sum(i => i.Quantity);
public event Action? OnChanged;
public void Add(Product p)
{
var existing = _items.FirstOrDefault(i => i.ProductId == p.Id);
if (existing is not null) existing.Quantity++;
else _items.Add(new CartItem { ProductId = p.Id, Name = p.Name, Price = p.Price });
OnChanged?.Invoke();
}
}स्थिति बदलावों की सदस्यता लेना
कंपोनेंट स्थिति सेवा के OnChanged इवेंट की सदस्यता लेते हैं और दोबारा रेंडर करने के लिए StateHasChanged कॉल करते हैं। Dispose में सदस्यता हटाना याद रखें।
@inject CartState Cart
@implements IDisposable
<p>Cart: @Cart.Count items</p>
@code {
protected override void OnInitialized()
{
Cart.OnChanged += OnCartChanged;
}
private void OnCartChanged()
{
InvokeAsync(StateHasChanged);
}
public void Dispose() =>
Cart.OnChanged -= OnCartChanged;
}स्थिति कंटेनर के रूप में CascadingValue
अपने रूट लेआउट को अपनी स्थिति सेवा वाले CascadingValue में लपेटें। सभी वंशज स्पष्ट रूप से प्रॉप पास किए बिना उस तक पहुँच सकते हैं।
@* MainLayout.razor *@
@inject CartState Cart
<CascadingValue Value="Cart">
@Body
</CascadingValue>
@* Any nested component: *@
@code {
[CascadingParameter]
public CartState Cart { get; set; } = default!;
private void Buy(Product p) => Cart.Add(p);
}Fluxor: Blazor के लिए Flux पैटर्न
Fluxor, Blazor में Redux-शैली का एकदिशीय डेटा प्रवाह लाता है: स्थिति → कंपोनेंट → कार्य → Reducer → स्थिति। जटिल ऐप के लिए यह बहुत उपयोगी है।
// dotnet add package Fluxor.Blazor.Web
// State record
[FeatureState]
public record CounterState(int Count = 0);
// Actions
public record IncrementAction(int Amount = 1);
// Reducers
public static class CounterReducers
{
[ReducerMethod]
public static CounterState Reduce(CounterState state, IncrementAction action)
=> state with { Count = state.Count + action.Amount };
}
// Registration:
builder.Services.AddFluxor(opt =>
opt.ScanAssemblies(typeof(Program).Assembly));कंपोनेंट में Fluxor का उपयोग
स्थिति पढ़ने के लिए IState<T> और कार्य भेजने के लिए IDispatcher इंजेक्ट करें। InheritsFrom<FluxorComponent> (या मिक्सिन) स्थिति बदलावों की सदस्यता अपने-आप ले लेता है।
@inherits FluxorComponent
@inject IState<CounterState> CounterState
@inject IDispatcher Dispatcher
<p>Count: @CounterState.Value.Count</p>
<button @onclick="Increment">+1</button>
<button @onclick="() => Dispatcher.Dispatch(new IncrementAction(5))">+5</button>
@code {
private void Increment()
=> Dispatcher.Dispatch(new IncrementAction(1));
}LocalStorage में स्थायी भंडारण
JavaScript इंटरऑप के माध्यम से ब्राउज़र के localStorage का उपयोग करके पेज रीफ़्रेश के बाद भी स्थिति सुरक्षित रखें। ऐप शुरू होने पर उसे पुनर्स्थापित करें।
@inject IJSRuntime JS
@code {
private async Task SaveStateAsync()
{
var json = JsonSerializer.Serialize(_state);
await JS.InvokeVoidAsync("localStorage.setItem", "appState", json);
}
protected override async Task OnInitializedAsync()
{
var json = await JS.InvokeAsync<string?>("localStorage.getItem", "appState");
if (json is not null)
_state = JsonSerializer.Deserialize<AppState>(json) ?? new();
}
private AppState _state = new();
}Blazored.LocalStorage पैकेज
Blazored.LocalStorage पैकेज, हाथ से JS इंटरऑप कॉल लिखे बिना ब्राउज़र के localStorage पर एक सरल, टाइप-सुरक्षित API उपलब्ध कराता है।
// dotnet add package Blazored.LocalStorage
builder.Services.AddBlazoredLocalStorage();
@inject ILocalStorageService LocalStorage
@code {
protected override async Task OnInitializedAsync()
{
_cart = await LocalStorage.GetItemAsync<List<CartItem>>("cart") ?? new();
}
private async Task SaveCartAsync()
{
await LocalStorage.SetItemAsync("cart", _cart);
}
private List<CartItem> _cart = new();
}NavigationManager के साथ URL स्थिति
ऐसी स्थिति रखने के लिए क्वेरी पैरामीटर का उपयोग करें जो पेज रीफ़्रेश के बाद भी बनी रहे और जिसे बुकमार्क किया जा सके। उन्हें NavigationManager और URI बिल्डर के माध्यम से पढ़ें और लिखें।
@inject NavigationManager Nav
@page "/products"
@code {
[SupplyParameterFromQuery] public string? Search { get; set; }
[SupplyParameterFromQuery] public int Page { get; set; } = 1;
private void UpdateSearch(string s)
{
Nav.NavigateTo(
Nav.GetUriWithQueryParameters(
new Dictionary<string, object?>
{
[nameof(Search)] = s,
[nameof(Page)] = 1
}));
}
}वास्तविक उदाहरण: खरीदारी कार्ट की स्थिति
एक पूर्ण पैटर्न: इवेंट वाली स्कोप सेवा CartState, जो बदलाव होने पर localStorage में सुरक्षित की जाती है और लोड होने पर पुनर्स्थापित की जाती है।
public class CartState
{
private readonly ILocalStorageService _storage;
private List<CartItem> _items = new();
public event Action? OnChanged;
public CartState(ILocalStorageService storage) => _storage = storage;
public async Task InitAsync()
{
_items = await _storage.GetItemAsync<List<CartItem>>("cart") ?? new();
}
public async Task AddAsync(Product p)
{
var item = _items.FirstOrDefault(i => i.ProductId == p.Id);
if (item is not null) item.Quantity++;
else _items.Add(new CartItem { ProductId = p.Id, Name = p.Name });
await _storage.SetItemAsync("cart", _items);
OnChanged?.Invoke();
}
}त्वरित जाँच
सीमित साझा स्थिति वाले सरल Blazor ऐप के लिए कौन-सा स्थिति प्रबंधन तरीका सबसे अच्छा है?
पुनरावलोकन: Blazor में स्थिति प्रबंधन
मुख्य बातें:
- स्कोप वाली सेवा + कार्य इवेंट: साझा स्थिति का सबसे सरल तरीका, अधिकांश ऐप के लिए अच्छा
- रूट को CascadingValue में लपेटने से प्रॉप-ड्रिलिंग के बिना पूरे ऐप में पहुँच मिलती है
- Fluxor: जटिल स्थिति तर्क के लिए Redux-शैली का एकदिशीय प्रवाह
- IJSRuntime या Blazored.LocalStorage के साथ स्थिति को localStorage में सुरक्षित रखें
- URL स्थिति (SupplyParameterFromQuery): बुकमार्क और साझा करने योग्य UI स्थिति के लिए
- मेमोरी लीक रोकने के लिए Dispose में इवेंट की सदस्यता हमेशा हटाएँ
एआई शिक्षक के साथ C# सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 93
- पाठ
- 346
अक्सर पूछे जाने वाले प्रश्न
क्या “Blazor में State Management” पाठ निःशुल्क है?
हाँ—“Blazor में State Management” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और C# अकादमी पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। C# अकादमी पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“Blazor में State Management” में मैं क्या सीखूँगा?
service singletons, Fluxor या cascading AppState की सहायता से shared state प्रबंधित करें, ताकि सभी components में UI एकसमान रहे। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ C# अकादमी का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या C# अकादमी शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर C# अकादमी शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 4वाँ पाठ है।
“Blazor में State Management” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस C# अकादमी पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर C# अकादमी पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- Blazor Component Model
- Data Binding और Event Handling
- Component Communication और DI
- Blazor में State Management