「A React-like user interface micro-library」
カスタムタグを使ったシンプルなUIライブラリ
仮想DOM
単方向データフロー(親から子へ)
ひとつのコンポーネントはタグ(.tag)としてまとめる
ES6、Typescript、CoffeeScript、pug(jade)、LiveScript
サーバーサイドレンダリング
AMD、CommonJS、importもサポート
2014/4 v1.0
2015/1 v2.0
2016/7 v2.5
2016/8/21 v2.6
2016 summer v3 (coming soon!)
<tag>
<p>{name}</p>
<span class="{ checked: isCheck }" onclick="{onClick}">check</span>
<script>
this.name = 'foo';
this.isCheck = true;
this.onClick = () => {
// do something...
};
</script>
</tag>
this.onClick = () => {
// do something...
};
onClick(){
// do something...
};
or
<ul>
<li each="{user in users}">{user.name}</li>
</ul>
<script>
this.user = [
{ name: 'Mike' },
{ name: 'Dave' }
];
</script>
<li each="{users}">{name}</li>
変数を省略して、以下のように書くこともできる
※ if=falseでも一度はそのタグが読み込まれてしまうので注意
(v3で改善されるらしい)
<div if={error}>
<div show={error}>
<div hide={error}>
<my-parent>
<div>
<my-child data="{data}">
</div>
this.data = 'foo';
</my-parent>
<my-child>
<h1>{opts.data}</h1>
this.title = this.opts.data
</my-child>
<child>
<ul>
<li each="{users}" onclick="{parent._onClick}">{name}</li>
</ul>
<script>
this.users = [...];
this._onClick = () => {
// do somethimg...
};
</script>
</child>
<child>
<ul>
<li>foo</li>
</ul>
<script>
const $li = root.querySelector('li');
</script>
</child>
this.on('mount', () => {
// mount
});
this.on('update', () => {
// update
});
this.on('*', () => {
// all events
});
// mixin
this.mixin(mixinObject);
// shared mixin
riot.mixin('mixinName', mixinObj);
// 呼びだし
this.mixin('mixinName');
// global mixin
riot.mixin(mixinObj);
// mixin
this.mixin(mixinObject);
// shared mixin
riot.mixin('mixinName', mixinObj);
// 呼びだし
this.mixin('mixinName');
// global mixin
riot.mixin(mixinObj);
<my-tag>
<div>
<yield/>
</div>
this.title = this.opts.title;
</my-tag>
// 呼び出し
<my-tag title="this is p">
<p>{title}</p>
</my-tag>
<my-tag title="this is h1">
<h1>{title}</h1>
</my-tag>
my-tag
div
<yield/>
this.title = this.opts.title;
基本的にタグのデータ(this)は更新すると自動的にDOMが更新されるが、イベントのスコープが外れた状態(setTimeoutやxhr)でデータを更新するとレンダリング処理が走らないので、そのときは自分で`this.update()`を呼ぶ必要がある。
これ結構ハマる。
// 通常はこのような更新
this.items.push({ title: this.text });
// 以下の場合は自分でupdateする必要がある
fetch().then((text) => {
this.items.push({ title: text });
this.update(); // ← 必要!!!
});