ほとんどの 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 をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: あるテーブルのデータの列を別のテーブルの列にコピーするMySQLメソッド
>>: Linux で起動時にプログラムを自動的に実行させる最も簡単な方法
目次序文: 1. Navicatの紹介2. シンプルなチュートリアルの共有接続管理ライブラリテーブル...
ユーザーの権限に応じて異なるメニュー ページを表示します。知識ポイントルートガード(事前ガードを使用...
デフォルトでは、セルの幅と高さはコンテンツに応じて自動的に調整されますが、セルの幅と高さを手動で設定...
最近、Oracle、MySQL、SQL Server 2005 のデータ ページング クエリについて...
目次render.js 部分create-context.js 部分差分部分Reactのソースコード...
目次1.1. MySQL binlog を有効にする1.2. RabbitMQ の交換とキューを構成...
目次1. 場所/マッチング2. 場所 = / 一致Locaitonには、完全一致(=)、プレフィック...
目次1. カレーとは何か2. カレーの用途3. カリー化ユーティリティ関数をカプセル化する方法 1....
Dockerイメージ内のファイルを表示する方法1. すでに実行中の場合すでに実行中のイメージについて...
需要シナリオ: 既存の PXC 環境には大量のデータがあります。新しく購入したサーバーをこのクラスタ...
目次1. 例: これはデータとメソッドを直接取得できます2. 環境を準備し、ソースコードをデバッグし...
1. MySQLデータベースにログインするmysql -u ルート -pユーザーテーブルを表示する ...
目次1. MySQLインデックスの紹介2. MySQLの5種類のインデックスの詳しい説明1. 総合索...
Linux タスク管理 - バックグラウンド実行と終了fg、bg、ジョブ、&、ctrl + ...
コードをコピーコードは次のとおりです。 <span style='display:bl...