Vue の 4 つのカスタム命令の説明と使用例

Vue の 4 つのカスタム命令の説明と使用例

4つの実用的なVueカスタム指示

1. Vドラッグ

要件: マウスドラッグ要素

アイデア:

要素のオフセット = マウスのスライド後の座標 - マウスが最初に要素をクリックしたときの座標 + 最初のクリック時の表示領域からの要素の上と左の距離。
表示領域を境界として使用し、表示領域内でのドラッグを制限します。 [推奨:「Vue.js チュートリアル」]

コード:

Vue.directive('ドラッグ', {
  挿入(el) {
    ヘッダーをel.querySelector('.dialog_header')にします。
    header.style.cssText += ';cursor:move;'
    header.onmousedown = 関数 (e) {
      //現在の表示領域の幅と高さを取得します。let clientWidth = document.documentElement.clientWidth
      clientHeight = document.documentElement.clientHeight とします。
 
      // 独自の幅と高さを取得します。let elWidth = el.getBoundingClientRect().width
      elHeight = el.getBoundingClientRect().height とします。
 
      //現在の距離表示領域の上端と左端を取得します
      elTop = el.getBoundingClientRect().top とします。
      elLeft = el.getBoundingClientRect().left とします。
 
      //クリック時の座標を取得するlet startX = e.pageX
      startY = e.pageYとします。
 
      document.onmousemove = 関数 (e) {
        //要素のオフセット = マウスのスライド後の座標 - マウスが最初に要素をクリックしたときの座標 + 最初のクリック時の表示領域からの要素の上と左の距離
        moveX = e.pageX - startX + elLeft とします。
        moveY = e.pageY - startY + elTop とします。
 
        // 表示領域を境界として使用し、ドラッグを表示領域内に制限します if ((moveX + elWidth) > clientWidth || moveX < 0 || (moveY + elHeight) > clientHeight || moveY < 0) {
          戻る
        }
 
        el.style.cssText += '上:' + 移動Y + 'px;左:' + 移動X + 'px;'
      }
      document.onmouseup = 関数(){
        ドキュメント.onmousemove = null
        document.onmouseup = null
      }
    }
  }
})

2. v-wordlimit

要件: 背景フィールドには長さの制限があり、中国語と英語を区別します。中国語は 2 バイト、英語は 1 バイトです。したがって、入力ボックスでは入力する文字数を制限し、バイト数を区別し、入力した文字数をエコーする必要があります。

アイデア:

1バイト正規表現 /[\x00-\xff]/g

単語制限を囲む要素を作成し、テキストエリアと入力ボックスに配置します。

入力文字数を計算します。1 バイト文字の場合は enLen、2 バイト文字の場合は cnLen です。これは、後で文字列の切り捨て処理に使用されます。

入力文字数が制限を超えると切り捨てが行われます。substr(0,enLen+cnLen)

インターフェースは入力ボックスの値を更新するか、入力ボックスの値を初期化し、正しいバイト数をエコーする必要がある。

コード:

Vue.directive('wordlimit',{
  バインド(el,バインディング){
    コンソールにログ出力します。
    let { 値 } = バインディング
    Vue.nextTick(() => {
      //入力ボックスがテキストエリアボックスか入力ボックスかを調べる let current = 0
      arr = Array.prototype.slice.call(el.children) とします。
      (i = 0 とします; i < arr.length; i++) {
        if(arr[i].tagName=='TEXTAREA' || arr[i].tagName=='INPUT'){
          電流 = i
        }
      }
   
      //現在の入力ボックスのバイト数を更新します el.children[el.children.length-1].innerHTML = el.children[current].value.replace(/[^\x00-\xff]/g,'**').length +'/'+value//eslint-disable-line
    })
  },
  更新(el,バインディング){
    console.log('更新');
    let { 値 } = バインディング
    Vue.nextTick(() => {
      //入力ボックスがテキストエリアボックスか入力ボックスかを調べる let current = 0
      arr = Array.prototype.slice.call(el.children) とします。
      (i = 0 とします; i < arr.length; i++) {
        if(arr[i].tagName=='TEXTAREA' || arr[i].tagName=='INPUT'){
          電流 = i
        }
      }
   
      //現在の入力ボックスのバイト数を更新します el.children[el.children.length-1].innerHTML = el.children[current].value.replace(/[^\x00-\xff]/g,'**').length +'/'+value//eslint-disable-line
    })
  },
  挿入(el,binding){
    console.log('挿入されました');
    let { 値 } = バインディング
 
    //入力ボックスがテキストエリアボックスか入力ボックスかを調べる let current = 0
    arr = Array.prototype.slice.call(el.children) とします。
    (i = 0 とします; i < arr.length; i++) {
      if(arr[i].tagName=='TEXTAREA' || arr[i].tagName=='INPUT'){
        電流 = i
      }
    }
 
    // 単語制限を囲む要素を作成し、それをテキストエリアと入力ボックスに配置する let div = document.createElement('div')
    if(el.children[current].tagName=='TEXTAREA'){//これはテキストエリアで、右下隅に配置されています div.style = 'color:#909399;position:absolute;font-size:12px;bottom:5px;right:10px;'
    }それ以外{
      styStr = '' とします
      if(!el.classList.contains('is-disabled')){//入力ボックスがグレー表示されていない場合は、背景色を追加します styStr = 'background:#fff;'
      }
      div.style = 'color:#909399;position:absolute;font-size:12px;bottom:2px;right:10px;line-height:28px;height:28px;'+styStr
    }
 
    div.innerHTML = '0/' + 値
    el.appendChild(div)
    el.children[current].style.paddingRight = '60px'
 
    el.oninput = () => {
      val = el.children[current].valueとします
      val = val.replace(/[^\x00-\xff]/g,'**') //eslint 無効行
      // 単語制限ボックスは、el の最後の要素として挿入されます el.children[el.children.length-1].innerHTML = val.length + '/' + value
      if(val.length>値){
        let cnLen = 0 //1バイトワードの数 let enLen = 0 //2バイトワードの数 if(val.match(/[^**]/g) && val.match(/[^**]/g).length){
          enLen = val.match(/[^**]/g).length // バイト内の単語数を計算する // バイトには両方のバイトが含まれる if((value - val.match(/[^**]/g).length)>0){
            cnLen = Math.floor((値 - val.match(/[^**]/g).length)/2)
          }それ以外{
            cnLen = 0
          }
        }else{ //両方のバイトについてenLen = 0
          cnLen = Math.floor(値/2)
        }
 
        if(enLen>値){
          enLen = 値
        }
 
        // バイト数が制限を超えた場合は、 el.children[current].value = el.children[current].value.substr(0,enLen+cnLen) をインターセプトします。
 
        //現在の入力ボックスのバイト数を更新します el.children[el.children.length-1].innerHTML = el.children[current].value.replace(/[^\x00-\xff]/g,'**').length +'/'+value//eslint-disable-line
 
      }
    }
 
  },
})

使用:

<el-input type="textarea" 行数="3" v-wordlimit="20" v-model="値"></el-input>

3. v-アンソール

要件: 要素 (通常はタイトル、サブタイトルなど) をクリックすると、アニメーションが対応するコンテンツ ブロックまでスクロールします。

アイデア:

window.scrollBy を使用したタイマー

IEを考慮しない場合は、window.scrollBy({ top: ,left:0,behavior:'smooth' })を直接使用できます。

コード:

Vue.directive('アンカー',{
  挿入(el,binding){
    let { 値 } = バインディング
    タイマーを null にする
    el.addEventListener('クリック',function(){
      // 現在の要素と表示領域の上端の間の距離 let currentTop = el.getBoundingClientRect().top
      アニメーションスクロール(現在のトップ)
    }、間違い)
     
    関数 animateScroll(currentTop){
      if(タイマー){
        クリアインターバル(タイマー)
      }
      c = 9とする
      タイマー = setInterval(() => {
        c==0の場合{
          クリアインターバル(タイマー)
        }
        ちー
        window.scrollBy(0,(現在のトップ値)/10)
      },16.7)
    }
 
  }
})

使用:

<div class="box" v-anchor="20" style="color:red;">はい</div>

4. v-hasRole

要件: システムの役割に応じて対応する要素を追加または削除する

コード:

Vue.directive('hasRole',{
  挿入(el,binding){
    let { 値 } = バインディング
    roles = JSON.parse(sessionStorage.getItem('userInfo')).roleIds とします。
 
    if(値 && 値インスタンス配列 && 値.length>0){
 
      hasPermission = value.includes(roles) とします。
 
      if(!hasPermission){
        el.parentNode && el.parentNode.removeChild(el)
      }
    }それ以外{
      throw new Error(`命令にバインドされた式を確認してください。正しい形式は v-hasRole="['admin','reviewer']"` などです)
    }
  }
})

以上で、Vue のカスタム命令 4 つについての説明と使用例についての記事は終了です。Vue のカスタム命令 4 つについて、知っておくと便利なものについて詳しく知りたい方は、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続きご覧ください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • vue グローバルカスタム命令とローカルカスタム命令の使用
  • 要素のドラッグを実装するための Vue カスタム命令に関する詳細なコード
  • Vue3のカスタムディレクティブの書き方
  • vue3 カスタムディレクティブの詳細
  • Vueカスタム命令の詳細な説明
  • Vueカスタムディレクティブとその共通フック関数の説明

<<:  いくつかのMySQL更新操作のケース分析

>>:  CSS3 メディアクエリ レスポンシブレイアウト ブートストラップフレームワークの原則と実践の詳細な説明 (推奨)

推薦する

Vueタイマーの詳細な使い方

この記事では、参考までにタイマーを実装するためのVueの具体的なコードを紹介します。具体的な内容は次...

MySQL 完全崩壊: クエリフィルタ条件の詳細な説明

概要実際のビジネス シナリオ アプリケーションでは、ビジネス条件に基づいて対象データを取得およびフィ...

Webフロントエンド開発コース Webフロントエンド開発ツールとは

インターネット技術の発展に伴い、ユーザーはますます Web ページに依存するようになり、Web フロ...

JS ES の新機能、変数分離割り当て

目次1. 配列の分離割り当て1.1 配列分離割り当てとは何ですか? 1.2 配列分離割り当てに失敗し...

Docker コンテナは実行後に終了します (実行を継続する方法)

現象Dockerコンテナを起動する docker run –name [コンテナ名] [コンテナID...

DIV と画像の水平および垂直の中央揃えは複数のブラウザと互換性があります

最初のタイプ: 完全な CSS コントロール、レイヤーフローティング (ログインページに適しています...

Linuxのseqコマンドを使用して数字のシーケンスを生成します(推奨)

Linux の seq コマンドは、数字のリストを非常に高速に生成でき、使いやすく柔軟性に優れてい...

Vueは、サイドナビゲーションバーをタブページに関連付けるサンプルコードを実装します。

目次テクノロジースタック効果分析するテクノロジースタックサイドバー用Antdtabは要素を使用します...

Windows Server 2016 で Flash を有効にする方法

最近、VMware Horizo​​n を導入してテストしましたが、そのコンソールにはデフォルトで ...

MySQL最適化ツール(推奨)

序文今日 GitHub を閲覧していたところ、SQL を最適化および書き換えるための sora とい...

Dockerを使用してOracle_11gをインストールする方法

DockerでOracle_11gをインストールする1. oracle_11gイメージを取得する d...

uniapp エントリーレベル nvue クライミングピット記録の分析

目次序文こんにちは世界画像 境界線の半径を設定する実ピクセルを設定する外部CSSをインポートttfフ...

Windows 10 での MySQL 8.0.20 のインストールと設定方法のグラフィック チュートリアル

Win10システムにMySQL8.0.20をローカルにインストールし、個人的にテストして利用可能であ...

MySQLで関連テーブルを削除する実用的な方法

MySQL データベースでは、テーブルが互いに関連付けられた後は、それらを任意に削除することはできま...

乱数、文字列、日付、検証コード、UUIDを生成するMySQLメソッド

目次乱数を生成する0から1までの乱数を生成する指定された範囲内で乱数を生成します6桁のモバイル認証コ...