npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

reactive-x-component

v0.2.4

Published

React Reactive X Component using RxJS as State Management

Downloads

23

Readme

Reactive X Component

Creates a React Component that uses RxJS as State management.

Install

yarn add reactive-x-component
npm i --save reactive-x-component

Demo in Stackblitz

Example Project - Snap Game

Usage

import { ReactiveXComponent } from 'reactive-x-component';

// simple wrap your ComponentType using the function and it will start accepting Observables
export default ReactiveXComponent()(Test);

Examples

Test.tsx

import React, { Component } from 'react';
import { Subject, interval } from 'rxjs';
import { startWith } from 'rxjs/operators';
import { ReactiveXComponent } from 'reactive-x-component';

interface Props {
  counter : number;
  counter2 : number | string;
  message : string;
}

interface Event {
  value : string;
}

class Test extends Component<Props> {
  public readonly events$ = new Subject<Event>();
  
  render() {
    const { counter, counter2, message } = this.props;

    this.events$.next({
      value: 'Received new event: RENDERED'
    });

    return (<div style={{ fontSize: '18px'}}>
      <table>
      <tbody>
        <tr><td>Message:</td><td>{ message }</td></tr>
        <tr><td>Prop Counter:</td><td>{ counter }</td></tr>
        <tr><td>Static Counter:</td><td>{ counter2 }</td></tr>
      </tbody>
      </table>
    </div>);
  }
}

const staticProps = {
  counter2: interval(5000).pipe(startWith('Loading...')),
};

export default ReactiveXComponent(staticProps)(Test);

Example.tsx

import React from 'react';
import Test from './Test';
import { interval } from 'rxjs';
import { startWith } from 'rxjs/operators';
import FunctionComponent from './FunctionComponent';

const seconds$ = interval(1000).pipe(startWith(0));

export default () => (<div>
  <Test counter={seconds$} // insert observable into property to be flattened
        message="This can be either an Observable<string> or string"  // can instert Observable<T> | T where T is the type.
        // no need to have `counter2` as a prop as it is supplied in the staticProps in the previous file.
        events$={event => console.log(event.value)} // Pass a function to be subscribed on the public property `events$`
        />
  <FunctionComponent />
</div>);

API

ReactiveXComponent

ReactiveXComponent(staticProps, defaultValues)(componentType, options)

| Attribute | Default | Description | | ---------------| -------------|---------------------------------------------------------------------------------- | | staticProps | {} | An object with values of Observables<any> which will be passed into the components props | | defaultValues| undefined | A Partial<StaticProps> which is the initial state value for these observables | | componentType| Required | A ComponentType<any>. Can be either a FunctionComponent or ComponentClass | | options | undefined | Used for debugging purposes only at this stage. You can specify a name to prefix the debug log |

Returns a component with props as Observable<T> | T and also optional Subscriber<T> for public observable attributes.


FAQ

How does it work?

This ReactiveXComponent does two things:

  • Flattens each Observable prop and passes their values to the child component. (Only if the prop is an Observable)
<Test counter={interval(1000)} /> // Flattens the interval into its value and passes it directly to the component.
  • Passes functions or Subscribers from props into the child component public Observable property (if it exists).
public readonly eventEmitter$ = new Subject<Event>(); // passes them into something like this

When does it subscribe?

Each Observable is subscribed to on componentDidMount or when it is passed in as a prop.

When does it unsubscribe?

All observables are unsubscribed on componentWillUnmount or when the value changes.