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}'}" />

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.