Topics

・関数型プログラミングとオブジェクト指向のパラダイムとしての対立 国内の【自称】関数型コミュニティと海外の論調の違い

ガラパゴス・ネットスラング=「関数型ポエム」という呪詛、先入観的読書と、フェアなレビューの登場

Qiitaの騒動から派生して、東北大学の住井 英二郎@esumii氏、らくだの卯之助@camloeba氏その他が、犯罪者集団に合流して2ちゃんねるでの誹謗中傷チームの「8賢者」「ウィザード組」とかアホなことをやってる件について

JavaScriptではES6+とReact-JSXからES5へのトランスパイルが標準に / ATOMエディタで最速環境構築 厳選パッケージ 3 + 3 2015年夏バージョン

2016年のnode、ES6、React、Babel、Atomエディタ界隈の方向性

Dockerじゃないsystemd-nspawn+machinectlが非常に良い

99%のプログラマがIQ145のJKに「ダサい」と言われてしまう理由とは?【その1】「計算機科学のほんとうの基礎」を理解していない。IQ145のJKと同じ事を語るMITの権威とSICPという聖典の権威を借りてマインドコントロールを解いてみよう

99%のプログラマがIQ145のJKに「ダサい」と言われてしまう理由とは?【その2】関数型プログラミングのイミュータブルな世界観とイミュータブルな実世界を完全に統合

10年先を行く斬新な関数型(FRP)データベースについて説明する 99%のプログラマがIQ145のJKに「ダサい」と言われてしまう理由とは?【その3】

[React (.js Facebook)解説 関数型プログラミングに目覚めた! IQ145の女子高生の先輩から受けた特訓5日間 サポート記事【静的HTML編】React 解説【動的HTML-FRP編】

量子コンピュータが超高速である原理と量子論とそれに至るまでの科学哲学史をゼロからわかりやすく解説01量子コンピュータが超高速である原理と量子論とそれに至るまでの科学哲学史をゼロからわかりやすく解説02

『関数型プログラミングに目覚めた!』のレビュー(Day-1)について

LISPデータ構造の問題点の指摘と抜本的解法としての新プログラミング言語の策定/純粋関数型言語「SPINOZA」

著書『関数型プログラミングに目覚めた! IQ145の女子高生の先輩から受けた特訓5日間』 [Day1]たち読み記事 無料公開中

『関数型プログラミングに目覚めた! IQ145の女子高生の先輩から受けた特訓5日間』を大変多くの方々にお買い求めいただき、感謝します。本書の全目次を公開し、質問を受け付けます。

2015年7月6日月曜日

React.jsのボタンの作成方法 ECショッピングサイトのカートの場合

前回、
React.jsは業務レベルで使えるのか? 実践的利用について解説で、
ReactでWebサイト構築するためには
従来のスキルの蓄積がまったく通用しない「リスク」の説明をしました。

従来のスキルの蓄積がまったく通用しない、というのは、まずは、巷で利用可能なよくあるWebサイトのMVCフレームワーク、テンプレートエンジンが使えません。それらのほとんどすべてはHTML+JavaScirpt+CSSというセット構成になっていますが、Reactは、すべてJavaScript(JSX)に一元化するので、そういうのは意味がなくなるわけです。

ボタンのクリックといえば、すぐにjQueryを利用した、DOMのセレクタ、Clickイベントなどを思い出しますが、これも使えません。Reactは、繰り返しになりますが、すべてすべてJavaScript(JSX)に一元化されており、HTMLのDOMを直接操作することはなくJSX上の仮想DOMで、コンポーネント指向で、という開発になります。
つまり、便利に活用できるすべてのjQueryライブラリはReactでは使用不能ということです。

巷で利用可能なCSSで装飾されたボタンも利用できません。ゼロベースでReactのJSX上で一元的に組み込むことになります。

念の為ですが、上記はReactの本来の設計に基づくストレートフォワードな利用法を想定しており、「ReactはMVCフレームワークのVである」と言ったような「イレギュラー」な利用法は想定していません。

百聞は一見に如かず、React.の流儀で、本当によくあるWebページ上のボタンを作成したらどうなるのか?
その方法を見て行きましょう。

今回は、特に前回の「業務レベルに耐えうるのか?」というテーマに基いて具体性をもたせるために、ECショッピングサイトのカートへの応用を前提とすることにします。

CSSで装飾されていて、アイコンも表示できて、マウスがボタン上にホバーしたら色が変わり、クリックしたら色が変わるような、よくあるボタンです。

(function() {
  'use strict';

  var ___ = worldcomponent;

  var BtnComponent = React.createClass({

    componentWillMount: function() {
      var com = this;
      ___.world = com.props.___color.compute(function(x) {
        com.forceUpdate();
      });
      ___.world = com.props.___color.appear("#ffae00");
    },
    onMouseEnter: function() {
      var com = this;
      ___.world = com.props.___color.appear("#ffbf22");
    },
    onMouseLeave: function() {
      var com = this;
      ___.world = com.props.___color.appear("#ffae00");
    },
    onMouseDown: function() {
      var com = this;
      ___.world = com.props.___color.appear("#ddaa11");
    },
    onMouseUp: function() {
      var com = this;
      ___.world = com.props.___color.appear("#ffbf22");
    },
    render: function() {
      var com = this;
      var btnStyle = {
        "padding": "10px 10px",
        "vertical-align": "middle",
        "margin": "0 0",
        "position": "relative",
        "background-color": com.props.___color.now(),
        "border-radius": "4px",
        "color": "#222",
        "font-size": "30px",
        "-webkit-transition": " none",
        "transition": "none",
        "text-shadow": "0 1px 1px rgba(0, 0, 0, .3)"
      };

      var imageLink;

      if (com.props.togo === "CHECKOUT") {
        imageLink = "./images/shopping-cart.svg";
      } else {
        imageLink = "./images/add-shopping-cart.svg";
      }

      var ulStyle = {
        "display": "table",
        "margin": "0 0 0 0",
        "padding": "0 0 0 0"

      };

      var liStyle = {
        "display": "table-cell",
        "margin": "0 0 0 0",
        "padding": "0 0 0 0",
        "vertical-align": "middle",
        "text-align": "center"
      };

      var el = (
        <button onMouseDown={com.onMouseDown} onMouseEnter={com.onMouseEnter} onMouseLeave={com.onMouseLeave} onMouseUp={com.onMouseUp} style={btnStyle}>

          <ul style={ulStyle}>
            <li style={liStyle}>
              <img height="50" src={imageLink}/>
            </li>
            <li style={liStyle}>
              {com.props.txt}
            </li>
          </ul>

        </button>
      );
      return el;
    }
  });

  var ContentComponent = React.createClass({
    render: function() {
      var divStyle = {
        "padding": "110px 0 0 0"
      };

      var el = (
        <div style={divStyle}>
          this is the content<br/>

          <BtnComponent ___color={___()} togo="CHECKOUT" txt="CHECK OUT"/></li>

          <BtnComponent ___color={___()} togo="ID001" txt="ADD TO CART"/>
          <BtnComponent ___color={___()} togo="ID002" txt="ADD TO CART"/>
        </div>
      );
      return el;
    }
  });

  var mount = React.render(<ContentComponent/>, document.body);

}
());

唯一のリアルDOMは、document.bodyであり、
ここでは簡単に、そこに<ContentComponent/>というReactコンポーネントの仮想DOMをマウントしています。

ContentComponentは、今回のメインテーマであるBtnComponentを利用して、コンポーネントを合成して設計されています。

<BtnComponent ___color={___()} togo="CHECKOUT" txt="CHECK OUT"/></li>

DIVのスタイルは、CSSファイルで定義するのではなく、

  var divStyle = {
        "padding": "110px 0 0 0"
      };

とJSX内でJSON形式で変数(定数)を定義しておき、

var el = (
        <div style={divStyle}>
          this is the content<br/>
          .......

というように、仮想DOMにスタイリングを反映させます。

動的なサイトでは、CSSも動的に変化させるコードを書きますが、それもJavaScriptで一元的に取り扱うようになっています。

BtnComponentですが、これはもう、クリックされるというUIなので「時間変化」するコンポーネントです。

Reactは時間変化するUIについてstateというFRP機構を実装していますが、ここでは筆者が独自に設計したFRP機構であるworldcomponentを外部ライブラリとして利用しています。

React組み込みFRPのstateを利用しない理由は、これはコンポーネントの構成が複雑になると通用しなくなるという問題があるからです。詳細は、
React 解説【動的HTML-FRP編】に解説しています。

とにもかくにも、Webサイト上に、ありふれたボタンひとつを設置するだけでも、Reactでは上記のようなコードになるわけで、従来のWeb技術がまったく援用できない、通用しないということが明確にわかると思います。

「これはやばい」と思った人は多いでしょう。
Reactという新規のWeb技術に適用してしまっているアーリーアダプターな技術者は、この辺多かれ少なかれ独力で克服しているわけですが、多くの技術者開発者にとっては、習得して適応するには、かなりハードルが高い技術であることが理解できると思います。

MVCフレームワークは使えない、jQueryも使えない(使うべきではない)、CSSのやり方も違う、開発者に完全リセットさせてゼロベースで開発を要求する非常にやばい技術、それがReactです。

しかし、多くの人がそういう共通認識を持つ、っていうことは問題となる事態は改善される余地があり、改善の余地があれば現状が改善されるのが技術の世界です。特にITでは。

次回はそのことを書きます。

React-Bootstrap React.jsフロントエンドのための再構築されたテンプレート

0 コメント:

コメントを投稿

Popular Posts

Blog Archive