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

推薦する

Javascript を使用して、スライドバー効果のあるスライドナビゲーション プラグインを開発します。

目次1. はじめに2. 使用方法3. 開発プロセス1. モデル例2. イベントとアニメーション4. ...

黒、白、グレーの控えめでエレガントなウェブデザインを鑑賞

クラシックな色の組み合わせの中でも、黒、白、グレーの時代を超えた魅力を否定できる人はおそらくいないで...

Nginx アップロードファイルのサイズを変更する簡単な方法

オリジナルリンク: https://vien.tech/article/138序文私は、マークダウン...

IDEA2021 tomcat10 サーブレットの新しいバージョンの落とし穴

私が学習していたときに使用していたバージョンは比較的新しいものであり、インターネット上のチュートリア...

Angularコンポーネント投影の詳細な説明

目次概要1. 簡単な例1.サブコンポーネントの<ng-content>ディレクティブを使...

MySQL 8.0.23 メジャーアップデート (新機能)

著者: Guan Changlong は、Aikesheng の配送サービス部門の DBA です。主...

Docker での Redis の永続ストレージの詳細な説明

この章では、dockerの下にあるSpring BootプロジェクトでRedisを操作し始めます。準...

Windows での MySQL 8.0.11 インストール チュートリアル

この記事は、WindowsでのMySQL 8.0.11のインストールチュートリアルを記録しています。...

CSS と HTML とフロントエンド テクノロジーのレイヤー図

フロントエンドテクノロジー層 (写真は少し極端ですが、参考までに) Javascript と DOM...

Docker で lnmp をデプロイする詳細な手順

目次Centosイメージを取得するCentos ベースの nginx コンテナを生成するCentos...

純粋な CSS を使用してユーザーが Web ページのコンテンツをコピーするのを防ぐ方法

序文私自身の個人ブログを入力しているときに、ブログの詳細ページでさまざまなコンテンツをコピーするさま...

読み取り専用と無効の微妙な違いの詳細な説明

「読み取り専用」と「無効」はどちらも、ユーザーがフォーム フィールドの内容を変更できないようにします...

Linux での screen コマンドの使用方法の詳細な説明

GUNスクリーン:公式サイト: http://www.gnu.org/software/screen...

Docker ベースの Redis 1 マスター、2 スレーブ、3 センチネルの実装

現在、Redis とコンテナについて学習中なので、Docker を使用して Redis マスタースレ...

CentOS 7 に mysql5.7 の解凍バージョンをインストールするチュートリアル

1. mysqlの圧縮パッケージを/usr/localフォルダに解凍し、名前をmysqlに変更します...