1. カスタム指示とは何ですか?v- で始まるインライン属性はすべて命令です。異なる命令によって、異なる機能を完了または実装し、通常の DOM 要素に対して低レベルの操作を実行できます。これは、カスタム命令が使用されるときです。コア関数 (v-model および v-show) のデフォルトの組み込み命令に加えて、Vue ではカスタム命令を登録することもできます。 このコマンドを使用する方法はいくつかあります。 // コマンドをインスタンス化しますが、このコマンドにはパラメータ `v-xxx` がありません // -- 値を命令 `v-xxx="value"` に渡します // -- `v-html="'<p>Content</p>'"` などの文字列をディレクティブに渡します。 `v-xxx="'文字列'"` // -- `v-bind:class="className"` などのパラメータ (`arg`) を渡します `v-xxx:arg="値"` // -- 修飾子を使用する (`modifier`) `v-xxx:arg.modifier="値"` 2. 指示をカスタマイズする方法カスタム ディレクティブの登録は、グローバルまたはローカルで行うことができます。 グローバル登録は主にVue.directiveメソッドを使用して登録されます Vue.directiveの最初のパラメータはディレクティブの名前(v-プレフィックスなし)であり、2番目のパラメータはオブジェクトデータまたはディレクティブ関数になります。 // グローバルカスタムディレクティブ `v-focus` を登録します Vue.directive('focus', { // バインドされた要素が DOM に挿入されると... 挿入: 関数 (el) { // 要素にフォーカス el.focus() // ページが読み込まれた後に入力ボックスに自動的にフォーカスする小さな関数} }) ローカル登録は、コンポーネントオプションのディレクティブ属性を設定することによって行われます。 ディレクティブ: { 集中: // 挿入された命令の定義: function (el) { el.focus() // ページが読み込まれた後に入力ボックスに自動的にフォーカスする小さな関数} } } 次のように、テンプレート内の任意の要素に新しい v-focus プロパティを使用できます。 <入力vフォーカス /> フック機能カスタム命令にも、コンポーネントのようなフック関数があります。
すべてのフック関数のパラメータは次のとおりです。
el を除き、他のすべてのパラメータは読み取り専用であり、変更しないでください。フック間でデータを共有する必要がある場合は、要素のデータセットを介して共有することをお勧めします。 例えば: <div v-demo="{ color: 'white', text: 'hello!' }"></div> <スクリプト> Vue.directive('demo', 関数(el, バインディング) { console.log(binding.value.color) // "白" console.log(binding.value.text) // "こんにちは!" }) </スクリプト> 3. 応用シナリオカスタム コンポーネントを使用すると、日常のシナリオの一部に対応できます。カスタム コンポーネントの例をいくつか示します。
入力ボックスの手ぶれ補正この場合、Vスロットルカスタム命令を設定して手ぶれ防止を実現する 例えば: // 1. v-throttleカスタムディレクティブを設定する Vue.directive('throttle', { バインド: (el, バインディング) => { let throttleTime = binding.value; // 手ぶれ補正時間if (!throttleTime) { // ユーザーが手ぶれ補正時間を設定していない場合、デフォルトは2秒です スロットル時間 = 2000; } cbFun を実行します。 el.addEventListener('クリック', イベント => { if (!cbFun) { // 最初の実行 cbFun = setTimeout(() => { cbFun = null; }, スロットル時間); } それ以外 { イベント && event.stopImmediatePropagation(); } }、 真実); }, }); // 2. ボタン タグに v-throttle カスタム命令を設定します <button @click="sayHello" v-throttle>Submit</button> 画像の遅延読み込み画像の遅延読み込みを完了するためにv-lazyカスタムコンポーネントを設定する 定数LazyLoad = { // インストールメソッド install(Vue,options){ // image の代わりに画像を読み込みます let defaultSrc = options.default; Vue.directive('lazy',{ バインド(el,バインディング){ LazyLoad.init(el、binding.value、defaultSrc); }, 挿入された(el){ // 互換性処理 if('InterpObserver' in window){ LazyLoad.observe(el); }それ以外{ LazyLoad.listenerScroll(el); } }, }) }, // 初期化 init(el,val,def){ // src は実際の src を格納します el.setAttribute('src',val); // src を読み込み画像に設定します el.setAttribute('src',def); }, // InterpObserverを使用してelを監視する 観察する{ io = new InterpObserver(エントリ => { realSrc = el.dataset.src; とします。 エントリ[0]が交差している場合 if(realSrc){ el.src = 実Src; el.removeAttribute('src'); } } }); io.observe(el); }, // スクロールイベントをリッスンする listenerScroll(el){ ハンドラをLazyLoad.throttle(LazyLoad.load,300); LazyLoad.load(el); window.addEventListener('スクロール',() => { ハンドラ(el); }); }, // 実画像を読み込む load(el){ windowHeight = document.documentElement.clientHeight とします。 elTop を el.getBoundingClientRect().top とします。 elBtm = el.getBoundingClientRect().bottom; とします。 realSrc = el.dataset.src; とします。 if(elTop - windowHeight<0&&elBtm > 0){ if(realSrc){ el.src = 実Src; el.removeAttribute('src'); } } }, // スロットル(fn,遅延){ タイマーを設定します。 prevTime を設定します。 関数(...引数)を返す{ currTime = Date.now() とします。 コンテキストを this とします。 前の時刻が現在の時刻と等しい場合、前の時刻は現在の時刻と等しくなります。 タイマーをクリアします。 (現在の時刻 - 前の時刻 > 遅延) の場合 { 前回の時刻 = 現在の時刻; fn.apply(コンテキスト、引数); タイマーをクリアします。 戻る; } タイマー = setTimeout(関数(){ 前の時刻 = Date.now(); タイマー = null; fn.apply(コンテキスト、引数); }、遅れ); } } } デフォルトのLazyLoadをエクスポートします。 ワンクリックコピー機能'ant-design-vue' から { Message } をインポートします。 const vCopy = { // /* バインドフック関数は、初めてバインドするときに呼び出され、初期化設定を行うために使用できます。el: 操作する DOM オブジェクト。value: 命令に渡される値、つまりコピーしたい値*/ バインド(el, { 値 }) { el.$value = value; // この値は他のフック関数で使用されるため、渡された値を格納するためにグローバルプロパティを使用します。el.handler = () => { if (!el.$value) { // 値が空の場合、プロンプトを表示します。ここで使用しているプロンプトは ant-design-vue のプロンプトです。自由に使用できます。Message.warning('No copy content'); 戻る; } // textarea タグを動的に作成します。const textarea = document.createElement('textarea'); // iOS 上でキーボードが自動的に表示されないようにするために textarea を読み取り専用に設定し、textarea を表示領域から移動します。textarea.readOnly = 'readonly'; textarea.style.position = '絶対'; textarea.style.left = '-9999px'; // コピーする値を textarea タグの value 属性に割り当てます。textarea.value = el.$value; // 本文にテキストエリアを挿入します。 document.body.appendChild(textarea); // 値を選択してコピーします textarea.select(); // textarea.setSelectionRange(0, textarea.value.length); const result = document.execCommand('コピー'); if (結果) { Message.success('コピーが成功しました'); } document.body.removeChild(テキストエリア); }; // クリック イベント (いわゆるワンクリック コピー) をバインドします。el.addEventListener('click', el.handler); }, // 入力値が更新されると、componentUpdated(el, { value }) がトリガーされます。 el.$value = 値; }, // 命令が要素からアンバインドされたら、イベントバインディングを削除します unbind(el) { el.removeEventListener('click', el.handler); }, }; デフォルトの vCopy をエクスポートします。 ドラッグ<div ref="a" id="bg" v-drag></div> ディレクティブ: { ドラッグ: { バインド() {}, 挿入(el) { el.onmousedown = (e) => { x = e.clientX - el.offsetLeft とします。 y = e.clientY - el.offsetTop とします。 ドキュメント.onmousemove = (e) => { xx = e.clientX - x + "px" とします。 yy = e.clientY - y + "px" とします。 el.style.left = xx; el.style.top = yy; }; el.onmouseup = (e) => { ドキュメント.onmousemove = null; }; }; }, }, }, ドラッグ アンド ドロップの指示、ページの透かし、権限の検証など、カスタム コンポーネントの適用シナリオは多数あります。 要約するVue のカスタム ディレクティブに関するこの記事はこれで終わりです。Vue のカスタム ディレクティブに関するより関連性の高いコンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: MySQL テーブルがロックされているかどうかを照会する方法
著者は最近、仕事でパフォーマンスのボトルネックの問題に遭遇しました。MySQL テーブルには毎日約 ...
この記事では、WeChatアプレットの具体的なコードを参考までに共有します。具体的な内容は次のとおり...
問題の説明nginx を設定することで、異なるポートを介して異なる Web アプリケーションにアクセ...
MySQL でメタデータ ロックがブロックされている場所を確認する方法手順: 1. セッション1の実...
場合によっては、ベースイメージに特定の依存関係をインストールする必要があります。Dockerfile...
Element UIは、複数のテーブルを同時に水平および垂直にスクロールすることを実装します。 コー...
導入:この記事では主に、Linux システムで IPV6 接続をサポートするように MySQL を構...
MySQL パフォーマンスの最適化MySQL はインターネット企業で広く使用されており、MySQL ...
01. コマンドの概要basename - ファイル名からディレクトリとサフィックスを削除しますba...
nginx ログは filebeat によって収集され、logstash に渡され、logstash...
序文JavaScript を学習した人なら誰でも、さまざまな環境で this がどこを指すかという問...
Xiaobai は vmtools のインストールを記録します。 1. 意義と機能: VMWARE ...
目次クラスコンポーネント機能コンポーネントsetStateの落とし穴React では多くの場所でデー...
面接の質問で、3 行 3 列のレイアウトが求められます。1 行目の 2 番目の列と 2 行目の 2 ...
この記事では、参考までに、Baidu Mapsを使用して都市の位置特定を実現するVueの具体的なコー...