Vue+tsx のスロット使用の問題が置き換えられない

Vue+tsx のスロット使用の問題が置き換えられない

序文

最近、 UIコンポーネントを作成する予定で、 vue 2.x3.xについてさらに深く理解したいと考えています。

アーキテクチャを構築するときは、すべてのコンポーネントをtsxで記述する準備をしてください。

しかし、 tsxslotの使用中に問題が発生しました

問題を見つける

まず、基本的なcardコンポーネントを作成しました。

card.tsx:

'vue-class-component' からコンポーネントをインポートします。
'@packs/common/VanUIComponent' から VanUIComponent をインポートします。
'vue' から { VNode } をインポートします。
'vue-property-decorator' から { Prop } をインポートします。
'@packs/config/card' から { CardShadowEnum } をインポートします。

@成分
デフォルトクラスCardをエクスポートし、VanUIComponentを拡張します。
  @Prop({
    タイプ: 文字列、
    デフォルト: 未定義
  }) パブリック ヘッダーパディング !: 文字列 | 未定義

  @Prop({
    タイプ: 文字列、
    デフォルト: ''
  }) パブリックタイトル !: 文字列

  @Prop({
    タイプ: 文字列、
    デフォルト: CardShadowEnum.Hover
  }) パブリックシャドウ !: CardShadowEnum

  パブリック静的コンポーネント名 = 'v-card'

  パブリックラッパークラス名()を取得します: 文字列 {
    定数リスト: 文字列[] = ['v-card__wrapper']

    リストをプッシュします(`shadow-${ this.shadow }`)

    リストを返します。join(' ')
  }

  パブリックレンダリング(): VNode {
    戻る (
      <div クラス = { this.wrapperClassName }>
        <div class="v-card__header" style={ { padding: this.headerPadding } }>
          {
            this.$slots.title ? <slot name="title" /> : <div>{ this.title }</div>
          }
        </div>
        <div class="v-card__body">
          <スロット名="デフォルト" />
        </div>
        <div class="v-card__footer"></div>
      </div>
    )
  }
}

examplesでこのv-card使用する場合:

<テンプレート>
  <vカード>
    <テンプレート #title>1111</テンプレート>
  </v-card>
</テンプレート>

<script lang="ts">
'vue' から Vue をインポートします
'vue-class-component' からコンポーネントをインポートします。

@成分
デフォルトのクラスをエクスポートし、ComponentsをVueに拡張します。

}
</スクリプト>

<style lang="scss" スコープ>
.components__wrapper {
  パディング: 20px;
}
</スタイル>

レンダリング後、ブラウザがslotタグを置き換えないことがわかりました。

スロットタグの交換なし

Baidu と Google で 1 日検索しましたが、説明が見つかりませんでした。公式ドキュメントを注意深く読んでも、同様のヒントはありませんでした。jsx jsxのドキュメントにも、名前付きslotの使用方法を除いて明確に記載されていませんでした。

解決する

翌日、私はまだこれに苦労しており、 element-uiant-design-vueUIコンポーネントライブラリでの記述方法を調べましたが、 jsxを使用してslotを使用する対応する方法を見つけることができませんでした。

諦めきれず、検索テキストを変更してようやく解決策を見つけました。コードを次のように変更しました。

...
  パブリックレンダリング(): VNode {
    戻る (
      <div クラス = { this.wrapperClassName }>
        <div class="v-card__header" style={ { padding: this.headerPadding } }>
          {
            this.$slots.title ?? <div>{ this.title }</div>
          }
        </div>
        <div class="v-card__body">
          <スロット名="デフォルト" />
        </div>
        <div class="v-card__footer"></div>
      </div>
    )
  }
...

ブラウザのレンダリングをもう一度確認してください。

ここに画像の説明を挿入

問題解決

追記

jsx / tsxを使用する場合、 js構文自体が解決できる場合、またはメソッド自体がthisに登録されている場合は、 jsが優先されます。たとえば、 v-if / v-else雙目運算符に置き換えることができます。実際にこれを行う簡単な方法はないので、 v-showなどのvueのディレクティブを使用します。

Vue+tsx 使用スロットが置換されない問題については、これで終わりです。Vue+tsx スロットが置換されない問題の詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • VUE のコンパイル スコープとスロット スコープのスロットの問題について
  • Vue のスロットの使用法と適用シナリオの詳細な分析
  • Vue のスロットスコープの詳細な理解(初心者向け)
  • ant design vue table a-tableの二次カプセル化とスロットレンダリングの問題を解決する
  • Vue slot_特別な機能スロット、スロットスコープ、ディレクティブv-slotの説明
  • Vue.js スロットにおけるスコープ付きスロットの使用法の詳細な説明

<<:  MySQL 5.7.27 のインストールと設定方法のグラフィックチュートリアル

>>:  mysql ERROR 1045 (28000) 問題の解決方法

推薦する

CocosCreator ユニバーサルフレームワークデザインネットワーク

目次序文Websocketの使用Websocketオブジェクトの構築Websocket ステータスW...

MySQL のデータ型とフィールド属性の原理と使用法の詳細な説明

この記事では、MySQL のデータ型とフィールド属性について説明します。ご参考までに、詳細は以下の通...

MySQL スロークエリ pt-query-digest スロークエリログの分析

1. はじめにpt-query-digest は、MySQL のスロー クエリを分析するためのツール...

Spring Boot のパッケージ化と Docker リポジトリへのアップロードの詳細な手順

重要な注意: この記事を読む前に、Docker コンテナに関する知識と、一般的な Docker 操作...

CSS3 のカラー値 RGBA とグラデーションカラーの使用方法の紹介

CSS3以前は、グラデーション画像は背景画像としてのみ使用できました。 CSS3 のグラデーション構...

Linux のような環境で jdk1.8 をインストールし、環境変数を設定する方法の詳細な説明

設定は非常にシンプルですが、毎回確認しないといけないので、記録だけ残しておきます。 1. インストー...

JavaScript の for/of、for/in の詳細な紹介

目次JavaScriptでは、 forループを記述する一般的な方法がいくつかあります。最初の、そして...

IE6、IE7、IE8 で CSS3 の丸い角と影のスタイルをサポートする

CSS3 の角丸や影の効果を使ったページを作りたいのですが、IE ブラウザでは対応していません。こ...

MYSQL開発パフォーマンス調査:バッチデータ挿入の最適化方法

1. どのような問題に直面しましたか?標準 SQL では、通常、次の SQL 挿入ステートメントを記...

MySQL クエリ キャッシュのグラフィカルな説明

目次1. 原則の概要クエリキャッシュシステム変数1. クエリキャッシュを持つ2. クエリキャッシュ制...

モバイルデバイス上の 1px 境界線を解決する最善の方法 (推奨)

モバイル デバイス向けに開発する場合、Retina 画面上で要素の境界線が太くなるという問題に遭遇す...

HTML ヘッドタグの詳細な紹介

HTML のヘッド部分には、ブラウザによる Web ページのレンダリングや SEO などに関連するタ...

HTML テーブルに複雑なテーブル ヘッダーを実装するためのサンプル コード

複雑な表を作成するには HTML を使用します。複雑なテーブルでは通常、td の rowspan 属...

Dockerイメージをパッケージ化し、リモートサーバーにプッシュしてk8sにデプロイする方法

目次1. Dockerファイル2. pom 構成3. イメージプッシュ4. k8s デプロイメント前...

Linux 名前空間ユーザーの詳細な説明

ユーザー名前空間は Linux 3.8 で追加された新しい名前空間で、ユーザー ID やグループ I...