Open aloerina01 opened 5 years ago
TabComponentってつくるの難しいよなーと思っていたのと、でも何度か実装してきたしそろそろ共通化したい(汎用化したい)なーと思うようになってきたので腕試し的な感じで試したみた。 あーでもないこーでもないって試してたら3時間近くかかった気がする。
https://codesandbox.io/s/6xy889m7z3
slot-scope
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({}); } }
背景
TabComponentってつくるの難しいよなーと思っていたのと、でも何度か実装してきたしそろそろ共通化したい(汎用化したい)なーと思うようになってきたので腕試し的な感じで試したみた。 あーでもないこーでもないって試してたら3時間近くかかった気がする。
ブツ
https://codesandbox.io/s/6xy889m7z3
仕様/要望
slot-scope
とか書きたくない(汎用部品で吸収してほしい)難しかったところ
tabの中身をslot化する前提として、このslotではめ込まれるものに対して「Tabを切り替える」「Tabを表示する/非表示にする」みたいな共通の振る舞いをつけるのが厄介だった。気持ち的には
とか、
とかしたかったけど、当然無理なわけで。
結局slotではめ込まれる要素に対して動的な処理をしたり、振る舞いを付加したりするには、Render関数を使ってJS上で処理するしかなかった(たぶん)。
ちなみにRenderlessComponentというパターンがあるらしいけど、エラーになって実用できなかった。 https://adamwathan.me/renderless-components-in-vuejs/