4つの実用的なVueカスタム指示 1. Vドラッグ要件: マウスドラッグ要素 アイデア: 要素のオフセット = マウスのスライド後の座標 - マウスが最初に要素をクリックしたときの座標 + 最初のクリック時の表示領域からの要素の上と左の距離。 コード: 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 をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
>>: CSS3 メディアクエリ レスポンシブレイアウト ブートストラップフレームワークの原則と実践の詳細な説明 (推奨)
言語では、DSL を実装するためにマクロがよく使用されます。マクロを使用すると、開発者は JSX 構...
問題の説明フロントエンドリモート検索やファジークエリと呼ばれる種類のクエリがあります。 Ele.me...
1 HTML入門1.1 初めてのコード体験、最初のウェブページの作成XML/HTML コードコンテン...
トランザクションは、複数の SQL ステートメントの原子性、つまり、それらが一緒に完了するか、一緒に...
日付型の違いと用途MySQL には、日付、時刻、年、日付時刻、タイムスタンプの 5 つの日付タイプが...
1. yumの紹介Yum (フルネームは Yellow dogUpdater、Modified) は...
データボリュームの使用開始先ほどのケースでは、ホストからコンテナにデータをコピーする必要がある場合、...
MySQL を使用する場合、多くの開発者は一部の列に対して関数計算を実行することが多く、その結果、イ...
目次1. JS オブジェクトDOM –1、機能–2、テスト3. jQuery –1. 概要–2、使用...
名前を格納するフィールドが GBK 文字セットを使用している場合、GBK 内部コード自体がエンコード...
現代の Web ビジュアル デザインは、初期の情報の積み重ねから、その後のグラフィックスと抽象化、そ...
目次1. ハーバーの紹介1. ハーバーが民間倉庫を建設3. 港湾の維持管理4. Harborユーザー...
Linux での Hadoop インストール チュートリアルはインターネットや書籍に多数ありますが、...
目次1. ショッピングカートの例2. コードの実装3. まとめ1. ショッピングカートの例一連の学習...
序文前回の記事では、JavaScript の 2 つのデータ型、基本型と参照型、および参照型の浅いコ...