React の仕組みで HTML5 キャンバスを利用する react-canvas を試してみます。

インストール

npm で必要な物を入れていきます。

$ npm -S react react-canvas
$ npm -g browserify
$ npm -D babelify

使ってみる

画面に文章を描写してみます。

// a.jsx

import React from 'react';
import { Surface, Text } from 'react-canvas';

class App extends React.Component {
    render() {
        const { text = 'Hello, react-canvas!' } = this.state || {};
        return (
            <Surface width={300} height={300} left={0} top={0} enableCSSLayout={true}>
                <Text style={{ width: 300, height: 20, fontSize: 14, lineHeight: 20 }}>
                    {text}
                </Text>
            </Surface>
        );
    }
}

React.render(<App />, document.body);

Surfacecanvas 要素になり、 Text が文章を描写します。

browserify でコンパイルします。

$ browserify -o bundle.js -t babelify a.jsx

これを読み込む HTML が以下です。

<!DOCTYPE html><meta charset="utf-8"><body><script src="bundle.js"></script></body>

開くとキャンバスに Hello, react-canvas ! と表示されるのがわかります。

イベント

クリックをハンドルしてみます。

    onClick() {
        this.setState({ text: 'Clicked!' })
    }

    render() {
        const { text = 'Hello, react-canvas!' } = this.state || {};
        return (
            <Surface width={300} height={300} left={0} top={0} enableCSSLayout={true}>
                <Text style={{ width: 300, height: 20, fontSize: 14, lineHeight: 20 }}
                    onClick={this.onClick.bind(this)}>
                    {text}
                </Text>
            </Surface>
        );
    }

TextonClick プロパティにハンドラを指定します。

表示してクリックすると文章が Clicked! に変わります。キャンバス上のクリックされた要素を判定するのは自分で書くと面倒なので助かります。

まとめ

  • react-canvas を使えばキャンバス上の描写を React の仕組みを使って行える
  • イベントもハンドルできる