Vue - ラッパーコンポーネント内のスロットを下に渡すには?
2023-08-29 13:16:47
質問
というようなテンプレートで、簡単なラッパーコンポーネントを作ってみました。
<wrapper>
<b-table v-bind="$attrs" v-on="$listeners"></b-table>
</wrapper>
を使って
$attrs
と
$listeners
で小道具やイベントの受け渡しをします。
うまくいくのですが、ラッパーはどのようにして
<b-table>
と名付けられたスロットを子へプロキシすることができますか?
どのように解決するには?
Vue 3
以外は下のVue 2.6の例と同じ。
-
$listeners
にマージされました。$attrs
ということでv-on="$listeners"
は不要になりました。参照は 移行ガイド . -
$scopedSlots
は、現在ではただの$slots
. 参照 移行ガイド .
Vue 2.6 (v-slot構文)
通常のスロットは全てscoped slotsに追加されるので、これだけでOKです。
<wrapper>
<b-table v-bind="$attrs" v-on="$listeners">
<template v-for="(_, slot) of $scopedSlots" v-slot:[slot]="scope"><slot :name="slot" v-bind="scope"/></template>
</b-table>
</wrapper>
Vue 2.5
参照 ポールの回答 .
オリジナルの回答
このようにスロットを指定する必要があります。
<wrapper>
<b-table v-bind="$attrs" v-on="$listeners">
<!-- Pass on the default slot -->
<slot/>
<!-- Pass on any named slots -->
<slot name="foo" slot="foo"/>
<slot name="bar" slot="bar"/>
<!-- Pass on any scoped slots -->
<template slot="baz" slot-scope="scope"><slot name="baz" v-bind="scope"/></template>
</b-table>
</wrapper>
レンダリング機能
render(h) {
const children = Object.keys(this.$slots).map(slot => h('template', { slot }, this.$slots[slot]))
return h('wrapper', [
h('b-table', {
attrs: this.$attrs,
on: this.$listeners,
scopedSlots: this.$scopedSlots,
}, children)
])
}
また
inheritAttrs
を false に設定することも必要でしょう。
関連
-
[解決済み] Vue 2.0でコンポーネント自身を削除する方法
-
[解決済み] Vue.js - ネストされたデータを適切に監視する方法
-
[解決済み】TypeError: this.getOptions は関数ではありません。
-
[解決済み】@clickとv-on:clickの違い Vuejs
-
[解決済み】Vue2でデバウンスを実装するには?
-
[解決済み】Vuejs:ルート変更時のイベント
-
[解決済み] Vue CLI CSSプリプロセッサーオプション:dart-sass VS node-sass?
-
[解決済み] Vueアプリのビルドを生成するには、どのコマンドを使用すればよいですか?
-
[解決済み] .$mount()とelの違いについて【Vue JS
-
[解決済み] Vueの単一ファイルコンポーネントで画像をインポートして使用するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] オブジェクトのリストからオブジェクトを選択するBootstrap vue b-form-select
-
_this.axios is not a functionの原因と解決方法
-
[解決済み] Vuetify グリッドレイアウト v-layout v-flex
-
[解決済み】@clickとv-on:clickの違い Vuejs
-
[解決済み】Vuejs:ルート変更時のイベント
-
[解決済み] 計算されたプロパティで $refs を使用する
-
[解決済み] V-modelと子コンポーネント?
-
[解決済み] Vuexで1つのモジュールから別のモジュールの状態を変更する
-
[解決済み] 'v-slot' ディレクティブはどんな修飾子もサポートしません。
-
[解決済み] VueJSは親コンポーネントから子コンポーネントのデータにアクセスする