Heim > Web-Frontend > View.js > Erfahren Sie mehr über benutzerdefinierte Anweisungen in Vue

Erfahren Sie mehr über benutzerdefinierte Anweisungen in Vue

青灯夜游
Freigeben: 2022-11-21 20:20:14
nach vorne
1514 Leute haben es durchsucht

Erfahren Sie mehr über benutzerdefinierte Anweisungen in Vue

Vorbereitung: Einführung in benutzerdefinierte Direktiven

Zusätzlich zu den standardmäßig integrierten Direktiven der Kernfunktionen (v-model und v-show). usw.) ermöglicht Vue auch das Registrieren benutzerdefinierter Direktiven. Beachten Sie, dass in Vue2.0 Komponenten die Hauptform der Wiederverwendung und Abstraktion von Code sind. In einigen Fällen müssen Sie jedoch dennoch Operationen auf niedriger Ebene für gewöhnliche DOM-Elemente ausführen. In diesem Fall werden benutzerdefinierte Anweisungen verwendet. [Teilen von Lernvideos: vue-Video-Tutorial, web front-end video]v-modelv-show等),Vue 也允许注册自定义指令。注意,在 Vue2.0 中,代码复用和抽象的主要形式是组件。然而,有的情况下,你仍然需要对普通 DOM 元素进行底层操作,这时候就会用到自定义指令。【学习视频分享:vue视频教程web前端视频

作为使用Vue的开发者,我们对Vue指令一定不陌生,诸如v-modelv-onv-forv-if等,同时Vue也为开发者提供了自定义指令的api,熟练的使用自定义指令可以极大的提高了我们编写代码的效率,让我们可以节省时间开心的摸鱼~

对于Vue的自定义指令相信很多同学已经有所了解,自定义指令的具体写法这里就不细讲了,官方文档很详细。 但是不知道各位同学有没有这种感觉,就是这个技术感觉很方便,也不难,我也感觉学会了,就是不知道如何去应用。这篇文档就是为了解决一些同学的这些问题才写出来的。

PS:这次要讲的自定义指令我们主要使用的是vue2.x的写法,不过vue3.x不过是几个钩子函数有所改变,只要理解每个钩子函数的含义,两者的用法差别并不大。

试炼:实现v-mymodel

我的上篇文章说到要自己实现一个v-model指令,这里使用v-myodel模拟一个简易版的,顺便再领不熟悉的同学熟悉一下自定义指令的步骤和注意事项。

定义指令

首先梳理思路:原生input控件与组件的实现方式需要区分,input的实现较为简单,我们先实现一下input的处理。 首先我们先定义一个不做任何操作的指令

Vue.directive('mymodel', {
        //只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。
        bind(el, binding, vnode, oldVnode) {
        },
        //被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中),需要父节点dom时使用这个钩子
        inserted(el, binding, vnode, oldVnode) {
        },
        //所在组件的 VNode 更新时调用,**但是可能发生在其子 VNode 更新之前**。指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新 (详细的钩子函数参数见下)。
        update(el, binding, vnode, oldVnode) {
        },
        //指令所在组件的 VNode **及其子 VNode** 全部更新后调用。
        componentUpdated(el, binding, vnode, oldVnode) {
        },
        只调用一次,指令与元素解绑时调用。
        unbind(el, binding, vnode, oldVnode) {
        },
})
Nach dem Login kopieren

上面的注释中详细的说明了各个钩子函数的调用时机,因为我们是给组件上添加input事件和value绑定,因此我们在bind这个钩子函数中定义即可。所以我们把其他的先去掉,代码变成这样。

Vue.directive('mymodel', {
        //只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。
        bind(el, binding, vnode, oldVnode) { 
        }
})
Nach dem Login kopieren

简单说一下bind函数的几个回调参数,el是指令绑定组件对应的dombinding是我们的指令本身,包含namevalueexpressionarg等,vnode就是当前绑定组件对应的vnode结点,oldVnode就是vnode更新前的状态。

接下来我们要做两件事:

  • 绑定input事件,同步inputvalue值到外部
  • value值绑定,监听value的变化,更新到inputvalue

这对于input原生组件比较容易实现:

//第一步,添加inout事件监听
el.addEventListener('input', (e) => {
   //context是input所在的父组件,这一步是同步数据
   vnode.context[binding.expression] = e.target.value;
})
//监听绑定的变量
vnode.context.$watch(binding.expression, (v) => {
     el.value = v;
})
Nach dem Login kopieren

这里解释一下上面的代码,vnode.context是什么呢,他就是我们指令所在组件的上下文环境,可以理解就是指令绑定的值所在的组件实例。不熟悉vnode结构的同学建议先看一下官方的文档,不过文档描述的比较简单,不是很全面,所以最好在控制台log一下vnode的对象看一下它具体的结构,这很有助于我们封装自定义指令,对理解Vue原理也很有帮助。

我们可以通过context[binding.expression]获取v-model上到绑定的值,同样可以修改它。上面的代码中我们首先通过在添加的input事件中操作vnode.context[binding.expression] = e.target.value同步inputvalue值到外部(context),与使用@input添加事件监听效果是一样的;然后我们需要做第二件事,做value值的绑定,监听value的变化,同步值的变更到inputvalue上,我们想到我们可以使用Vue实例上的额$watch方法监听值的变化,而context就是那个Vue实例,binding.expression

as Entwickler, die Vue verwenden, müssen mit Vue-Anweisungen wie v-model, v-on</ vertraut sein code>, <code>v-for, v-if usw. Gleichzeitig stellt Vue Entwicklern auch eine API für benutzerdefinierte Anweisungen zur Verfügung Verbessern Die Effizienz unseres Code-Schreibens ermöglicht es uns, Zeit zu sparen und glücklich zu fischen~🎜🎜Für Vue< Ich glaube, dass viele Schüler bereits über die benutzerdefinierten Anweisungen Bescheid wissen. Ich werde hier nicht näher darauf eingehen, wie man benutzerdefinierte Anweisungen schreibt. Die offizielle Dokumentation ist sehr detailliert. Aber ich weiß nicht, ob es für Sie Studenten so ist. Ich habe auch das Gefühl, dass ich sie gelernt habe, aber ich weiß nicht, wie ich sie anwenden soll. Dieses Dokument wurde geschrieben, um diese Probleme einiger Studenten zu lösen. 🎜🎜PS: Die benutzerdefinierten Anweisungen, über die wir dieses Mal sprechen werden, verwenden hauptsächlich die Schreibmethode von vue2.x, aber vue3.x ist nur einige davon Hook-Funktionen Es gibt Änderungen. Solange Sie die Bedeutung der einzelnen Hook-Funktionen verstehen, gibt es keinen großen Unterschied in der Verwendung zwischen den beiden. 🎜

🎜Testversion: v-mymodel implementieren🎜🎜🎜In meinem letzten Artikel wurde erwähnt, dass ich selbst eine v-model-Anweisung implementieren muss. Hier verwenden wir v-myodel, um eine einfache Version zu simulieren. Übrigens werden wir unbekannte Schüler mit den Schritten und Vorsichtsmaßnahmen benutzerdefinierter Anweisungen vertraut machen. 🎜

🎜Definitionsanweisungen🎜

🎜Sortieren Sie zunächst die Ideen: Die Implementierungsmethoden nativer Eingabe-Steuerelemente und -Komponenten müssen unterschieden werden, < code>input ist relativ einfach. Implementieren wir zunächst die Verarbeitung von input. Zuerst definieren wir zunächst eine Anweisung, die keine Operation ausführt🎜
<input v-mymodel=&#39;message&#39;/>
Nach dem Login kopieren
Nach dem Login kopieren
🎜Die obigen Kommentare erläutern im Detail den Aufrufzeitpunkt jeder Hook-Funktion, da wir input-Ereignisse und value hinzufügen Komponente Binding, sodass wir sie in der Hook-Funktion bind definieren können. Also entfernen wir zuerst die anderen und der Code sieht so aus. 🎜
//监听绑定的变量
vnode.context.$watch(binding.expression, (v) => {
     el.value = v;
})
Nach dem Login kopieren
Nach dem Login kopieren
🎜 Lassen Sie uns kurz über mehrere Rückrufparameter der Funktion bind sprechen. el ist der dom, der der Anweisungsbindungskomponente entspricht, und binding< /code> ist unsere Anweisung selbst, einschließlich <code>name, value, expression, arg usw. , vnode ist der vnode-Knoten, der der aktuell gebundenen Komponente entspricht, und oldVnode ist der Zustand vor der Aktualisierung von vnode . 🎜🎜Als nächstes müssen wir zwei Dinge tun: 🎜
Verwandte Etiketten:
Quelle:juejin.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage