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) 問題の解決方法

推薦する

ROS2のインストールとdocker環境の使い方について

目次Docker を使用する理由は何ですか? DockerのインストールROSイメージを取得するRO...

HTML4.0 要素のデフォルトスタイルの配置

コードをコピーコードは次のとおりです。 html、アドレス、引用ブロック、本文、dd、div、 dl...

webpackの遅延読み込みとプリロードの詳細な説明

目次通常の読み込み遅延読み込みプリロードプリロードを使用しないプリロードの使用要約する通常の読み込み...

sbinディレクトリを生成せずにNginxをインストールするソリューション

エラーの説明: 1. Linux (CentOS 7 64) システムに Nginx (1.18.0...

MYSQL 文字関数を使用してデータをフィルタリングすることに関する質問

問題の説明:構造:テストには2つのフィールドがあります。これらは col1 と col2 で、どちら...

MySQL CHARとVARCHARの保存と読み取りの違い

導入保存時と読み取り時に CHAR 型と VARCHAR 型の違いを本当にご存知ですか?まずいくつか...

HTML テーブル_Powernode Java アカデミー

HTMLで表を描くには、表タグを使用します。 trは行を意味しますtdは列を示すth はテーブ...

Linux\Nginx 環境での仮想ドメイン名の設定とテスト検証

Nginx 仮想ドメイン名設定を使用すると、ドメイン名を購入せずに特定のドメイン名を介してローカル ...

Nest.js のハッシュと暗号化の例の詳細な説明

0x0 はじめにまず、ハッシュアルゴリズムとは何でしょうか?メッセージやセッション項目など、一部のデ...

安全な構成のためにDockerでTLSを有効にする手順

序文以前、Docker の 2375 Remote API を有効にしていました。会社のセキュリティ...

FileZilla を使用して FTP サーバーに接続するプロセスの図

最初にサーバー上に FTP サーバーをセットアップし始めたとき、接続できないことがわかったので、Fi...

MySQL 8.0.21 無料インストール版 設定方法 グラフィックチュートリアル

MySQLをインストールする6つの手順(インストールパッケージのみがインストール場所を選択できます)...

Linux での MySQL 8.0.25 のインストールと設定のチュートリアル

LinuxにMySQL 8.0.25をインストールするための最新のチュートリアルを参考にしてください...

Vue のローカルコンポーネントの紹介

Vueでは、ローカルコンポーネントを自分で定義(登録)することができます。コンポーネント名を定義する...

HTML 内の CSS および JS リンクのバージョン番号 (キャッシュを更新)

背景検索エンジンで「.htaccess キャッシュ」というキーワードを検索すると、ウェブサイトのファ...