1.1.4 • Published 5 years ago

refstore v1.1.4

Weekly downloads
1
License
MIT
Repository
-
Last release
5 years ago

refstore

State management for Inferno. Tiny bundle, MobX-like API. Built-in optional router.

Usage

Load data in your service:

import { decorate, observable } from "refstore";
import { Post } from "../../domain/Post/Post";

export class PostService {
  async get(id = "") {
    const _ = encodeURIComponent;

    /** @type {{ [id: string]?: Post }?} */
    this.posts = {
      ...(this.posts || {}),
      [id]: await fetch(`/api/posts/${_(id)}`).then(x => x.json())
    };

    // Note: Only tracks reference. Don't mutate; replace.
  }
}

decorate(PostService, { posts: observable.ref });

Make your view an observer, and inject the service:

import { Component } from "inferno";
import { inject, observer } from "refstore";

/**
 * @typedef IProps
 * @property {{ params: { id: string } }} match
 * @property {LocaleService} localeService
 * @property {PostService} postService
 *
 * @extends Component<IProps>
 */
export class PostScreenView extends Component {
  componentDidMount() {
    this.props.postService.get(this.props.match.params.id);
  }

  render() {
    const { formatTime } = this.props.localeService;
    const { params } = this.props.match;
    const { posts } = this.props.postService;

    const post = (posts || {})[params.id] || new Post();

    return (
      <blockquote id={params.id}>
        <small>
          {post.name} {formatTime(post.createdAt)}
        </small>

        {post.text || "..."}
      </blockquote>
    );
  }
}

export const PostScreen = inject("localeService", "postService")(
  observer(PostScreenView)
);

Configure the routes:

import { Route, Switch } from "refstore";

export class App extends Component {
  static routes = [
    { component: HomeScreen, exact: true, path: "/" },
    { component: PostScreen, "/posts/:id" }
  ];

  render() {
    return (
      <Switch>
        {App.routes.map(route => (
          <Route {...route} />
        ))}
      </Switch>
    );
  }
}

See practical examples at https://github.com/makepost/serverside, import refstore everywhere it has MobX or React Router.

TypeScript definitions list components and other exports, which should be familiar if you have used the libraries mentioned above: BrowserRouter, History, Link, Location, Provider, Route, StaticRouter, Switch, autorun, decorate, inject, isObservableProp, matchPath, observable, observer, useStaticRendering, withRouter.

License

MIT

1.1.4

5 years ago

1.1.3

5 years ago

1.1.2

6 years ago

1.1.1

6 years ago

1.1.0

6 years ago

1.0.1

6 years ago