Home

Awesome

<h1 align="center">component-box 📦</h1> <div align="center"> <a href="https://nodejs.org/api/documentation.html#documentation_stability_index"> <img src="https://img.shields.io/badge/stability-experimental-orange.svg?style=flat-square" alt="Stability" /> </a> <a href="https://www.npmjs.com/package/component-box"> <img src="https://img.shields.io/npm/v/component-box.svg?style=flat-square" alt="NPM version" /> </a> <a href="https://travis-ci.org/jongacnik/component-box"> <img src="https://img.shields.io/travis/jongacnik/component-box/master.svg?style=flat-square" alt="Build Status" /> </a> </div> <br />

A little component cacher for things like nanocomponent

Usage

var Nanocomponent = require('nanocomponent')
var html = require('bel')
var c = require('component-box')

// component
class MyComponent extends Nanocomponent {
  createElement (text) {
    return html`<div>${text}</div>`
  }
}

// function which returns component instance
function createMyComponent () {
  return new MyComponent()
}

c.use({
  mycomponent: createMyComponent
})

// return and render new `mycomponent`
c('mycomponent').render()

Meanwhile in another file...

var c = require('component-box')

// return and render cached `mycomponent`
c('mycomponent').render()

API

component = c(name, key)

Return a component. key is optional. Works as follows:

// return new `mycomponent` and cache as `mycomponent`
c('mycomponent')

// return cached `mycomponent`
c('mycomponent')

// return new `mycomponent` and cache as `boop`
c('mycomponent', 'boop')

// return cached `mycomponent` with key `boop`
c('mycomponent', 'boop')

// always return new `mycomponent` (never cache)
c('mycomponent', false)

c.use([components])

Add components to the store. Object values expect Functions which return a component.

var c = require('component-box')

c.use({
  beep: beepComponent,
  boop: boopComponent
})

c('beep').render()
c('boop').render()

These are shared throughout your app, so in another file you don't need to re-.use:

var c = require('component-box')

c('beep').render()
c('boop').render()

c.delete(key)

Remove component from the cache

// return new `mycomponent` and cache as `mycomponent`
c('mycomponent')

// remove `mycomponent` from cache
c.delete('mycomponent')

// return new `mycomponent` and cache as `mycomponent`
c('mycomponent')

c.cache(cache)

Use a custom cache implementation. Expects an object with .get, .set, and .remove methods.

var c = require('component-box')

c.cache(require('lru')(2)) // only cache 2 instances, using lru eviction

c.use({
  post: postComponent
})

c('post', 'slug1').render()
c('post', 'slug2').render()
c('post', 'slug3').render() // evict 'post-slug1' and return new 'post-slug3' instance

Alternative Pattern

You could also choose to only return the .render method from nanocomponent, allowing for a slightly more concise syntax:

// function which creates component instance and returns render method
function createMyComponent () {
  var component = new MyComponent()
  return function () {
    return component.render(...arguments)
  }
}
// directly calls nanocomponent .render
c('mycomponent')()

Real World

This module is useful when you are creating components on the fly. References to components are saved for you based on keys, that way on app re-renders it will re-use your components so things like load and etc are not wonky.

In this example we are using post slugs as component keys:

var html = require('bel')
var c = require('component-box')

c.use({
  post: require('my-post-component')
})

var postsData = [
  { title: 'Beep', slug: 'beep' },
  { title: 'Boop', slug: 'boop' },
  { title: 'Blap', slug: 'blap' }
]

function view () {
  var posts = postsData.map(function (post) {
    return c('post', post.slug).render(post)
  })

  return html`<div>${posts}</div>`
}

More Examples

fun-component

var component = require('fun-component')
var html = require('bel')
var c = require('component-box')

// function which returns a component
function mycomponent () {
  return component(function (props) {
    return html`<div>Hello!<div>`
  })
}

c.use({
  mycomponent: mycomponent
})

// return new `mycomponent`
c('mycomponent')()

See Also

License

MIT