Giter VIP home page Giter VIP logo

fluxor.selectors's Introduction

Fluxor.Selectors

A PoC for memoized selectors for Fluxor. They work similar as selectors in ngrx/store and Redux.

I am quoting the ngrx/store documentation for the benefits:

Selectors are pure functions used for obtaining slices of store state. Fluxor.Selectors provide a few helper functions for optimizing this selection. Selectors provide many features when selecting slices of state:

  • Portability
  • Memoization
  • Composition
  • Testability
  • Type Safety

When using the SelectorFactory.CreateSelector and SelectorFactory.CreateFeatureSelector functions Fluxor.Selectors keep track of the latest arguments in which your selector function was invoked. Because selectors are pure functions, the last result can be returned when the arguments match without reinvoking your selector function. This can provide performance benefits, particularly with selectors that perform expensive computation. This practice is known as memoization.

Create Selectors

The easiest way to create selectors is to use the factory functions:

var selectCounterState = SelectorFactory.CreateFeatureSelector<CounterState>();
var selectCount = SelectorFactory.CreateSelector(selectCounterState, state => state.Count);

Selecting Values

There are two ways to use selectors. But before the selectors can be used, we need access to the IStore. Usually we get it via dependency injection.

  1. To return the selector result immediately, call the Select extension method.
// get via dependency injection
IStore store;

var count = store.Select(selectCount);
  1. Create a subscription that notifies when the selected value changes. A SelectorSubscription implements IState<T> (which implements IStateChangedNotifier) and INotifyPropertyChanged.
// get via dependency injection
IStore store;

var countSubscription = store.SubscribeSelector(selectCount);

Then the subscription can be used in a Razor component

<p role="status">Count: @countSubscription.Value</p>

or bind it in .NET MAUI or WPF

<Label Text="{Binding countSubscription.Value, StringFormat='Count: {0}'}" />

fluxor.selectors's People

Contributors

berhir avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

Forkers

kt215

fluxor.selectors's Issues

Setting Feature Name causes exception in SelectorFactory

Thank you for making this repository available, nice work!

I found a minor bug. I cloned your repo, upgraded it to dotnet 7 and I'm using Fluxor 5.7.0. I'm running the BlazorDemo project.

When I set a custom feature name like this:

[FeatureState(Name = "ExampleName")]
public record Counter1State
{
    public int Count { get; init; } = 0;
}

I see this exception when I view the Counter page:

System.Collections.Generic.KeyNotFoundException: The given key 'Fluxor.Selectors.Demo.Store.Counter1.Counter1State'
was not present in the dictionary.

However, this works:

[FeatureState(Name = "Fluxor.Selectors.Demo.Store.Counter1.Counter1State")]

I want to use custom feature names so it shows up better in the ReduxDev tool.

Same issue if I use a Feature<T> descendant class:

public record Counter1State
{
    public int Count { get; init; } = 0;
}

public class Counter1InitialState : Feature<Counter1State>
{
    public override string GetName() => "ExampleName";

    protected override Counter1State GetInitialState()
    {
        return new Counter1State { Count = 0 };
    }
}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.