Vueプロジェクトでコンポーネントをカプセル化する簡単な手順

Vueプロジェクトでコンポーネントをカプセル化する簡単な手順

序文

ビジネスが発展するにつれて、機能開発だけではフロントエンドのニーズを満たすことができなくなります。この記事では主に、独自のコンポーネント ライブラリを開発する方法を説明します。

使用シナリオ: 内部コンポーネントライブラリの開発、個人用コンポーネントライブラリの開発、プロジェクトからの分離、複数のプロジェクトで同じコンポーネントを使用する、1セットのコンポーネントライブラリのみを維持する必要がある

Toastコンポーネントをカプセル化する方法

コンポーネントの説明:

プロンプト機能を実装します。

エフェクト表示:

実装された機能:

  • 特定の判定条件に基づいて、またはボタンをクリックすると、ポップアップウィンドウがポップアップします。
  • 位置、タイプ、スタイル名などを設定可能。

ユースケース

1. 使いやすい

vm.$toast('ネットワーク異常!')

2. オプションパラメータを使用する

* メッセージ: プロンプト情報の内容 * 期間: 滞在時間 (ミリ秒単位) * 位置: 表示位置: 上、中、下
* className スタイル名 vm.$toast({
    メッセージ: 'ネットワーク異常! '、
    期間: 2000,
    位置: '中央'、
    クラス名: 'big'
})

3. エラーメッセージ

vm.$トースト({
    メッセージ: '認証コードエラー! '、
    期間: 2000,
    タイプ: 'エラー'
})

具体的な実装

最初の toast.vue

<テンプレート>
    <トランジション名="トーストポップ">
        <div v-show="visible" class="toast" :class="customClass" @click="handleClose">
            <span class="text">{{メッセージ}}</span>
        </div>
    </トランジション>
</テンプレート>

<スクリプト>
    エクスポートデフォルト{
        名前:「トースト」
        小道具: {
            message: String, // プロンプト情報の内容 className: { // スタイル名 type: String,
                デフォルト: ''
            },
            position: { // 位置: 上、中央、下
                タイプ: 文字列、
                デフォルト: 'middle'
            },
            type: { // プロンプトタイプ: 通常、エラー
                タイプ: 文字列、
                デフォルト: '通常'
            }
        },
        データ () {
            戻る {
                // 表示するかどうか: false
            }
        },
        計算: {
            // スタイルを取得する customClass() {
                クラスを [] にする
                classes.push('toast-' + this.type)
                スイッチ (this.position) {
                    ケース 'top':
                        クラス.push('is-placetop')
                        壊す
                    ケース「下」:
                        クラス.push('is-placebottom')
                        壊す
                    デフォルト:
                        クラス.push('is-placemiddle')
                }
                this.className && classes.push(this.className)
                戻りクラス
            }
        },
        メソッド: {
            ハンドルクローズ() {
                this.$emit('close')
            }
        }
    }

</スクリプト>

<style lang="scss" スコープ px2rem="false">
    .トースト{
        位置: 固定;
        ボックスのサイズ: 境界線ボックス;
        最小幅: 200px;
        最大幅: 50%;
        最大高さ: 85%;
        上マージン: 0;
        パディング: 18px 30px;
        境界線の半径: 10px;
        背景: rgba(0, 0, 0, 0.7);
        色: #fff;
        テキスト配置: 中央;
        オーバーフロー-y: 自動;
        zインデックス: 2000;
        。文章 {
            表示: ブロック;
            フォントサイズ: 16px;
            行の高さ: 1.5;
            テキスト配置: 中央;
            単語折り返し: 単語を区切る;
        }
    }

    .is-placetop {
        上: 50px;
        左: 50%;
        変換: translate(-50%, 0);
    }
    .is-placemiddle {
        上位: 50%;
        左: 50%;
        変換: translate(-50%, -50%);
    }
    .is-placebottom {
        下: 50px;
        左: 50%;
        変換: translate(-50%, 0);
    }
    .is-placetop.toast-pop-enter-active、.is-placetop.toast-pop-leave-active、
    .is-placemiddle.toast-pop-enter-active、.is-placemiddle.toast-pop-leave-active {
        遷移: 不透明度 .3 秒線形、マージン上部 .3 秒イーズ;
    }

    .is-placetop.toast-pop-enter、.is-placetop.toast-pop-leave-to、
    .is-placemiddle.toast-pop-enter、.is-placemiddle.toast-pop-leave-to {
        上マージン: 30px;
        不透明度: 0;
    }
    .is-placebottom.toast-pop-enter-active、.is-placebottom.toast-pop-leave-active {
        遷移: 不透明度 .3 秒線形、マージン下部 .3 秒イーズ;
    }

    .is-placebottom.toast-pop-enter、.is-placebottom.toast-pop-leave-to {
        下マージン: -30px;
        不透明度: 0;
    }
    .トーストエラー{
        背景: rgba(255,102,104,.9);
    }
</スタイル>

トーストプラグイン

'vue' から Vue をインポートします
'./toast.vue' から Toast をインポートします。

// トーストコンストラクタ const ToastConstructor = Vue.extend({
    拡張: トースト
})

// トーストインスタンスプール let toastPool = []

/** トーストインスタンスを取得します (インスタンスプールにインスタンスがある場合はプールから取得し、ない場合は新しいインスタンスを作成します) */
getInstance = () => {
    // コンソールログ('トーストプール:', トーストプール)
    トーストプールの長さが0より大きい場合
        toastPool.shift() を返す
    }
    新しい ToastConstructor を返します({
        el: document.createElement('div')
    })
}

/** インスタンスをインスタンスプールに返します */
returnInstance = インスタンス => {
    if (インスタンス) {
        toastPool.push(インスタンス)
        // console.log('インスタンスを返します:', インスタンス, toastPool)
    }
}

/** ドキュメントからトーストの DOM ノードを削除します*/
関数removeDom(イベント){
    イベントターゲットの親ノードの場合
        イベントターゲットの親ノードの子ノードを削除します。
    }
}

// 閉じる ToastConstructor.prototype.close = function () {
    this.visible = false // 非表示 this.closed = true // 閉じた状態 this.$el.addEventListener('transitionend', removeDom) // アニメーションが完了したら DOM ノードを削除します returnInstance(this) // インスタンス オブジェクトはインスタンス プールに返され、インスタンスを再利用できます }

// トーストプロンプト情報を表示するエクスポートデフォルト関数 (オプション = {}) {
    // 表示時間、デフォルトは3秒です。letduration = options.duration || 3000
    インスタンス = getInstance() とする
    // console.log('instance=', インスタンス)
    // 表示タイプ instance.type = options.type || 'normal'
    // コンテンツを表示 instance.message = typeof options === 'string' ? options : options.message
    // 表示位置: 上、中央、下
    インスタンス.位置 = オプション.位置 || '中央'
    インスタンス.className = オプション.className || ''
    // アニメーション完了イベントを削除しますinstance.$el.removeEventListener('transitionend', removeDom)
    インスタンス.$on('close', () => {
        インスタンスを閉じる()
    })
    // console.log('instance.$el=', インスタンス.$el)
    // ドキュメントにノードを追加します document.body.appendChild(instance.$el)
    インスタンス.visible = true
    インスタンスが閉じている = false

    // タイマーをクリアします。instance.timer && clearTimeout(instance.timer)
    // タイマーを設定してトーストを閉じる
    インスタンス.timer = setTimeout(() => {
        // console.log('close', インスタンス)
        !instance.closed && instance.close()
        インスタンスタイマー = null
    }、 間隔)
}

メイン.js

'./plugins/toastPlugin.js' から ToastPlugin をインポートします。

// トーストプロンプト情報プラグイン Vue.use(ToastPlugin)

要約する

これで、Vue プロジェクトでのコンポーネントのカプセル化に関するこの記事は終了です。Vue プロジェクトのカプセル化コンポーネントに関する関連コンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vuejs ページの地域化とコンポーネントのカプセル化の実装
  • Vue2.0 カスタムコンポーネント方式(Vueコンポーネントのカプセル化)
  • Vueカプセル化コンポーネントjsバージョンの基本手順

<<:  Dockerコンテナ内にkibanaトークナイザーをインストールする方法

>>:  CentOS8 で MySQL 8.0 をインストールしてデプロイする方法

推薦する

Vue.jsで実装されたカレンダープラグインの使い方を詳しく説明します

本日実装する機能は、以下の機能です。vue.js シミュレーションカレンダープラグインさて、もう無駄...

Vueカスタムテーブル列実装プロセス記録

目次序文レンダリングsetTable コンポーネント使用結論序文フォームを使用して PC 側のプロジ...

Docker イメージのエクスポート、インポート、コピーの例の分析

最初の解決策は、イメージを公開イメージリポジトリにプッシュし、それをプルダウンすることです。 2 番...

TypeScript 環境を構築して VSCode にデプロイする詳細な手順

目次TypeScript環境の構築ステップ1: Taobaoミラーをダウンロードするステップ2: T...

Apache クロスドメイン リソース アクセス エラーの解決策

多くの場合、大規模および中規模の Web サイトでは、静的リソース (フォント ファイル、画像など)...

メモリ構成が過剰でMySQLが起動できない問題の解決方法

問題の説明MySQL の起動時にエラーが報告されます。エラー ログを確認してください。 [エラー] ...

Vue+thinkphp5.1+axiosでファイルアップロードを実現

この記事では、thinkphp5.1 + Vue+axiosを使用してファイルをアップロードする方法...

Vuexの補助関数の使い方

目次マップ状態マップゲッターマップミューテーションマップアクション複数のモジュールマップ状態 ...

VMware のインストールと使用時の問題と解決策

仮想マシンは使用中であるか、接続できません次のようなエラーが報告された場合解決まずこのページにアクセ...

セマンティックウェブページ XHTML セマンティックマークアップ

構造とプレゼンテーションを分離するもう 1 つの重要な側面は、セマンティック マークアップを使用して...

VMware 仮想マシンのインストール CentOS 8 (1905) システム チュートリアル ダイアグラム

世界的に有名な仮想マシン ソフトウェア VMware-workstation-full-15.5.0...

MySQL における := と = の違いをグラフィカルに紹介

:= と = の違い=設定および更新の場合にのみ、:= と同じ効果、つまり代入効果があり、それ以外の...

JavaScript キャンバスでカラフルな太陽のハロー効果を実現

この記事では、カラフルな太陽のハロー効果を実現するためのJavaScriptキャンバスの具体的なコー...

CentOS 7 で MySQL 接続数が 214 に制限される問題の解決方法

問題を見つける最近、プロジェクトで問題が発生しました。接続が多すぎるため、「接続が多すぎます」という...

MySQL データベースの集計クエリと結合クエリ操作

目次1. クエリ結果を挿入する2. 集計クエリ2.1 はじめに2.2 集計関数2.3 group b...