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でマクロを使用する方法

言語では、DSL を実装するためにマクロがよく使用されます。マクロを使用すると、開発者は JSX 構...

Element-ui の組み込み 2 つのリモート検索 (ファジークエリ) の使用方法の説明

問題の説明フロントエンドリモート検索やファジークエリと呼ばれる種類のクエリがあります。 Ele.me...

フロントエンド開発者のための HTML 入門

1 HTML入門1.1 初めてのコード体験、最初のウェブページの作成XML/HTML コードコンテン...

MySQLデータベースのストアドプロシージャとトランザクションの違い

トランザクションは、複数の SQL ステートメントの原子性、つまり、それらが一緒に完了するか、一緒に...

MySQL のフィールドにデフォルトの時間を追加する方法

日付型の違いと用途MySQL には、日付、時刻、年、日付時刻、タイムスタンプの 5 つの日付タイプが...

yumコマンドの使い方

1. yumの紹介Yum (フルネームは Yellow dogUpdater、Modified) は...

Dockerデータボリューム操作の実装

データボリュームの使用開始先ほどのケースでは、ホストからコンテナにデータをコピーする必要がある場合、...

MySQL 関数インデックス最適化ソリューション

MySQL を使用する場合、多くの開発者は一部の列に対して関数計算を実行することが多く、その結果、イ...

JavaScript と JQuery フレームワークの基本チュートリアル

目次1. JS オブジェクトDOM –1、機能–2、テスト3. jQuery –1. 概要–2、使用...

MySQL で中国語の文字をピンインでソートする簡単な例

名前を格納するフィールドが GBK 文字セットを使用している場合、GBK 内部コード自体がエンコード...

ウェブサイトのビジュアルデザイン(画像とテキスト)における情報伝達の役割と方法

現代の Web ビジュアル デザインは、初期の情報の積み重ねから、その後のグラフィックスと抽象化、そ...

HarborをベースにしたDocker専用倉庫の構築方法

目次1. ハーバーの紹介1. ハーバーが民間倉庫を建設3. 港湾の維持管理4. Harborユーザー...

ubuntu15.10 での hadoop2.7.2 の詳細なインストールと設定

Linux での Hadoop インストール チュートリアルはインターネットや書籍に多数ありますが、...

Vue ショッピングカートのケーススタディ

目次1. ショッピングカートの例2. コードの実装3. まとめ1. ショッピングカートの例一連の学習...

Vue コンポーネント値転送中のデータ損失の分析と解決

序文前回の記事では、JavaScript の 2 つのデータ型、基本型と参照型、および参照型の浅いコ...