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 メディアクエリ レスポンシブレイアウト ブートストラップフレームワークの原則と実践の詳細な説明 (推奨)
この記事では、参考までにタイマーを実装するためのVueの具体的なコードを紹介します。具体的な内容は次...
概要実際のビジネス シナリオ アプリケーションでは、ビジネス条件に基づいて対象データを取得およびフィ...
インターネット技術の発展に伴い、ユーザーはますます Web ページに依存するようになり、Web フロ...
目次1. 配列の分離割り当て1.1 配列分離割り当てとは何ですか? 1.2 配列分離割り当てに失敗し...
現象Dockerコンテナを起動する docker run –name [コンテナ名] [コンテナID...
最初のタイプ: 完全な CSS コントロール、レイヤーフローティング (ログインページに適しています...
Linux の seq コマンドは、数字のリストを非常に高速に生成でき、使いやすく柔軟性に優れてい...
目次テクノロジースタック効果分析するテクノロジースタックサイドバー用Antdtabは要素を使用します...
最近、VMware Horizon を導入してテストしましたが、そのコンソールにはデフォルトで ...
序文今日 GitHub を閲覧していたところ、SQL を最適化および書き換えるための sora とい...
DockerでOracle_11gをインストールする1. oracle_11gイメージを取得する d...
目次序文こんにちは世界画像 境界線の半径を設定する実ピクセルを設定する外部CSSをインポートttfフ...
Win10システムにMySQL8.0.20をローカルにインストールし、個人的にテストして利用可能であ...
MySQL データベースでは、テーブルが互いに関連付けられた後は、それらを任意に削除することはできま...
目次乱数を生成する0から1までの乱数を生成する指定された範囲内で乱数を生成します6桁のモバイル認証コ...