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

推薦する

JavaScript での正規表現の使用について詳しく学ぶ

目次1. 正規表現とは何か1. 正規表現の特徴2. 正規表現の使用2. 正規表現における特殊文字1....

CSS ラベルモード表示プロパティの詳細な説明

コードは次のようになります。 <!DOCTYPE html> <html> ...

Linux で boost.python を使用して C++ 動的ライブラリを呼び出す方法

序文最近、C++ 動的ライブラリをテストするためにロボット フレームワークを使い始めました。ロボット...

MySQL 文字列分割操作 (区切り文字を含む文字列のインターセプション)

区切り文字なしの文字列抽出質問の要件データベース内のフィールド値:実装効果: 1行のデータを複数行に...

MySQL ステートメントに一重引用符またはバックスラッシュを含む値を挿入する方法

序文この記事では主に、シングルクォートやバックスラッシュを含む値を挿入するMySQLステートメントに...

1行のコードでLinuxのプロセスを隠す方法を学ぶ

友人たちはいつも、Linux のプロセスを隠す方法を私に尋ねます。私は、どの程度隠したいのか、カーネ...

MySQL 空間データストレージと関数

目次1. データ型1. MySQL空間データとは何か2. GeoJSONとは3. 空間データ型のフォ...

学生情報管理システムを実装するためのJavaScript+HTML

目次1. はじめに2. レンダリング3. コード4. 学生情報管理システムのメインインターフェース1...

MySQL 5.5 の導入に関する問題

MySQL の導入現在、会社ではプラットフォーム運用を通じてMySQLを導入しています。金曜日、プラ...

MySQL を解凍してインストールおよび完全に削除する方法の詳細なグラフィック説明

1. MySQLをインストールする(1)ダウンロードしたMySQLの圧縮ファイルをMySQLをインス...

Windows に MySQL 5.7.18 の解凍バージョンをインストールするチュートリアル

1. インストールプロセスMySQL バージョン: 5.7.18 1. my.ini ファイル(簡易...

React forwardRefの使い方と注意点

これまで react.forwardRef は react の高階コンポーネントには適用できませんで...

JavaScript を使用して動的な QQ 登録ページを作成する

目次1. はじめに1. 基本レイアウト2. 写真を自動的に切り替える3. コンテンツを追加する4. ...

VMware仮想マシンでのLinuxのコピー&ペーストの詳細な説明

1. VMware Workstation 上の Linux: 1. ソースの更新(オプション) v...

HTML テーブル境界コントロールの詳細な説明

上の境界線のみを表示する <table frame=above>下の境界線のみを表示する...