Vue のスロットとフィルターの詳細な説明

Vue のスロットとフィルターの詳細な説明

スロット

スロットとは何ですか?

コンセプト

Vue はコンテンツ配信 API のセットを実装し、配信されたコンテンツを運ぶための出口としてコンポーネントの <slot> 要素を提供します。

簡単に言えば、<slot> 要素はコンポーネント テンプレート内のコンテンツ配信スロットとして機能します。 <slot> 要素自体が置き換えられます。

スロットの内容

文法

まず、スロットを書き込むための新しいファイルを作成します

// スロット.vue

<テンプレート>
  <div>
    <div>
      <!-- 配信内容はこのスロットタグの位置に運ばれます -->
      <スロット></スロット>
    </div>
    <p>アカウント: <input /></p>
    <p>パスワード: <input type="password" /></p>
    <button>ログイン</button>
  </div>
</テンプレート>

<スクリプト>
デフォルトをエクスポートします {};
</スクリプト>

<スタイル>
</スタイル>

次にそれを別のコンポーネント(SlotTest)で使用します。

// スロットテスト.vue

<テンプレート>
  <div>
    <スロットコム>
        <h2>私はスロットに配信されるコンテンツです</h2>
    </スロットCom>
  </div>
</テンプレート>

<スクリプト>
// インポート import slotCom from "../views/slot";

エクスポートデフォルト{
  コンポーネント:
    スロットコム
  },
}
</スクリプト>

<スタイル>
</スタイル>

効果図 (下記) から、h2 タグ内の文がページ上にレンダリングされ、タグの位置も slot.vue ファイル内のタグに対応していることがわかります。

知らせ

<SlotTest> テンプレートに <slot> 要素が含まれていない場合、コンポーネントの対称タグ内のすべてのコンテンツは破棄されます。

コンパイルスコープ

たとえば、スロット内のデータを使用したい場合:

<ナビゲーションリンク url="/プロフィール">
  {{ user.name }} としてログインしました
</ナビゲーションリンク>

スロットは、テンプレートの残りの部分と同じインスタンス プロパティ (したがって同じ「スコープ」) にアクセスできますが、<navigation-link> のスコープにはアクセスできません。たとえば、次の URL にはアクセスできません:

<ナビゲーションリンク url="/プロフィール">
  ここをクリックすると、{{ url }} に移動します。

  /* ここでの `url` は、その内容が <navigation-link> コンポーネント *内で* 定義されるのではなく、<navigation-link> に _渡される_ ため、未定義になります。
  */
</ナビゲーションリンク>

原則として、次の点に注意してください。

親テンプレート内のすべてのコンテンツは親スコープでコンパイルされ、子テンプレート内のすべてのコンテンツは子スコープでコンパイルされます。

フォールバックコンテンツ

<slot> 要素を使用してフォールバック コンテンツを設定できます。現在のコンポーネントの対称タグにコンテンツが挿入されていない場合、コンポーネントは最終的にフォールバック コンテンツをレンダリングします。簡単に言えば、スロットのデフォルト値に相当します。

// ボタンコンポーネント、フォールバックコンテンツをテキスト送信に設定する
<ボタンタイプ="送信">
  <slot>送信</slot>
</ボタン>

// 親コンポーネントで <submit-button> を使用し、スロット コンテンツを提供しない場合:
<送信ボタン></送信ボタン>

// フォールバック コンテンツ「Submit」がレンダリングされます。
<ボタンタイプ="送信">
  提出する
</ボタン>

// ただし、コンテンツを提供する場合は:
<送信ボタン>
  保存
</送信ボタン>

// フォールバック コンテンツの代わりに提供されたコンテンツがレンダリングされます。
<ボタンタイプ="送信">
  保存
</ボタン>

名前付きスロット

概念 場合によっては、コンポーネントに複数のスロットが必要になることがあります。異なるコンポーネントを異なるスロットに挿入できます。これは、名前付きスロットを使用し、コンポーネント内の <slot> 要素に name 属性を設定することによって行われます。名前付きスロットにコンテンツを提供する場合、<template> 要素の v-slot ディレクティブを使用して、対応するコンテンツを指定された <slot> 要素に挿入できます。

文法

// ログインコンポーネント.vue

<テンプレート>
    <div>
        <div>
            <slot>バックアップコンテンツ</slot>
        </div>
        <p>
            アカウント: <slot name="user"></slot>
        </p>
        <p>
            パスワード: <slot name="psd"></slot>
        </p>

        <button>ログイン</button>
        <スロット></スロット>
    </div>
</テンプレート>

// <login-component> を使用する
        <h2>私はスロットに配信されるコンテンツです</h2>

        <テンプレート v-slot:user>    
            <!-- ここのすべてのコンテンツは name="user" スロットに挿入されます -->
            <div>
                123
            </div>
        </テンプレート>


        <input slot="psd" type="password" placeholder="この要素は name=psd スロットに挿入されます">
        <コンポーネント-a スロット="psd"></コンポーネント-a> 

</ログインコンポーネント>

知らせ

v-on や v-bind と同様に、v-slot にも省略形があり、パラメータ (v-slot:) の前のすべてを文字 # に置き換えます。たとえば、v-slot:headerは#headerに書き換えることができます。

<ログインコンポーネント>
            <h2>私はスロットに配信されるコンテンツです</h2>

            <テンプレート #ユーザー>    
                ここにあるすべてのコンテンツは、name="user" スロット <div> に挿入されます。
                    123
                </div>
            </テンプレート>


            <テンプレート #psd>    
               <input type="password" placeholder="この要素は name=psd スロットに挿入されます">
            </テンプレート>
</ログインコンポーネント>

個人的には、スロットはプロジェクト開発ではあまり使用されず、一部の UI ライブラリの開発でよく使用されると思います。スロットについてさらに深く理解したい場合は、公式ドキュメント cn.vuejs.org/v2/guide/co… を参照してください。

フィルター

コンセプト

Vue.js を使用すると、一般的なテキストの書式設定に使用できる独自のフィルターを定義できます。フィルターは、二重中括弧補間と v-bind 式の 2 つの場所で使用できます (後者は 2.1.0 以降でサポートされています)。フィルターは、JavaScript 式の最後に「|」記号で示されて追加する必要があります。

文法

フィルターはグローバルフィルターまたはローカルフィルターをサポートします

グローバルフィルター

<div id="アプリ">
    {{str | capitalize}} // こんにちは
</div>

// 単語の最初の文字を大文字にする Vue.filter('capitalize', function (value) {
  if (!value) が '' を返す
  値 = value.toString()
  戻り値.charAt(0).toUpperCase() + value.slice(1)
})

新しいVue({
    el: '#app',
    データ: {
        文字列: 'こんにちは'
    }
})

ローカルフィルター

<div id="アプリ">
    <div v-for="(f,i) 友達の中に" :key="i">
        <h3>名前: {{f.name}} </h2>
        <p>年齢: {{f.age}}</p>
        <p>性別: {{f.sex|getSex}}</p>
    </div>
</div>

<スクリプト>
    新しいVue({
        el: '#app',
        データ: {
            友達: [{
                    名前: 'マックス',
                    性別: 0,
                    年齢: 19
                },
                {
                    名前: 'ジャック',
                    性別: 1,
                    年齢: 22
                },
                {
                    名前: 'Jacose'、
                    性別: 1,
                    年齢: 19
                },
                {
                    名前: 'ティム',
                    性別: 1,
                    年齢: 18
                },
                {
                    名前: 'ジミー'、
                    性別: 0,
                    年齢: 20
                },
                {
                    名前: 'トム'、
                    性別: 0,
                    年齢: 19
                },
            ]
        },
        フィルター:
            getSex(タイプ) {
                (タイプ === 0)の場合{
                    '男性'を返す
                }
                '女性'を返す
            }
        }
    })
</スクリプト>

注: filter は複数のパラメータの受け渡しをサポートしています。substr に直接渡されたパラメータは、filter メソッドの 2 番目、3 番目、… のパラメータとして順番に使用されます。

<div>{{'hello' | substr(3,4)}}</div>
<スクリプト>
{
    フィルター:
       substr(str,start,end) {
           str.substr(start,end) を返す
       } 
    }
}
</スクリプト>

練習する

指定されたテンプレートに従って、対応する構造体の時間を返すことができるフィルターを実装します。

// 例 <p>{1599639292100 | getTemplateTimeByDate('YYYY-MM-dd hh:mm:ss')}</p> -> 2020-09-09 15:04:56

<p>{1599639292100 | getTemplateTimeByDate('YYYY-Md h:m:s')}</p> -> 2020-9-9 15:4:6
<p>{1599639292100 | getTemplateTimeByDate('YYYY 年 M 月 d 日 hh:mm')}</p> -> 2020 年 9 月 9 日 15:04

新しいVue({
    el: '#app',
    データ: {
        日付: 新しい Date().getTime()
    },
    フィルター:
        getTemplateTimeByDate(日付、テンプレート) {
            date = 新しい日付(date)

            TimeObj = {
                'Y+': date.getFullYear(),
                '(M+)': date.getMonth() + 1,
                '(d+)': date.getDate(),
                '(h+)': date.getHours(),
                '(m+)': date.getMinutes(),
                '(s+)': date.getSeconds()
            }

            for (キー in TimeObj) {
                reg = 新しい RegExp(キー) とします。

                if (reg.test(テンプレート)) {
                    console.log(正規表現$1)
                    time = TimeObj[キー]とする
                    // 現在のテンプレートの時刻が 2 桁か 1 桁かを判断します // 2 桁の時刻の場合は、先頭にゼロを追加します (1 -> 01) 
                    // 数字の場合はゼロを追加する必要はありません if (RegExp.$1.length > 1) {

                        時間 = 時間 >= 10 ? 時間 : '0' + 時間
                    }
                    テンプレート = template.replace(reg, 時間)
                }
            }
            返品テンプレート
        }
    }
})
</スクリプト>

要約する

Vue のスロットとフィルターに関するこの記事はこれで終わりです。Vue のスロットとフィルターに関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vue でのスロットの紹介と使用
  • Vue コンポーネント スロットの使用とコンポーネント内でのメソッドの呼び出しの詳細な説明
  • Vue スロットの理解と使用
  • Vueスロットの原理と使い方の詳細な説明
  • Vueの$slotはスロットのノードインスタンスを取得します
  • vueスロットの使い方の詳しい説明
  • Vue.jsはフィルターとカスタムフィルターを毎日学習する必要があります
  • Vue フィルターと基本的な使い方
  • Vue.js -- フィルターの使用法の概要

<<:  Linuxでサーバーのハードウェア情報を表示する方法

>>:  Zabbix が MySQL のマスター/スレーブ状態を監視する方法の詳細な説明

推薦する

JavaScript プロトタイプオブジェクトの this ポイント問題の詳細な説明

目次1. これは2. この点を修正する1. call() メソッド2. apply() メソッド要約...

MySQL のインデックスの原理とクエリの最適化の詳細な説明

目次1. はじめに1. インデックスとは何ですか? 2. インデックスはなぜ必要なのでしょうか? 2...

MySQLでルートユーザーのパスワードを変更する方法

方法1: SET PASSWORDコマンドを使用する mysql> username@loca...

Centos8 で Docker を使用して Django プロジェクトをデプロイする詳細なチュートリアル

導入この記事では、django + uwsgi + nginx デプロイメントを使用して、Docke...

Reactでコンポーネントロジックを共有する3つの方法

簡単に説明すると、これら 3 つの方法は、レンダリング プロップ、高階コンポーネント、カスタム フッ...

HTML マーキータグの使用例

このタグはHTML3.2の一部ではなく、MSIE3以降のカーネルのみをサポートしています。そのため、...

HTMLでvueとel​​ement-uiを直接参照する方法

コードは次のようになります。 <!DOCTYPE html> <html> ...

MySQL はどのようにしてマスターとスレーブの同期を実現するのでしょうか?

マスタースレーブ同期 (マスタースレーブレプリケーションとも呼ばれる) は、マスタースレーブデータの...

NodeJs の高メモリ使用量のトラブルシューティング実戦記録

序文これは、オンライン コンテナーの拡張によって発生した調査です。最終的には、実際の OOM が原因...

クエリプロファイラを使用して MySQL ステートメントの実行時間を表示する方法

前回の記事では、MySQL ステートメントの実行時間をチェックする 2 つの方法を紹介しました。今日...

SSM VUE Axios の詳細な説明

目次SQL ログを表示するにはどうすればいいですか? ? SpringMVC でのパラメータ渡しの説...

Navicat を使用してリモート Linux MySQL データベースに接続するときに発生する 10061 不明エラーの詳細な説明

Navicat を使用してリモート Linux MySQL データベースに接続すると、不明なエラー ...

MySQL インデックス失敗の原理

目次1. インデックス失敗の理由2. インデックスの秩序が崩れる状況を見てみましょう。 - インデッ...

CSS3 @mediaの基本的な使い方のまとめ

//文法: @media mediatype and | not | only (メディア機能) ...

HTML でのアンカータグの使用例の共有

アンカータグの使用法:同じドキュメント内の特定の場所にリンクすることをアンカー リンクと呼びます。ア...