Vue ベースの要素ボタン権限実装ソリューション

Vue ベースの要素ボタン権限実装ソリューション

背景要件: ERP システムに「ボタン権限制御」機能を追加する必要があり、権限の制御粒度をボタン レベルまで拡張する必要があります。

期待される

ボタンの権限制御には、「非表示」と「表示されるがクリックできない」の 2 つの対話型モードがあります。

見えない

非表示のインタラクション方法は比較的簡単です。v-if を使用して、表示するかどうかを制御できます。 v-show を使用することもできますが、安全性が十分ではありません。結局のところ、v-show はスタイルを display: none に変更するだけで、実際の DOM レンダリングには依然として存在するため、非表示を制御するには v-if を使用することをお勧めします。

表示されているがクリックできない

「見えるけど、見えない。」

  • スタイル コントロール (無効なスタイルを追加する必要があります)、たとえば、カーソル: 許可しない、グレー表示など。
  • クリックできない、つまりクリック イベントを無効にしたりブロックしたりするには、preventDefault/stopProgration でこれを実現できるようです。

最終的な製品要件では、「表示されるがクリックできない」が選択されましたが、これはおそらく、非表示では単純すぎると考えられたためでしょう。 (¬_¬)

アイデアの探索

  • ボタン クリック イベントのコールバック関数にラッパー関数を追加して、その権限を制御し、イベントをインターセプトしてトリガーします。これは、高階コンポーネントに少し似たプロキシを作成するようなものです (ただし、既存のビジネスが大きく変更され、各 @click バインディング関数を 1 つずつ変更する必要があるため、このソリューションは放棄されます)。
  • ボタンクリックイベントがバブリングしてトリガーされるのを防ぐには、preventDefautl/stopProgration を使用できるようです。イベントは、命令の形式で DOM 要素上で監視できるようです。許可されている場合はイベントが正常に実行され、そうでない場合はブロックされます。

練習計画

最終的に、既存のビジネス コード ロジックの変更を避けながら、コストを最小限に抑えて拡張できる指示方法を選択しました。
権限制御のためにクリックハイジャックが必要な要素:

  • エルボタン
  • btn-wrapper (自己カプセル化コンポーネント)
  • div/span/aなどのタグ

具体的な実施計画については以下をご覧ください。

権限エントリ: Vuex コントロール、グローバル使用

//ユーザーがログインしたら、ユーザーの権限CODEコードを取得し、ストアに保存します
this.$store.commit('SET_AUTH_CODE', authCodeList);

SET_AUTH_CODE: (状態、acthCode) => {
 if (acthコード) {
   状態.autoCodeList = acthCode;
 }
 ストアを設定する({
  名前: 'autoCodeList',
  コンテンツ: state.autoCodeList || [],
 });
}

権限指示の定義

constdisableClickFn = (イベント) => {
  イベント && event.stopImmediatePropagation();
}

エクスポートconsthasPermission = () => {
  Vue.directive('permission', {
    bind(el, バインディング) {
      無効化 = true にします。
      autoCodeList.length と autoCodeList.includes(binding.value) の場合 {
        無効 = false;
      }

      (無効)の場合{
        el.classList.add('権限が無効');
        el.setAttribute('無効', '無効');
        el.addEventListener('click', disabledClickFn, true);
      }
    },
    アンバインド(el) {
      el.removeEventListener('click'、disableClickFn);
    }
  });
};

  • まず、キャプチャ フェーズ中にトリガーするために addEventListener の 3 番目のパラメーターで useCapture を true として使用します。そのため、ここでのイベント リスナーは @click よりも優先され、コールバックがトリガーされます。
  • 次に、stopImmediatePropagation は、イベントのバブリングと同じイベントの他のリスナーのトリガーを防ぐために使用されます。

同じ要素の同じイベント タイプに複数のイベント リスナーがアタッチされている場合、イベントがトリガーされたときに追加された順序でイベント リスナーが呼び出されます。いずれかのイベント リスナーで stopImmediatePropagation() を呼び出すと、残りのイベント リスナーは呼び出されません。 MSDN - stopImmediatePropagation

無効なCSSスタイルを追加する

.権限が無効{
  位置: 相対的;
  カーソル: 許可されていません !important;
  point-events: none; // 要素がマウスイベントを受け取らないようにします border:none;
  背景画像: なし;
  &::後 {
    コンテンツ: '';
    位置: 絶対;
    下部: 0;
    左: 0px;
    右: 0px;
    高さ: 100%;
    zインデックス: 9;
    背景: rgba(255, 255, 255, 0.5);
  }
}

ここでは、比較的馴染みのない CSS プロパティである、pointer-events が使用されています。

CSS3 のポインター イベント プロパティは、特定のグラフィック要素がどのような状況で (ある場合) マウス イベントのターゲットになることができるかを指定します。 詳しい使用方法については、MSDN - ポインター イベントを参照してください。

ここでのポインター イベントの使用は、補助的な機能にすぎません。必ずしも、要素のイベント リスナーがトリガーされないことを意味するわけではありません。子孫要素にポインター イベントが指定されていて、イベント ターゲットになることが許可されている場合は、親要素のイベントをトリガーできます。また、クリックしないように制御するために CSS プロパティのみに依存するのは依然としてリスクがあるため、ここでは補助的な目的でのみ使用されます。

グローバル「権限判定」ツール機能

'@/util/store' から getStore をインポートします。
const autoCodeList = getStore({ name: 'autoCodeList', }) || [];

エクスポート関数hasPermission(authName) {
  戻り値 !(autoCodeList.length > 0 && autoCodeList.includes(authName));
}

特定の用途

// コマンドメソッド (ここでの oms/order/save は、ユーザーがログインするときの CODE 権限コードに対応します)
<el-button v-permission="'oms:order:save'">保存</el-button>

// 関数メソッド <el-button :disabled="hasPermission('oms:order:save')"></el-button>

Vue ベースの要素ボタン権限の実装に関するこの記事はこれで終わりです。より関連性の高い要素ボタン権限については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vue+elementUI コンポーネントは、折りたたみ可能な動的レンダリングのマルチレベル サイドバー ナビゲーションを再帰的に実装します。
  • プレーヤー機能を実現するためのvue + element uiのサンプルコード
  • Vue要素のバックグラウンド認証プロセスの分析
  • Vue+element+oss はフロントエンドのフラグメントアップロードとブレークポイント再開を実現します
  • 要素 DateTimePicker+vue ポップアップボックスに時間のみが表示される問題を解決する
  • VueはElementUIのフォームサンプルコードを模倣する
  • Vueを使用してツリーコンポーネントを実装する例
  • ツリーコントロールを使用した Vue+iview の具体的な使用法
  • Vue での編集可能なツリー テーブルの実装コード
  • Vue Element フロントエンドアプリケーション開発ツリーリストコンポーネント

<<:  権限の問題によりMySQLの設定ファイルmy.cnfを起動できない問題の解決方法

>>:  MySQL マスタースレーブレプリケーションの読み書き分離構造の詳細な説明

推薦する

Nginx 仮想ホストの詳細な分析

目次1. 仮想ホスト1.1 仮想ホストの概念1.2 仮想ホストタイプ2. IP仮想ホストに基づく2....

XHTML チュートリアル: Transitional と Strict の違い

実際、XHTML 1.0 は、Transitional DOCTYPE と Strict DOCTY...

MySql で、存在しない場合は挿入し、存在する場合は更新する方法

まとめシナリオによっては、レコードがない場合は挿入し、レコードがある場合は更新するという要件がある場...

CSS -webkit-box-orient: コンパイル後に垂直プロパティが失われる

1. 原因要件は 2 行を表示することであり、余分なテキストは 3 つのドットに置き換えられるため、...

Linux の非常に詳細な gcc アップグレード プロセス

目次序文1. 現在のgccバージョン2. gccをインストールする3.gmpのインストール4.MPF...

Element UI をインストールして vue3.0 でベクター グラフィックスを使用する方法

ここでは、v3 のインストールと使用にのみ焦点を当てます。v2 について学びたい場合は、公式 Web...

Docker クロスホストネットワークの実装 (手動)

1. Macvlan の紹介Macvlan が登場する前は、イーサネット カードに複数の IP ア...

VMware 仮想マシンのインストール Apple Mac OS の超詳細なチュートリアル

目次要約する仕事の都合で Apple の Mac OS に対応するソフトウェアをインストールする必要...

JavaScriptを使って動的にテーブルを生成するケースの詳しい説明

目次序文実装のアイデア実装コード成果を達成する序文これは、テーブルを動的に追加する例です。[追加] ...

Dockerはローカルディレクトリとデータボリュームコンテナ操作をマウントします

1. DockerはローカルディレクトリをマウントしますDocker は、ホスト上のディレクトリをイ...

MySQL 8.0.22 の最新バージョンのダウンロードとインストールの超詳細なチュートリアル (Windows 64 ビット)

目次序文1. 公式サイトからMySQL 8.0.22をダウンロードする2. 環境変数を設定する3. ...

HTMLシールドの右クリックメニューと左クリック入力機能の例

右クリックメニューを無効にする <body oncontextmenu=self.event....

CSSメディアクエリのアスペクト比を小さくする方法

CSS メディア クエリには非常に便利なアスペクト比、aspect-ratio があり、幅と高さを直...

JSはプログレスバーのスムーズバージョンの詳細な計画を実装します

進捗バーがスムーズではないフロントエンドを学ぶ学生のほとんどは、オーディオプレーヤーやビデオプレーヤ...

Centos7 で yum を使用して Mysql5.7.19 をインストールする詳細な手順

Centos7 の yum ソースには、mysql の代わりに mariaDB が使用されているため...