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

推薦する

nginx を使用して同じドメイン名で複数の Vue プロジェクトをデプロイし、リバース プロキシを使用する方法

効果現在、プロジェクトは2つ(project1、project2)あり、nginxに付属するinde...

Linux でリモートから MySQL を自動的にバックアップする方法

序文:基本的に、自社で使用する場合でも、顧客向けにサーバーを展開する場合でも、MySQL のバックア...

Linux ssh サーバーの構成コード例

LinuxホストにSSHサーバーをインストールするには、次のターミナルコマンドを使用します: sud...

JavaScriptとTypeScriptの関係

目次1. JavaScript とは何ですか? 2. JavaScript は何に使用されますか? ...

Vue で動的に読み込まれたローカル画像を処理する方法

問題を見つける今日は、vue ファイルにローカル画像を導入する際に問題が発生したので、この記事を書き...

TOM.COMのホームページリニューアルの経験

<br />何の警告もなく、cnBeta で TOM.COM の Web サイトが再設計...

パーティショニングを使用して数十億のデータに対する MySQL データ処理を最適化する方法

MySQL が数千万のデータをクエリする場合、ほとんどのクエリ最適化の問題はインデックスを通じて解決...

UbuntuにMySQLをインストールするときにデフォルトのパスワードを変更する詳細な手順

ステップ1: ディレクトリに入ります: cd /etc/mysql、debian.cnfファイルを表...

Ubuntu の空き容量を増やす 5 つの簡単な方法

序文ほとんどの人は、システム ディスク ストレージが少ないときにこの操作を実行するか、Linux シ...

MySQLクエリのパフォーマンスを分析する方法

目次スロークエリの基礎: データ取得の最適化データベースから不要なデータが要求されていないか確認する...

Vue Element Sortablejs を使用してテーブル列をドラッグする詳細な説明

1. css: ドラッグテーブル.css @charset "UTF-8"; ....

grpc のリバース プロキシとして nginx を使用する場合の落とし穴の概要

背景ご存知のとおり、nginx は高性能な Web サーバーであり、負荷分散やリバース プロキシによ...

MySQLデータベースのトランザクションとインデックスの詳細な説明

目次1. 事務:取引の 4 つの主な特徴:同時トランザクションはどのような問題を引き起こしますか? ...

HTML 学習ノート - HTML 構文の詳細な説明 (必読)

1. HTML マークアップ言語とは何ですか? HTML は、Web ページの情報を表すマークアッ...

vueの実践的な応用におけるvuexの永続性の詳細な説明

目次vuex 永続性要約するvuex 永続性vuex: ブラウザを更新すると、vuexの状態は初期状...