Vue3 はメッセージコンポーネントの例を実装します

Vue3 はメッセージコンポーネントの例を実装します

ほとんどの Web 製品では、グローバル メッセージ コンポーネントの使用シナリオは多岐にわたります。ユーザーへのフィードバック、情報プロンプト、システムとの対話などのシナリオでよく使用されます。従来のコンポーネント記述方法を使用する場合は、コンポーネントをインポートしてコンポーネントに登録し、テンプレートでタグとして呼び出し、カスタム props 属性を渡して、emit を通じてイベントをトリガーする必要があります。このタイプのコンポーネントには、多くの場合、次のような欠点があります。

  • 頻繁に紹介・登録する必要がある
  • コンポーネントをテンプレートのタグとして使用する必要があります
  • コンポーネントのプロパティとステータスを制御するには追加のパラメータが必要です
  • 非友好的なカスタムコンポーネントの取り付け位置は他のコンポーネントの影響を受ける

したがって、Message などのコンポーネントについては、JavaScript で呼び出し、カスタム パラメータを渡してコンポーネントの状態を制御し、呼び出し時に手動でコンポーネントを本体の最後にマウントする必要がないようにしたいと考えています。 ElementUI plus や Ant Design for Vue などの主流のサードパーティ ライブラリを使用したことがある場合は、それらのメッセージ コンポーネント API に精通している必要があります。次に、Vue3 を使用してグローバル メッセージ コンポーネントを実装してみましょう。

コンポーネントの最終的な効果

コンポーネント設計

最終的なコンポーネントAPIの定義

テキスト、成功、エラーなどの API タイプを含むシンプルなメッセージ コンポーネントを実装します。テキストを直接渡すことがサポートされており、コンポーネント固有のオプション構成を通じて、メッセージの内容、終了の遅延、閉じるボタンを表示するかどうかをカスタマイズすることもできます。

// メッセージ タイプ: テキスト、成功、失敗 ["text", "success", "error"]

// メッセージオプション
[文字列]: メッセージの内容 [オブジェクト]: メッセージの構成 // オプションの構成テキスト [文字列] "" メッセージの内容の継続時間 [数値] 0 自動終了の遅延時間 (ミリ秒単位)。0 は自動終了しないことを意味します。close [ブール値] false 閉じるボタンを表示するかどうか // メソッドの呼び出し Message[type](option);

呼び出し例

Message.text("これはメッセージプロンプトです");
メッセージ.error({
    テキスト:「ネットワークエラーです。しばらくしてからもう一度お試しください」
    期間: 3000、
    閉じる: 真
});

コンポーネント構造の定義

コンポーネントの全体構造を保存する Message フォルダーを作成します。src には、コンポーネントのテンプレート、スタイル、インスタンス ファイルが含まれます。同じレベルで、index.js を作成してコンポーネント全体を公開し、プロジェクトやビジネス コンポーネントに導入できるようにします。

|--- メッセージ
 |--- ソース
 | |--- Message.vue // コンポーネント テンプレート| |--- Message.less // コンポーネント スタイル サポートを提供| |--- Message.js // 構成を読み取り、コンポーネント インスタンスをレンダリング| |--- Instance.js // コンポーネント インスタンス|---index.js // コンポーネントを公開

テンプレートとスタイル

テンプレート

テンプレートは比較的シンプルです。外側のレイヤーはアニメーション コンポーネントでラップされ、v-show を使用してメッセージの表示と閉じを制御します。コンテンツには、アイコン、メッセージ テキスト、および構成可能な手動の閉じるボタンが含まれます。

<テンプレート>
  <!-- メッセージリスト-->
  <トランジション名="スライドフェード">
    <div class="メッセージコンテナ" v-show="表示">
      <!-- 目次 -->
      <div class="メッセージコンテンツ">

        <!-- メッセージ タイプのアイコンはメッセージ タイプによって決定され、テキスト タイプではアイコンは構成されません -->
        <div class="message-icon" v-if="config.icon">
          <i :class="config.icon"></i>
        </div>

  <!-- メッセージテキスト -->
        <span v-text="config.content"></span>

        <!-- メッセージを手動で閉じます -->
        <div class="option" v-if="!config.close">
          <i class="ri-close-fill" @click="onClose"></i>
        </div>

      </div>
    </div>
  </トランジション>
</テンプレート>

メッセージアイコン

なお、アイコンはAPI呼び出しでタイプによって決まります。アイコンタイプはインスタンス作成時に決定されます。ここではオープンソースのアイコンライブラリRemix Iconを参照しています。具体的な参照方法はここでは説明しません。アドレスはremixicon.cn/です。

スタイル

Message.less でスタイルとアニメーションを定義します。

@半径: 4px;
@通常の高さ: 34px;

。メッセージ {
  位置: 固定;
  上: 0;
  左: 0;
  幅: 100%;
  テキスト配置: 中央;
  ボックスのサイズ: 境界線ボックス;
  zインデックス: 9999;
  変換: translateZ(9999px);
  パディング上部: 28px;
  遷移: トップ 0.4 秒の緩和;

  .メッセージコンテナ{
    下部マージン: 14px;

    .メッセージアイコン{
      表示: インラインブロック;

      私 {
        フォントサイズ: 18px;
        フォントの太さ: 400;
        上マージン: -3px;
        右マージン: 6px;
        表示: インラインブロック;
        ボックスのサイズ: 境界線ボックス;
        垂直位置合わせ: 中央;
      }

      .ri-チェックボックス-円-塗りつぶし {
        色: #58c05b;
      }

      .ri-close-circle-fill {
        色: #fd4f4d;
      }

    .メッセージコンテンツ{
      表示: インラインブロック;
      パディング: 4px 18px;
      高さ: @normalHeight;
      テキスト配置: 左;
      行の高さ: @normalHeight;
      フォントサイズ: 14px;
      フォントの太さ: 400;
      境界の半径: @radius;
      色: #595959;
      ボックスの影: 0 4px 12px rgba(0, 0, 0, .15);
      背景: #ffffff;

      。オプション {
        表示: インラインブロック;
        ポインタイベント: すべて;
        左マージン: 18px;

        私 {
          フォントサイズ: 18px;
          フォントの太さ: 400;
          上マージン: -3px;
          表示: インラインブロック;
          ボックスのサイズ: 境界線ボックス;
          垂直位置合わせ: 中央;
          カーソル: ポインタ;
          色: #d9d9d9;
          遷移: 色 0.2 秒の緩和;

          &:ホバー{
            色: #ff7c75;
            遷移: 色 0.2 秒の緩和;
          }
        }
      }
    }
  }

  .スライドフェードエンターアクティブ{
    遷移: すべて .2 秒のイーズアウト。
  }

  .スライドフェードアクティブのままにする {
    遷移: すべて .2 秒の緩和;
  }

  .スライドフェードエンターから、
  .スライドフェードアウト{
    変換: translateY(-20px);
    不透明度: 0;
  }
}

コンポーネント スクリプト

コンポーネントでは、渡された config 構成の取得と削除によってレンダリングとアンマウントが実現され、メッセージのオープンと手動クローズは onOpen メソッドと onClose メソッドによって制御されます。具体的なコードは次のとおりです。

<スクリプト>
「vue」から reactive, toRefs をインポートします。
エクスポートデフォルト{
  小道具: {
    config: { type: Object, default: () => {} }, // メッセージ構成項目 remove: { type: Function, default: () => {} }, // マウントコールバックをキャンセル },
  セットアップ(プロパティ) {
    定数状態 = リアクティブ({
      表示: false、
    })

    // メッセージを開く const onOpen = (config) => {
      タイムアウトを設定する(() => {
        状態.visible = true;
      }, 10)

      // 指定された時間後にメッセージを削除します if (config.duration !== 0) {
        タイムアウトを設定する(() => {
          閉じる
        }, config.duration);
      }
    }

    開く(props.config)

    //メッセージを閉じる const onClose = () => {
      状態.visible = false;
      タイムアウトを設定する(() => {
        props.remove()
      }, 200)
    };

    戻る {
      ...toRefs(状態)、
      オープン時、
      閉じる時、
    };
  },
};
</スクリプト>

コンポーネントインスタンスの作成

次に、Instance.js でコンポーネントを呼び出すときに、コンポーネントを作成、マウント、破棄するための API を記述します。ヘッダーでは、Vue のインスタンス作成方法と、上記で記述したコンポーネント テンプレートを導入します。

'vue' から {createApp} をインポートします。
'./Message.vue' からメッセージをインポートします。

メッセージ構成パラメータcfgを受け入れるインスタンス操作メソッドを宣言します。

/**
 * メッセージインスタンス操作 * @param {Object} cfg インスタンス構成 */
const createInstance = cfg => {
 定数config = cfg || {}
 // 1. パッケージ コンテナを作成し、外側の Class 属性とメッセージ数を設定します // 2. インスタンスを作成し、それを本体にマウントします
 
 // 3. マウントをキャンセルし、マウントをキャンセルした後にカウントを再開するメソッドを実装します}
デフォルトのcreateInstanceをエクスポートする

1. ラッパーコンテナを作成し、外側のClassプロパティを設定する

コンポーネントをラップする外部コンテナとしてDIVを作成し、対応するクラス属性を設定します。

messageNode = document.createElement('div') とします。
attr = document.createAttribute("class") とします。
attr.value = "メッセージ"
messageNode.setAttributeNode(属性)

メッセージ数では、メッセージ ポップアップ ボックスの高さを 54 ピクセルと定義します。複数のメッセージがキューに入れられて開かれる場合、上部の値を設定することでコンポーネントがずらされます。

const height = 54 // 単一メッセージボックスの高さ const messageList = document.getElementsByClassName('message')
messageNode.style.top = `${messageList.length * height}px`

2.インスタンスを作成し、本体にマウントする

const app = createApp(メッセージ、{
  設定、
  取り除く() {
    handleRemove()// 要素を削除します。メッセージが閉じられた後、アンマウントして Dom から削除します。}
})

// インスタンスをマウントし、本文の末尾に追加します。app.vm = app.mount(messageNode)
document.body.appendChild(メッセージノード)

アプリを閉じる = () => {
  ハンドル削除()
}

返品アプリ

3.マウントを解除してトップ値をリセットする方法が定義されています

const ハンドル削除 = ()=>{
  app.unmount(メッセージノード)
  document.body.removeChild(メッセージノード)
  リセットメッセージトップ()
 }

const resetMsgTop = () => {
  (i = 0 とします; i < messageList.length; i++) {
    messageList[i].style.top = `${i * height}px`
  }
}

レンダリングインスタンスAPIの実装

Message.js を使用して構成を読み取り、レンダリングします。

'./Instance.js' から createInstance をインポートします。

/**
 * 設定を読み取り、メッセージをレンダリングする
 * @param {Object} typeCfg タイプ設定 * @param {Object/String} cfg カスタム設定 */
関数 renderMsg(typeCfg = {}, cfg = '') {
  // メッセージ コンテンツを直接渡すことができるため、渡される cfg のタイプを決定する必要があります。const isContent = typeof cfg === 'string'

  // カスタム構成を統合します cfg = isContent ? {
    コンテンツ: cfg
  } : cfg

  const config = Object.assign({}, typeCfg, cfg) // 構成をマージする const {
    type = 'text', // メッセージタイプ content = '', // メッセージコンテンツduration = 3000, // 自動終了遅延時間 close = false // 閉じるボタンを表示するかどうか } = config

  // インスタンスを作成する return createInstance({
    タイプ、
    コンテンツ、
    間隔、
    近い
  })
}

テキスト、成功、エラー、その他の API を公開します。

エクスポートデフォルト{
  // プレーンテキストメッセージ text(cfg = "") {
    定数textCfg = {
      タイプ: "テキスト",
      アイコン: ''
    }

    renderMsg(textCfg, cfg) を返します。
  },
  // 成功プロンプト success(cfg = "") {
    定数成功構成 = {
      タイプ: "成功",
      アイコン: 'ri-checkbox-circle-fill'
    }

    renderMsg(successCfg, cfg) を返します。
  },
  // エラーメッセージ error(cfg = "") {
    定数エラー構成 = {
      タイプ: "エラー",
      アイコン: 'ri-close-circle-fill'
    }

    renderMsg(errorCfg, cfg) を返します。
  },
}

最後に、このコンポーネントを最も外側の index.js で開いて呼び出します。

'./src/Message.js' からメッセージをインポートします。

デフォルトメッセージをエクスポートします。

Vue3 の Message コンポーネント実装例に関するこの記事はこれで終わりです。Vue3 Message コンポーネントの関連コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vue3 手動カプセル化ポップアップ ボックス コンポーネント メッセージ メソッド
  • Vue3カプセル化メッセージメッセージプロンプトインスタンス関数の詳細な説明
  • vue をベースにしたグローバルメッセージコンポーネントを作成する
  • Vue での el-message のカプセル化と使用

<<:  あるテーブルのデータの列を別のテーブルの列にコピーするMySQLメソッド

>>:  Linux で起動時にプログラムを自動的に実行させる最も簡単な方法

推薦する

この記事では、6つの負荷分散技術の実装方法をまとめます(要約)

ロード バランシングは、サーバー クラスタの展開でよく使用されるデバイスです。マシンのパフォーマンス...

テキストエリアの残りの単語数を動的に取得する方法

仕事で、これまで一度も書いたことのないケースに遭遇しました。午後の半分をその作業に費やし、ついに書き...

Linuxの相対パスと絶対パスの使用

01. 概要絶対パスと相対パスはシェル環境でよく使用され、それぞれに独自の用途があります。相対パスの...

Ubuntu 18.04 システムでの Redis および phpredis 拡張機能のインストールと設定の詳細な説明

この記事では、Ubuntu 18.04 に Redis と phpredis 拡張機能をインストール...

Nginx の負荷分散アルゴリズムとフェイルオーバー分析

概要Nginx ロード バランシングは、アップストリーム サーバー (実際のビジネス ロジックによっ...

MySQL の起動オプションとシステム変数の例の詳細な説明

目次ブートオプションコマンドラインパラメータの長い形式と短い形式設定ファイル構成グループシステム変数...

MySQL のクラスター化インデックスとクラスター化インデックスの成長の仕組みを理解する

このノートでは、 MySQL の B+Tree インデックスとは何ですか?クラスター化インデックスは...

MySQLはSQL文を使用してテーブル名を変更します

MySQL では、SQL ステートメント rename table を使用してテーブル名を変更できま...

フレックスとポジションの互換性の詳細な説明マイニングノート

今日は、すべてのブラウザ (主に IE 9 以上と Chrome) と互換性のある自分のホームページ...

Javascript のスコープとクロージャの詳細

目次1. 範囲2. スコープチェーン3. 語彙の範囲5. 閉鎖の適用6. クロージャの欠陥7. 閉会...

HTML でフォントの色を設定する方法と、PS を使用して HTML で正確なフォントの色を取得する方法

1. HTMLフォントカラー設定HTML では、フォント タグを使用してフォント コンテンツの色を設...

Docker はキューとタスクのスケジューリングを実現するために Laravel アプリケーションをデプロイします

前回の記事では、Docker を使用して Laravel アプリケーションをデプロイする方法について...

入力テキストボックスの入力実装プロパティを無効にする

今日は、開発でよく使われる、非常に便利な HTML タグをいくつかまとめてみたいと思います。これらの...

Docker を使用した MySQL のデプロイの詳細説明 (データ永続化)

この記事では、Docker を使用して MySQL をデプロイし、データを保持する方法について簡単に...