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
// main
class ProfileStore {
@mem avatar = '111'
}
function AvatarView(_, store: ProfileStore) {
return <div>
Avatar: {store.avatar}
</div>
}
AvatarView.deps = [ProfileStore]
function KarmaView() { return null }
function ProfileView() {
return <div>
<AvatarView/>
<KarmaView/>
</div>
}
class MyProfileStore extends ProfileStore {
@mem karma = '2'
@mem avatar = '222'
}
function MyKarmaView(_, store: MyProfileStore) {
return <div>
Karma: {store.karma}
</div>
}
MyKarmaView.deps = [MyProfileStore]
const MyProfileView = cloneComponent(ProfileView, [
[KarmaView, MyKarmaView],
[ProfileStore, MyProfileStore]
], 'MyProfileView')
function AppView() {
return <div>
<h1>ProfileView</h1>
<ProfileView/>
<h1>MyProfileView</h1>
<MyProfileView/>
</div>
}
ReactDOM.render(<AppView/>, document.getElementById('mount'))