同じものをVueと

Reactで作ってみた

個人的感想

2018.8.30 山田 典明 | @noliaki

Vue

  • 業務で結構使ってる

React

  • 業務で使ったことがある

私の経験値

作ったもの

簡易見積りSimulator

※ コストテーブルはものすごく適当です

  • マークアップ、CSSは共通
  • コストテーブルも共通
  • コンポーネント粒度も同じ

Category

Item

作った動機

  • 見積もりのブレを少なくしたかった

  • 誰でもある程度の金額を知れるようにしたかった

  • 見積もった項目の共有をしたかった

  • 何かってとVueを選択してたのでReactも触ってみたかった

Vue

  • カジュアル系男子

React

  • 理系男子

個人的印象

データの更新

今回使用したデータ

[
  { "id": 1, "subject": "トップページデザイン", "cost": 30000, "volume": 0, "totalCosts": 0, "totalHours": 0, "category": "デザイン" },
  { "id": 2, "subject": "下層ページデザイン", "cost": 30000, "volume": 0, "totalCosts": 0, "totalHours": 0, "category": "デザイン" },
  { "id": 3, "subject": "バナーデザイン", "cost": 30000, "volume": 0, "totalCosts": 0, "totalHours": 0, "category": "デザイン" },
  { "id": 4, "subject": "トップページマークアップ", "cost": 30000, "volume": 0, "totalCosts": 0, "totalHours": 0, "category": "フロントエンド" },
  { "id": 5, "subject": "トップページCSS設計", "cost": 30000, "volume": 0, "totalCosts": 0, "totalHours": 0, "category": "フロントエンド" },
  { "id": 6, "subject": "下層ページマークアップ", "cost": 30000, "volume": 0, "totalCosts": 0, "totalHours": 0, "category": "フロントエンド" },
  { "id": 7, "subject": "下層ページCSS設計", "cost": 30000, "volume": 0, "totalCosts": 0, "totalHours": 0, "category": "フロントエンド" },
  { "id": 8, "subject": "JSコーディング 難易度:高", "cost": 50000, "volume": 0, "totalCosts": 0, "totalHours": 0, "category": "フロントエンド" },
  { "id": 9, "subject": "JSコーディング 難易度:中", "cost": 40000, "volume": 0, "totalCosts": 0, "totalHours": 0, "category": "フロントエンド" },
  { "id": 10, "subject": "JSコーディング 難易度:低", "cost": 30000, "volume": 0, "totalCosts": 0, "totalHours": 0, "category": "フロントエンド" }
]

配列の中にObjectがある

これを costTable というkeyに

それぞれぶっ込んだ

Vue

プロパティで渡ってきたObjectの値を直接編集できちゃう

今回の規模ではこれでもOKな気がする。

でも、今後大きくなっていくと、どこでデータを更新してるのかわからなくなるので、親のイベントを発火させるようにした

Itemコンポーネント

React

↑ ムリシャリ、こうやれば、プロパティの値は変更出来るけど 親に影響しない

なので、素直に親のイベントを発火させて状態の変更をする

this.props.content.volume = 10
this.setState({
  hoge: fuga
})

基本的に setState を呼び出して、データの変更を行う

配列の値変更の違い

Vue

onChangeVolume(id, volume) {
  const index = this.costTable.findIndex(item => item.id === id)
  const cloneItem = Object.assign({}, this.costTable[index], { volume })

  this.costTable.splice(index, 1, cloneItem)
}

今回は splice を使った

React

onChangeVolume (id, volume) {
  const index = this.state.costTable.findIndex(item => item.id === id)
  const cloneItem = Object.assign({}, this.state.costTable[index], { volume })

  const newCostTable = [
    ...this.state.costTable.slice(0, index),
    cloneItem,
    ...this.state.costTable.slice(index + 1)
  ]

  this.setState({
    costTable: newCostTable
  }, () => {
    this.tweenTotalCost()
  })
}

新しい配列を作って、ぶっこむ感じ

まとめ

  • このくらいの規模だと、違いというのは そこまで感じずに出来た(メソッドとかもほぼコピペで出来たし)
  • どっちをコーディングしてても、楽しくコーディングできた
  • 今回はpugやTypeScript、CSS modulesとか使ってないので、ここらへん使おうとなると 結構変わってくるのかなーといった印象。(ReactはJSX 1択のようだけど)
  • 次回はAngularもやってみたい

今後

  • コストテーブルをGoogle Spread Sheet とかに移して、サクッと更新できるようにする
  • 何なら それで見積書まで作れるようにする

(個人開発としてはやる気はない)

Thank you

同じものをVueと Reactで作ってみた 個人的感想

By noliaki

同じものをVueと Reactで作ってみた 個人的感想

  • 1,187