Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Vueで「見た目」「振る舞い」を分離してみよう

Nkowne63
September 21, 2019
560

 Vueで「見た目」「振る舞い」を分離してみよう

Nkowne63

September 21, 2019
Tweet

Transcript

  1. 自己紹介 張 たいよ (GitHub: @neutron63zf) 東京大学理学部物理学科 4年 • ventus-inc ◦

    JavaScript / TypeScript ◦ Vue.js / Nuxt.js • (元)東京大学五月祭常任委員会 ◦ AWS / Nginx / Docker ◦ Node.js ( Express )
  2. よくある要望(その2) • 表示の場合分けも追加 ↓ • 「ローディングとエラーの表 示」 • 表示するデータを一つふや す

    これだけで、25行だったファイルが 58行まで増えてしまった 処理もちょっと読みづらくなる 本質的でない部分も多い
  3. ではどうしてコードが肥大化するのか? • 先程の解決策たちは、確かに一定の効果があったが、抜本的な解決( =この場合だと、loadingに まつわる処理を毎回書かずに済む)にはならなかった。 ◦ 1つ目では、コンポーネントを切り出すことで、 「templateでの条件分岐」を切り出せたが、 「loading,errorの管理」は毎回書かないといけなくなった。 (なんなら前者もあまり解決できていない)

    ◦ 2つ目では、「loading,errorの管理」は楽になったが、「 templateでの条件分岐」は毎回書か ないといけない。 • どうも「loading、 error」にまつわる「loading,errorの管理」(状態)と「templateでの条件分岐」(振 る舞い)は一緒に切り出さないといけないらしい。 • →「状態 & 振る舞い」と「見た目」を分離したい。
  4. Vue Promised(1) script • propsとcomputedだけになっている。 • つまり、「stateless」になっている • コードも圧倒的に短い (公式のサンプルでは

    dataに代入していますが、 statelessであることを強調する ためにcomputedに入れています。一応、 this.nameが変わると再計算される。)
  5. Vue Promised(3) templateは変わってない...? • 表示はそんなに変わっていないように見える。 v-if消えただけ...? • だが、「v-if」が消滅したことによる効果は実は結構大きい ◦ v-ifの記述順番を気にしなくても済む

    ◦ たくさんあるv-ifの意味をいちいち考える必要がなくなる ▪ つまり、「ここのv-ifは要するにどういうことなんだ」ということが激減する • loading,errorの状態管理と、それによる表示の場合分けを自分で毎回実装する必要がなくなった
  6. Scoped Slots(6) Scoped Slotを使う • CountUpコンポーネントを使う側では v-slotを指定する必要がある • v-slotで指定したオブジェクトのプロパティーに、 CountUpコンポーネントのデータが

    入っている • 実際に表示すると、毎秒カウントが増えて いるのがわかる • CountUpが行っているのはカウントだけで、 表示は使う側が自由に付け替え可能(「見た目」と「状態 &振る舞い」の分離) (使う側の書き直し)
  7. より細かく考えると... • Scoped Slotsで分離できるのは「状態 & 振る舞い」であるが、「状態のない見た目以外 の全部」ということもできる • 大体のVueのアプリケーションは以下の 4つの部分に分割できると考えられる

    Scoped Slotsは下の3つをまとめていると考えることができる ◦ 状態のない見た目 ◦ 状態と紐付いた見た目 ◦ 状態とそれに対する操作 ◦ 純粋で副作用のない関数
  8. 使い分けとさらなる分割 Scoped Slotsは以下の3つをまとめている存在であると考えることができる • 状態と紐付いた見た目 • 状態とそれに対する操作 • 純粋で副作用のない関数 これらのうち、Scoped

    Slotsでしか実装できないのは一番上だけ! 「純粋で副作用のない関数」は自明に切り出せる 「状態とそれに対する操作」は「 Vuex」や「composition-api」で切り出せる Scoped Slotsを実装するときには一番上であるかを考えよう。 既に実装したScoped Slotsも分割ができる。