Vueのカスタムディレクティブとは何ですか?使い方?

青灯夜游
リリース: 2022-03-23 11:35:46
転載
3068 人が閲覧しました

この記事では、vueのカスタム命令を理解し、カスタム命令の登録方法、カスタム命令パラメータ、カスタム命令の利用シナリオを紹介しますので、皆様のお役に立てれば幸いです。

Vueのカスタムディレクティブとは何ですか?使い方?

現在、Vue は国内のフロントエンド市場の大部分を占めており、フロントエンドの就職活動の過程で、面接で Vue 関連の質問がますます増えています。 Vue がこれほど人気が​​ある理由の大きな理由は、その進歩的、コンポーネント化、命令的などのアイデアにより、一般の開発者が非常に簡単に始められることにあります。 [関連する推奨事項: vuejs ビデオ チュートリアル ]

命令は、Vue プロジェクトで最もよく使用されるものの 1 つです。今日は、Vue 命令のブランチであるカスタム命令について説明します。

1.カスタム ディレクティブとは何ですか?

カスタム命令を使用したい場合は、まずカスタム命令とは何かを理解する必要があります。

カスタム命令は非常に分かりやすく、私たちが使用するv-for、v-if、v-modelなどは命令と呼ばれ、Vueの組み込み命令とも呼ばれます。これらの命令はすべて直接使用できるものです。

ニーズをより適切に満たし、開発者のパーソナライズされた開発を最大限に高めるために、Vue はカスタム命令の API を公開しているため、組み込み命令の使用に加えて、独自の命令を定義することもできます。定義すると、組み込み命令と非常によく似ています。

たとえば、私たちが調べたコード:

<p v-pin="200">我是一段话</p>
ログイン後にコピー

多くの友人は、上記のコードの v ピンが何であるかを知らないかもしれません。これは命令のように見えますが、これに遭遇したことはありますか? ?実際には、v-pin はカスタム命令ですが、ここではそれを登録するコードを省略します。

2. 環境準備

部屋については、Vue2.x のスキャフォールディング ツールを直接使用して、プロジェクトを迅速に構築します。

ビルド コマンド:

vue create 项目名称
ログイン後にコピー

実行:

Vueのカスタムディレクティブとは何ですか?使い方?

3. 方法カスタム命令を登録しますか?

カスタム命令を使用する場合は、コンポーネントと同様に、使用する前に登録する必要があるのと同様に、まず事前に登録する必要があります。

登録命令もグローバル登録とローカル登録に分かれており、グローバル登録コンポーネントとローカル登録コンポーネントと同じです。グローバルに登録された命令は任意のコンポーネントで直接使用できますが、ローカルに登録された命令は登録されている場所でのみ使用できます。

3.1 グローバル登録

グローバル登録 名前が示すように、カスタム命令を登録すると、カスタム命令をすべてのコンポーネントで直接使用できます。プロジェクト。

Vue にはカスタム命令を登録するためのディレクティブ メソッドが用意されており、main.js にグローバル カスタム命令を登録します。

コードは次のとおりです:

// src/main.js
import Vue from "vue";
import App from "./App.vue";

Vue.config.productionTip = false;
Vue.directive("resize", {
  bind() {},
  inserted() {},
  update() {},
  componentUpdated() {},
  unbind() {},
});
new Vue({
  render: (h) => h(App),
}).$mount("#app");
ログイン後にコピー

上記のコードでは、Vue が提供するディレクティブ メソッドを直接呼び出して、グローバル カスタム ディレクティブを登録しました。このメソッドは 2 つのディレクティブを受け取ります。パラメータ: 命令名、命令フック関数を含むオブジェクト。

コマンドが登録されると、プロジェクト内の任意のコンポーネントの要素に対して「v-コマンド名」の形式でコマンドを使用できるようになります。

命令フック関数は必須ではありませんが、vue のライフサイクルフック関数と比較すると、命令が異なるプロセスで異なる処理を実行できるようにする機能です。

3.2 ローカル登録

一般的に、カスタム命令がすべてのコンポーネントで使用されない場合、通常はカスタム命令を登録します。

APP.vue ファイルを変換して、その中にカスタム命令を登録しましょう。コードは次のとおりです:

<script>
export default {
  name: "App",
  components: {},
  directives: {
    resize: {
      bind() {},
      inserted() {},
      update() {},
      componentUpdated() {},
      unbind() {},
    },
  },
};
</script>
ログイン後にコピー

上に示したように、Vue にはカスタム命令を登録するためのディレクティブ オプションが用意されています。データやメソッドと同じレベルですが、上記のコードでは、コンポーネント内でのみ使用できるサイズ変更と呼ばれるカスタム命令を登録しました。

注: グローバル登録命令はディレクティブを使用し、ローカル登録命令はディレクティブを使用します。理解するのは簡単です。ローカル命令は一度に多数登録し、グローバル命令は 1 つだけ登録できることに注意してください。順次登録されます。

4. カスタム命令パラメータの詳細説明

前のセクションでは、カスタム命令のローカル登録とカスタム命令のグローバル登録について簡単に紹介しました。命令内の関数. では、私たちの動作ロジックは主にこれらのフック関数内にあるため、これらのフック関数を導入する必要があります。

4.1 フック関数の概要

bind:

一度だけ呼び出されます。命令 初めて要素にバインドされたときに呼び出されます。ここではワンタイムの初期化設定を行うことができます。

inserted:

バインドされた要素が親ノードに挿入されるときに呼び出されます (親ノードのみが存在することが保証されていますが、存在する可能性もあります)ドキュメントに挿入されていません)。 ############アップデート:######

所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前。指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新

componentUpdated:

指令所在组件的 VNode及其子 VNode全部更新后调用。

unbind:

只调用一次,指令与元素解绑时调用。

上面5个就是自定义指令的全部钩子函数,每个钩子函数都是可选的,视情况而定。大家可以简单理解钩子函数顺序:指令绑定到元素时(bind)、元素插入时(inserted)、组件更新时(update)、组件更新后(componentUpdated)、指令与元素解绑时(unbind)。这些和组件的生命周期函数有点类似。

4.2 钩子函数参数介绍

为了方便我们的逻辑操作,每个钩子函数都会接收参数,我们可以用这些参数做我们想做的事。

el:

指令所绑定的元素,可以用来直接操作 DOM。

binding:

一个对象,包含以下属性:

  • name:指令名,不包括 v- 前缀。
  • value:指令的绑定值,例如:v-my-directive="1 + 1" 中,绑定值为 2
  • oldValue:指令绑定的前一个值,仅在 updatecomponentUpdated 钩子中可用。无论值是否改变都可用。
  • expression:字符串形式的指令表达式。例如 v-my-directive="1 + 1" 中,表达式为 "1 + 1"
  • arg:传给指令的参数,可选。例如 v-my-directive:foo 中,参数为 "foo"
  • modifiers:一个包含修饰符的对象。例如:v-my-directive.foo.bar 中,修饰符对象为 { foo: true, bar: true }

vnode:

Vue 编译生成的虚拟节点。

oldVnode:

上一个虚拟节点,仅在updatecomponentUpdated钩子中可用。

在使用的时候,el和binding参数是我们使用得最平凡的,有了这些参数,我们的操作就变得简单起来。

5. 简单案列实战

上面两节介绍了如何注册自定义指令以及相关参数,接下来就该实战了,我们在APPVue中定义一个自定义指令,先来验证一下钩子函数的执行情况。

代码如下:

<template>
  <div id="app">
    <img alt="Vue logo" src="./assets/logo.png" />
    <div v-resize></div>
  </div>
</template>

<script>
export default {
  name: "App",
  components: {},
  directives: {
    resize: {
      bind() {
        console.log("bind")
      },
      inserted() {
        console.log("inserted")
      },
      update() {
        console.log("update")
      },
      componentUpdated() {
        console.log("componentUpdated")
      },
      unbind() {
        console.log("unbind")
      },
    },
  },
};
</script>
ログイン後にコピー

效果如下:

Vueのカスタムディレクティブとは何ですか?使い方?

上面代码中我们将自定义指令resize绑定到了div元素上面,当我们刷新页面时,执行了自定义指令中的bind和inserted钩子函数,其余函数均要元素有更新才会执行。

5.1 实现v-resize指令

需求背景:

在做数据大屏或者自适应开发的时候,我们通常需要根据浏览器窗口大小的变化重新渲染页面,比如重新绘制echarts图表等功能。

需求描述:

实现自定义指令v-resize指令,窗口大小发生变化时,实时打印最新的窗口宽高。

代码实现:

// src/APP.vue
<template>
  <div id="app">
    <h1>窗口宽度:{{ innerWidth }}</h1>
    <h1>窗口高度:{{ innerHeight }}</h1>
    <div style="height: 300px; width: 80%; background: blue" v-resize></div>
  </div>
</template>

<script>
export default {
  name: "App",
  data() {
    return {
      innerHeight: window.innerHeight,
      innerWidth: window.innerWidth,
    };
  },
  components: {},
  directives: {
    resize: {
      bind() {
        console.log("bind");
      },
      inserted(el, binding, vnode) {
        console.log("inserted");
        console.log(el, binding);
        let that = vnode.context;
        // 监听浏览器的resize事件
        window.addEventListener("resize", () => {
          that.innerHeight = window.innerHeight;
          that.innerWidth = window.innerWidth;
        });
      },
      update() {
        console.log("VNode更新了");
      },
      componentUpdated() {
        console.log("componentUpdated");
      },
      unbind() {
        console.log("unbind");
        window.removeEventListener("resize");
      },
    },
  },
};
</script>
ログイン後にコピー

效果如下:

Vueのカスタムディレクティブとは何ですか?使い方?

当我们更改浏览器窗口大小时,页面上会实时打印出最新的高度和宽度,当然这儿只是一个最简单的案例,实际项目中我们通常会在窗口大小发生变化后去调用自定义的一些方法。

5.2 指令传参和传值

我们使用v-bind、v-model等内置指令时,都是可以传参和传值的,我们自定义指令也一样。

示例代码:

<template>
  <div id="app">
    <h1>窗口宽度:{{ innerWidth }}</h1>
    <h1>窗口高度:{{ innerHeight }}</h1>
    <div
      style="height: 300px; width: 80%; background: blue"
      v-resize:[args]="value"
    ></div>
  </div>
</template>

<script>
export default {
  name: "App",
  data() {
    return {
      innerHeight: window.innerHeight,
      innerWidth: window.innerWidth,
      args: "我是参数",
      value: "我是传的值",
    };
  },
  components: {},
  directives: {
    resize: {
      bind(el, binding) {
        console.log("bind");
        console.log("值", binding.value);
        console.log("参数", binding.arg);
      },
    },
  },
};
</script>
ログイン後にコピー

效果如下:

Vueのカスタムディレクティブとは何ですか?使い方?

args和value就是我们传给指令的参数和值,需要注意的是value接收变量或者表达式,arg接收字符串或者变量,具体解释可以参上参数详解那一节。

5.3 指令简写

很多时候我们不需要用到自定义指令中的所有钩子函数,常用的就那么几个,所以官方给我们提供了一种简写的方式。

代码如下:

resize(el, binding) {
   console.log("我是简写的自定义指令", binding.value);
},
ログイン後にコピー

上面代码的写法让我们的指令变得很简洁,上段代码的意思就是把bind和update钩子函数合二为一了,通常我们想要这两个钩子函数做同样的事的时候使用。

6. 自定义指令使用场景

知道了自定义指令如何使用,我们可以扩充一下使用场景,加深一下大家对自定义指令的理解。

6.1 v-copy

实现一键复制文本内容,用于鼠标右键粘贴。

6.2 v-longpress

实现长按,用户需要按下并按住按钮几秒钟,触发相应的事件。

6.3 v-debounce

防止按钮在短时间内被多次点击,使用防抖函数限制规定时间内只能点击一次。

6.4 v-LazyLoad

实现一个图片懒加载指令,只加载浏览器可见区域的图片。

6.5 v-draggable

实现一个拖拽指令,可在页面可视区域任意拖拽元素。

上面的一些自定义指令都是需求中非常常见的,对应的指令代码网上也有很多,但是我建议大家自己下去实践一下。

总结

自定义指令的语法规则和用法很简单,复杂的是我们要用来解决什么问题。在合适的场景下使用合适的解决办法才是最重要的。

(学习视频分享:vuejs教程web前端

以上がVueのカスタムディレクティブとは何ですか?使い方?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:juejin.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート