aloerina01 / til

1日1つだけ強くなる
6 stars 0 forks source link

2019/01/09 VueでTabComponent試作 #89

Open aloerina01 opened 5 years ago

aloerina01 commented 5 years ago

背景

TabComponentってつくるの難しいよなーと思っていたのと、でも何度か実装してきたしそろそろ共通化したい(汎用化したい)なーと思うようになってきたので腕試し的な感じで試したみた。 あーでもないこーでもないって試してたら3時間近くかかった気がする。

ブツ

https://codesandbox.io/s/6xy889m7z3

仕様/要望

難しかったところ

tabの中身をslot化する前提として、このslotではめ込まれるものに対して「Tabを切り替える」「Tabを表示する/非表示にする」みたいな共通の振る舞いをつけるのが厄介だった。気持ち的には

<slot name="nav" @click="changeTab"></slot>

とか、

<template v-for="tabContent in $slots.default">
  <component v-bind:is="tabContent" />
</template> 

とかしたかったけど、当然無理なわけで。

結局slotではめ込まれる要素に対して動的な処理をしたり、振る舞いを付加したりするには、Render関数を使ってJS上で処理するしかなかった(たぶん)。

ちなみにRenderlessComponentというパターンがあるらしいけど、エラーになって実用できなかった。 https://adamwathan.me/renderless-components-in-vuejs/

// renderless component
export default {
  render() {
    return this.$scopedSlots.default({});
  }
}