rooch v3.0.0
Ever wondered what would happen if react
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 support almost all of the React ecosystem through preact-compat.
šššš
Why is this useful? Sometimes you gotta use react
, and the best thing to do in that case is 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! š
var html = require('rooch/html')
var devtools = require('choo-devtools')
var rooch = require('rooch')
var app = rooch()
app.use(devtools())
app.use(countStore)
app.route('/', mainView)
app.mount('body')
function mainView (state, emit) {
return html`
<main>
<h1>count is ${state.count}</h1>
<button onclick=${onclick}>Increment</button>
</main>
`
function onclick () {
emit('increment', 1)
}
}
function countStore (state, emitter) {
state.count = 0
emitter.on('increment', function (count) {
state.count += count
emitter.emit('render')
})
}
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).
Components
You can create stateful components right out of the box with rooch
:
var Component = require('rooch/component')
var html = require('rooch/html')
class ClickMe extends Component {
constructor () {
super()
this.state = { n: 0 }
this.handleClick = () => {
this.setState({ n: this.state.n + 1 })
}
}
render (props, state) {
return html`
<div>
<h1>clicked ${state.n} times</h1>
<button onClick=${this.handleClick}>click me!</button>
</div>
`
}
}
And then render them in your views using h()
:
var html = require('rooch/html')
var h = require('rooch/h')
var ClickMe = require('./ClickMe')
function view (state, emit) {
return html`
<body>
${h(ClickMe)}
</body>
`
}
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.
FAQ
Should I use this?
Maybe? If you've got no choice other than using (p)react
this might be useful.
How do I run react widgets in rooch?
Like this:
npm i -S preact preact-compat
npm i -S preact-compat/react preact-compat/react-dom
What's the size?
Something like 9 kB
What about choo?
Yeah, what about me? (drumroll)
Installation
$ npm install rooch