You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Jon Gacnik dcdacca2ff 3.2.1 2 years ago
example component extend fix (#17) 2 years ago
.gitignore 3.0.0 (#11) 3 years ago
.npmrc 3.0.0 (#11) 3 years ago
.travis.yml 3.0.0 (#11) 3 years ago 3.0.0 (#11) 3 years ago
LICENSE 3.0.0 (#11) 3 years ago updating to choo 6.13.1 2 years ago
component.js component extend fix (#17) 2 years ago
h.js 2.0.0 4 years ago
html.js 3.0.0 (#11) 3 years ago
index.js updating to choo 6.13.1 2 years ago
package.json 3.2.1 2 years ago
test.js 2.0.0 4 years ago


🚂🚋🚋🚋🚋🚋 + ⚛
Full on choo architecture on top of the tiny preact engine.
Currently up-to-date with choo 6.13.1

Ever wondered what would happen if preact and choo got a baby?

Welp, wonder no longer - here’s the answer. Full on choo architecture plus a couple preact goodies like h() and components. No JSX, only template strings via hyperx. But you can use JSX if you want to. We even get almost all of the React ecosystem through preact-compat 🎉🎉🎉🎉


var html = require('choop/html')
var devtools = require('choo-devtools')
var choop = require('choop')

var app = choop()
app.route('/', mainView)

function mainView (state, emit) {
  return html`
      <h1>count is ${state.count}</h1>
      <button onclick=${onclick}>Increment</button>

  function onclick () {
    emit('increment', 1)

function countStore (state, emitter) {
  state.count = 0
  emitter.on('increment', function (count) {
    state.count += count

See? Same same as choo!

Only difference is preact will append our app to the element passed into mount. So instead of our main view returning <body> we return <main> (or whatever we want the root to be).


You can create stateful components right out of the box with choop:

var Component = require('choop/component')
var html = require('choop/html')

class ClickMe extends Component {
  constructor () {
    this.state = { n: 0 }
    this.handleClick = () => {
      this.setState({ n: this.state.n + 1 })
  render (props, state) {
    return html`
        <h1>clicked ${state.n} times</h1>
        <button onClick=${this.handleClick}>click me!</button>

And then render them in your views using h():

var html = require('choop/html')
var h = require('choop/h')

var ClickMe = require('./ClickMe')

function view (state, emit) {
  return html`

Optionally pass data a.k.a. props:

h(MyComponent, { someData: 'beep' })

You can use props or an additional constructor function to pass emit into your components.


choo version 6.11.0 introduced a state.cache helper for managing nanocomponent instances. This is not included in choop since component instance management is taken care of by preact.

More Examples


Should I use this?

Sometimes you gotta use react, and the best thing to do in that case might be to jump on the preact train, grab a bag of architecture and go to town. This might not be for me, but perhaps it’s useful for you. Here you go! 🎁

What’s the real difference here?

nanomorph is replaced by preact

How do I run react widgets in choop?

Like this:

npm i -S preact preact-compat
npm i -S preact-compat/react preact-compat/react-dom

What’s the size?

Something like 8.7 kB

What about choo?

Yeah, what about me? (drumroll)


$ npm install choop