鈍足ランナーのIT日記

走るのが好きな5流のITエンジニアのブログ。

趣味の範囲は広いけど、どれも中途半端なクソブロガー楽しめるWebアプリを作ってあっと言わせたい。サーバーサイドPerl(Mojolicious)、クライアントサイドVue.js。Arduinoにも触手を伸ばす予定。

備忘録、Reactでドラッグ&ドロップ

すこしずつ読んでみよう。

http://webcloud.se/truly-reactive-sortable-component/

プロパティでイニシャルステートを初期化する。ふむふむ。

  getInitialState: function() {
    return {data: this.props.data};
  },

this→that置換が不要必要??

jsfiddle上ではthisのまま動いているようですが、
手元ではthisをthatに変えないと動かなかったなぜ???

  render: function() {
    var that = this;
    var listItems = this.state.data.colors.map(function(item, i) {
      var dragging = (i == that.state.data.dragging) ? "dragging" : "";
      return <li data-id={i}
            className={dragging}
            key={i}
            draggable="true"
            onDragEnd={that.dragEnd}
            onDragOver={that.dragOver}
            onDragStart={that.dragStart}>
          {item}
        </li>
      ;
    });
    return (<div>
    <ol>{listItems}</ol>
    <pre>App State: <br /><br/>{JSON.stringify(this.state,0,2)}</pre>
    </div>)
  }
});

isFiniteの挙動

node.jsで確かめてみた。undefinedを区別できるのかな。

> isFinite(1);
true
> isFinite(undefined);
false
> isFinite(null);
true
> isFinite('');
true

配列の要素の入れ替え

インデックスfromの要素をインデックスtoへ移動させるコード
spliceというメソッドを使うと簡潔に書けるみたい。

  • spliceは頭の引数2つで取り出し。

items.splice(from,1)ではfromから1つ要素を
取り出して、それを返却値に返す。itemsの内容は取り出した後の配列になる。

  • 3つ目以降の引数で挿入。

items.splice(to,0,"hoge")みたいにすると
インデックスtoから0つの要素の取り出し(つまり何も取りださない)に加えて
to番目の要素に"hoge"を加えている。

    items.splice(to, 0, items.splice(from,1)[0]);

ドラッグオーバーの時のドラッグ先インデックスの編集

ここの、意味がよくわからなかった。
なくても動くような気がするのですが、何のために
いれているのだろう。

    if((e.clientY - over.offsetTop) > (over.offsetHeight / 2)) to++;
    if(from < to) to--;