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 で起動時にプログラムを自動的に実行させる最も簡単な方法

推薦する

Navicatを使ってMySQLを操作する方法

目次序文: 1. Navicatの紹介2. シンプルなチュートリアルの共有接続管理ライブラリテーブル...

Vue でユーザー権限に基づいてルートを動的に追加する方法

ユーザーの権限に応じて異なるメニュー ページを表示します。知識ポイントルートガード(事前ガードを使用...

HTML テーブル タグ チュートリアル (31): セルの幅と高さの属性 WIDTH、HEIGHT

デフォルトでは、セルの幅と高さはコンテンツに応じて自動的に調整されますが、セルの幅と高さを手動で設定...

MySQL、Oracle、SQL Server のページングクエリ例の分析

最近、Oracle、MySQL、SQL Server 2005 のデータ ページング クエリについて...

この記事はPReact10.5.13のソースコードを理解するのに役立ちます

目次render.js 部分create-context.js 部分差分部分Reactのソースコード...

mysql-canal-rabbitmq のインストールと展開の非常に詳細なチュートリアル

目次1.1. MySQL binlog を有効にする1.2. RabbitMQ の交換とキューを構成...

Nginx の場所に関する一般的なルールの優先順位の問題

目次1. 場所/マッチング2. 場所 = / 一致Locaitonには、完全一致(=)、プレフィック...

フロントエンドJavaScriptは関数のカリー化を完全に理解している

目次1. カレーとは何か2. カレーの用途3. カリー化ユーティリティ関数をカプセル化する方法 1....

Dockerイメージ内のファイルを表示する方法

Dockerイメージ内のファイルを表示する方法1. すでに実行中の場合すでに実行中のイメージについて...

MySQL PXC は IST 送信のみで新しいノードを構築します (推奨)

需要シナリオ: 既存の PXC 環境には大量のデータがあります。新しく購入したサーバーをこのクラスタ...

ソースコードから、Vue2がデータとメソッドを直接取得できる理由がわかる

目次1. 例: これはデータとメソッドを直接取得できます2. 環境を準備し、ソースコードをデバッグし...

MYSQLでリモートアクセス権限を有効にする方法

1. MySQLデータベースにログインするmysql -u ルート -pユーザーテーブルを表示する ...

MySQLデータベースインデックスの詳細な説明

目次1. MySQLインデックスの紹介2. MySQLの5種類のインデックスの詳しい説明1. 総合索...

Linux で実行中のバックグラウンド プログラムを表示および終了する方法

Linux タスク管理 - バックグラウンド実行と終了fg、bg、ジョブ、&、ctrl + ...

HTML 縦列表示テキストを使用してテキストを縦列で表示します

コードをコピーコードは次のとおりです。 <span style='display:bl...