Riot.js Advent Calendar 2019 の20日目です。
元々RiotGearについて予約されていましたが、辞退されてしまったようなので僭越ながら代わりに投稿します。
RiotGearとは
RiotGearとはRiot.jsのオープンソースコンポーネントライブラリです。
よく使うHTML部品をカスタムタグとして提供することで、簡単かつ汎用的に呼び出せるようになっています。
npm i -S riotgear
でインストールできます。
直接使う場合は<script src="https://cdn.jsdelivr.net/riotgear/latest/rg.min.js"></script>
v4にはまだ対応しておらず、Riot v3.13.2サポートとなっています。
また、Blaze CSSというものを使っているそうですが、
証明書が怪しいので公式ページは見ていません。
後継版?のBlaze UIには対応していないようです。
https://www.blazeui.com/
今回Riot v4に対応しようかと思いましたが、ちょっと量が多いのでv3で使っていきます。
使うには以下の3セットが必要です。
<link rel="stylesheet" href="https://cdn.jsdelivr.net/blazecss/1.1.3/blaze.min.css">
<script src="https://cdn.jsdelivr.net/npm/riot@3.13.2/riot+compiler.js"></script>
<script src="https://cdn.jsdelivr.net/npm/riotgear@3.6.0/dist/rg.min.js"></script>
サンプルは公式ページにありますが、APIドキュメントは無さそうなので以下の説明ではソースから内容を判断して記載しています。
アラート
See the Pen ExaWdMV by KAJIKEN (@KAJIKEN) on CodePen.
アラートメッセージを表示します。
rg-alerts
をマウントすることで利用できます。
タグへのパラメータとしてalerts
配列を渡します。
{
'alerts': [
{
'type': 'primary', // アラートの種類 primary / secondary / error の3種類
'text': 'Look! Something you should know about.', // 表示するメッセージ
'dismissable': false, // Xボタンを表示するかどうか 省略時:true
'timeout': 10000, // 自動的に消すまでの時間(ms)
'isvisible': true // 表示するかどうか 省略時:true
}
]
}
イベント
select
: アラートを選択時(onclick
)発行
dismiss
: アラートをXで閉じた時(onclick
)発行
バブル
See the Pen gObmQNJ by KAJIKEN (@KAJIKEN) on CodePen.
マウスホバーすると指定した文字列をポップアップ表示します。
rg-bubble
をマウントすることで利用できます。
タグへのパラメータとしてbubble
オブジェクトを渡します。
{
'bubble': {
'text': 'Bubbles go pop!' // 表示する文字列
}
}
チャート
See the Pen OJPprPL by KAJIKEN (@KAJIKEN) on CodePen.
Chart.jsを使ってグラフを表示します。そのためChart.jsの読み込みが別途必要。
rg-chart
をマウントすることで利用できます。
タグへのパラメータとしてchart
オブジェクトを渡します。
{
'chart': {
'type': 'doughnut', // line|bar|radar|polar|pie|doughnut
'options': {}, // Look at Chart.js documentation on how to populate data and options
'data': [{
'value': 300,
'color': "#F7464A",
'highlight': "#FF5A5E",
'label': "Red"
}, {
'value': 50,
'color': "#46BFBD",
'highlight': "#5AD3D1",
'label': "Green"
}, {
'value': 100,
'color': "#FDB45C",
'highlight': "#FFC870",
'label': "Yellow"
}]
}
}
イベント
loaded
: チャートを表示した後(mount
の最後)に発行
コード
See the Pen KKwWbMN by KAJIKEN (@KAJIKEN) on CodePen.
公式ページには一切書いていないですが、Aceを使ってコードをエディタで表示します。そのためace.jsの読み込みが別途必要。
rg-code
をマウントすることで利用できます。
タグへのパラメータとしてeditor
オブジェクトを渡します。
オプションはAceのドキュメントを参照
{
'editor': {
'code': '<h2>Hello World</h2>',
'mode': 'html', // シンタックスハイライト
'tabsize': 2,
'softtabs': false,
'wordwrap': false,
'readonly': false
}
}
クレジットカード
See the Pen LYEWMLM by KAJIKEN (@KAJIKEN) on CodePen.
カードのアイコンを表示するには画像を用意する必要があります。
img/amex.png
img/diners_club.png
img/discover.png
img/jcb.png
img/mastercard.png
img/visa.png
有効な番号の場合、カード会社が出て緑色の枠になります。
スペースやハイフンをいれても無視されます。
rg-credit-card-number
をマウントすることで利用できます。
タグへのパラメータとしてcard
オブジェクトを渡します。
公式ページのサンプルコードはcardオブジェクトを使っていなくてバグっているのでハマった…。
しかし、カード番号を入れるもので外部コンポーネントを使う気にはとてもならないので使うことは無いだろう。
{
'card': {
'placeholder': 'Long number on front',
'cardnumber': '4000 0000 0000 0002'
}
}
日付
See the Pen NWPjOEY by KAJIKEN (@KAJIKEN) on CodePen.
いわゆるDatepickerです。Moment.jsが必要です。
rg-date
をマウントすることで利用できます。
タグへのパラメータとしてdate
オブジェクトを渡します。
これも公式ページのサンプルコードはdateオブジェクトを使っていなくてバグっている。
さらにサンプルはマウント時のタグ名指定'rg-date'
も忘れている。
{
'date': {
'date' : moment(), // 初期日付
'min': '2019/12/01', // 選択可能最小日付
'max': '2019/12/25' // 選択可能最大日付
}
}
ドロワー
See the Pen GRgmwaw by KAJIKEN (@KAJIKEN) on CodePen.
ドロワーメニューです。
rg-drawer
をマウントすることで利用できます。
タグへのパラメータとしてdrawer
オブジェクトを渡します。
{
drawer: {
header: 'Drawer', // ヘッダー部
isvisible: true, // 初期表示
position: 'top', // 表示位置: top|right|bottom|left
items: [{
id: 1,
text: 'Item 1'
}, {
id: 2,
text: 'Item 2'
}]
}
}
イベント
select
: 項目を選択(onclick
)した時に発行
close
: 枠外の黒い背景を選択(onclick
)した時に発行
Google Analytics
Google Analyticsを設置します。
rg-ga
をマウントすることで利用できます。
カスタムタグのパラメータとしてproperty
属性をセットします。
見た目に変化ないのでコードだけにします。
<rg-ga property="UA-12345678-1"></rg-ga>
riot.mount('rg-ga');
iFramify
iFramifyというライブラリを使ってレスポンシブ対応されたコンポーネントを表示する…らしい。
rg-iframify
をマウントすることで利用できます。
タグへのパラメータとしてiframify
オブジェクトを渡します。
iframifyオブジェクトの中身はiFramifyのオプションと同じとのこと。
<rg-iframify>
<div class="component">
This is a component. Under 200px, the border of this component will go pink.
</div>
</rg-iframify>
riot.mount('rg-iframify', {
iframify: { /* iframify options */ }
});
インクルード
外部ファイルを読み込んで表示する。
rg-include
をマウントすることで利用できます。
タグへのパラメータとしてinclude
オブジェクトを渡します。
<rg-include></rg-include>
var tags = riot.mount('rg-include', {
include: {
url: 'demo_text.html', // 読み込むURL
unsafe: true // trueの場合 カスタムタグごと取得結果で置き換える
}
});
tags[0].on('loaded', function () {
console.log("loaded");
});
イベント
loading
: HTTPリクエストを発行(XMLHttpRequest#send
)した後に発行
loaded
: HTTPリクエストの結果を読み込みんだ(XMLHttpRequest#onload
)時に発行
Google Maps
Google Mapsを読み込んで表示する。
rg-map
をマウントすることで利用できます。
タグへのパラメータとしてmap
オブジェクトを渡します。
<rg-map></rg-map>
var tags = riot.mount('rg-map', {
map: {
center: { lat: 37.7577, lng: -122.4376 },
zoom: 8
}
});
tags[0].on('loaded', function (map) {
var marker = new google.maps.Marker({
position: { lat: 37.7577, lng: -122.4376 },
map: map,
title: 'Hello RiotGear!'
});
});
イベント
initialize
: 読み込み開始時(内部利用専用?)
loaded
: Map読み込み完了時
その1 まとめ
一度に全部やりたかったですが、思いのほか時間が掛かったのでここで一旦区切ります。
RiotGearの存在自体知らなかったですが、使ってみて思うのはサードパーティのライブラリに依存しすぎていることかな。
簡単に呼び出そうという発想は良いですが、サードパーティライブラリ単体でも呼び出しは簡単なオプションで呼べるので大して変わらない。
そしてドキュメントが不十分であるため、結局サードパーティライブラリの説明は読まなきゃ使えないので意味がない。
サードパーティライブラリを使わずに、よく使うようなHTMLテンプレートがコンポーネント化されてたら便利かな。
ハンバーガーメニューとか。依存するなら1つに絞った方がいい気がする。Bootstrapとか。