Mobx + React simple todolist
HTML
<script src="https://unpkg.com/react@15/dist/react.min.js"></script>
<script src="https://unpkg.com/react-dom@15/dist/react-dom.min.js"></script>
<script src="https://unpkg.com/lom_atom@1/dist/lom_atom.umd.js"></script>
<script src="https://unpkg.com/reactive-di@4/dist/reactive-di.umd.js"></script>
<body>
<div id="mount">
</div>
</body>
Babel + JSX
// @flow
const {mem, memkey, action, force} = lom_atom
const {createReactWrapper, createCreateElement, Injector, cloneComponent} = window['reactive-di']
const {render} = ReactDOM
const {createElement, Component} = React
/** @jsx lom_h */
// setup
function ErrorableView({error}: {error: Error}) {
return <div>
{error instanceof mem.Wait
? <div>
Loading...
</div>
: <div>
<h3>Fatal error !</h3>
<div>{error.message}</div>
<pre>
{error.stack.toString()}
</pre>
</div>
}
</div>
}
const lomCreateElement = createCreateElement(
createReactWrapper(
Component,
ErrorableView
),
createElement
)
window['lom_h'] = lomCreateElement
// todo
function fetchName() {
return new Promise((resolve, reject) => {
setTimeout(() => {
// reject(new Error('Fetch error'))
resolve({name: 'John'})
}, 500)
})
}
interface HelloModel {
name: string;
}
class HelloService {
@mem set hello(next: HelloModel | Error) {}
@mem get hello(): HelloModel {
fetchName()
.then((model) => { this.hello = model })
.catch((error) => { this.hello = error })
throw new mem.Wait()
}
}
function HelloView(props: {greet: string}, service: HelloService) {
return <div>
{props.greet}, {service.hello.name}
<br/><input value={service.hello.name} onChange={(e) => { service.hello = {...service.hello, name: e.target.value} }} />
</div>
}
HelloView.deps = [HelloService]
ReactDOM.render(<HelloView greet="Hello"/>, document.getElementById('mount'))