Dieser Artikel vermittelt Ihnen relevantes Wissen über Hooks und Vue. Hooks wurden in der Alpha-Version 16.7.0 eingeführt und bieten hauptsächlich eine klarere Vorstellung von der Wiederverwendung von Mustern.
Verwechseln Sie Hooks nicht mit den Lifecycle-Hooks von Vue. Hooks wurden von React in der Alpha-Version V16.7.0 eingeführt, und Vue veröffentlichte einige Tage später seine Proof-of-Concept-Version. Obwohl Hooks von React eingeführt wurden, sind sie ein wertvoller und wichtiger Kompositionsmechanismus für jedes JavaScript-Framework-Ökosystem, daher werden wir heute ein wenig Zeit damit verbringen, zu diskutieren, was Hooks bedeuten.
Hooks bieten vor allem eine klarere Idee für die Wiederverwendung von Mustern – sie vermeiden das Umschreiben der Komponente selbst und ermöglichen die nahtlose Zusammenarbeit verschiedener Teile der Zustandslogik.
Was React betrifft, ist das Problem folgendes: Klassen sind die häufigste Form von Komponenten, wenn es darum geht, das Konzept des Zustands auszudrücken. Auch zustandslose Funktionskomponenten erfreuen sich großer Beliebtheit, da sie jedoch nur rein gerendert werden können, ist ihr Einsatz auf Präsentationsaufgaben beschränkt.
Es gibt einige Probleme mit dem Unterricht selbst. Da React beispielsweise immer beliebter wird, ist das Thema Klassen zu einem häufigen Stolperstein für Neulinge geworden. Um React zu verstehen, müssen Entwickler auch Klassen verstehen. Durch die Bindung wird der Code ausführlicher und weniger lesbar und erfordert das Verständnis von this
in JavaScript. Einige der Optimierungshindernisse, die durch die Verwendung von Klassen entstehen, werden hier ebenfalls besprochen. this
。这里还讨论了使用类所带来的一些优化障碍。
在逻辑复用方面,我们通常使用 render props 和高阶组件等模式。但使用这些模式后会发现自己处于类似的“厄运金字塔”中 —— 样式实现地狱,即过度使用嵌套可能会导致组件难以维护。这导致我想对 Dan Abramov 像喝醉了一样大吼大叫,没有人想要那样。
Hooks 允许我们使用函数调用来定义组件的有状态逻辑,从而解决这些问题。这些函数调用变得更具有组合性、可复用性,并且允许我们在使用函数式组件的同时能够访问和维护状态。React 发布 Hooks 时,人们很兴奋 —— 下面你可以看到 Hooks 展示的一些优势,关于它们如何减少代码和重复:
在维护方面,简单性是关键,Hooks 提供了一种单一的、函数式的方式来实现逻辑共享,并且可能代码量更小。
读到这里你肯定想知道 Hooks 在 Vue 中必须提供什么。这似乎是一个不需要解决的问题。毕竟,类并不是 Vue 主要使用的模式。Vue 提供无状态函数式组件(如果需要它们),但为什么我们需要在函数式组件中携带状态呢?我们有 mixins 用于组合可以在多个组件复用的相同逻辑。问题解决了。
我想到了同样的事情,但在与 Evan You 交谈后,他指出了我忽略的一个主要用例:mixins 不能相互消费和使用状态,但 Hooks 可以。这意味着如果我们需要链式封装逻辑,可以使用 Hooks。
Hooks 实现了 mixins 的功能,但避免了 mixins 带来的两个主要问题:
如果使用多个 mixins,我们不清楚哪个属性是由哪个 mixins 提供的。使用 Hooks,函数的返回值会记录消费的值。
那么,这在 Vue 中如何运行呢?我们之前提到过,在使用 Hooks 时,逻辑在函数调用时表达从而可复用。在 Vue 中,这意味着我们可以将数据调用、方法调用或计算属性调用封装到另一个自定义函数中,并使它们可以自由组合。数据、方法和计算属性现在可用于函数式组件了。
让我们来看一个非常简单的 hook,以便我们在继续学习 Hooks 中的组合例子之前理解构建块。
好的,Vue Hooks 和 React Hooks 之间存在交叉部分。使用 use
作为前缀是 React 的约定,所以如果你在 React 中查找 Hooks,你会发现 Hooks 的名称都会像 useState
、useEffect
等。更多信息可以查看这里。
在 Evan 的在线 demo 里,你可以看到他在何处访问 useState
和 useEffect
并用于 render 函数。
如果你不熟悉 Vue 中的 render 函数,那么看一看官网文档可能会有所帮助。
但是当我们使用 Vue 风格的 Hooks 时,我们会如何命名呢 —— 你猜对了 —— 比如:useData
,useComputed
use
als Präfix zu verwenden. Wenn Sie also in React nach Hooks suchen, werden Sie feststellen, dass die Namen von Hooks wie folgt lauten: useState
, useEffect warten. Weitere Informationen finden Sie hier. 🎜🎜In Evans Online-Demo können Sie sehen, wo er auf useState
und useEffect
für die Renderfunktion zugreift. 🎜🎜Wenn Sie mit der Renderfunktion in Vue nicht vertraut sind, kann ein Blick in die offizielle Website-Dokumentation hilfreich sein. 🎜🎜Aber wenn wir Hooks im Vue-Stil verwenden, wie werden wir sie dann benennen – Sie haben es erraten – zum Beispiel: useData
, useComputed
usw. 🎜🎜Damit wir sehen können, wie man Hooks in Vue verwendet, habe ich eine Beispielanwendung erstellt, die wir erkunden können. 🎜Im Ordner src/hooks habe ich einen Hook erstellt, der das Scrollen wieder ermöglicht useMounted
hook 上阻止了滚动,并在 useDestroyed
. Dies hilft mir, das Scrollen der Seite anzuhalten, wenn das Dialogfeld zum Anzeigen von Inhalten geöffnet wird, und ermöglicht das erneute Scrollen, wenn das Anzeigedialogfeld endet. Dies ist eine gute Abstraktion, da sie in der gesamten Anwendung mehrmals verwendet werden kann.
import { useDestroyed, useMounted } from "vue-hooks";export function preventscroll() { const preventDefault = (e) => { e = e || window.event; if (e.preventDefault) e.preventDefault(); e.returnValue = false; } // keycodes for left, up, right, down const keys = { 37: 1, 38: 1, 39: 1, 40: 1 }; const preventDefaultForScrollKeys = (e) => { if (keys[e.keyCode]) { preventDefault(e); return false; } } useMounted(() => { if (window.addEventListener) // older FF window.addEventListener('DOMMouseScroll', preventDefault, false); window.onwheel = preventDefault; // modern standard window.onmousewheel = document.onmousewheel = preventDefault; // older browsers, IE window.touchmove = preventDefault; // mobile window.touchstart = preventDefault; // mobile document.onkeydown = preventDefaultForScrollKeys; }); useDestroyed(() => { if (window.removeEventListener) window.removeEventListener('DOMMouseScroll', preventDefault, false); //firefox window.addEventListener('DOMMouseScroll', (e) => { e.stopPropagation(); }, true); window.onmousewheel = document.onmousewheel = null; window.onwheel = null; window.touchmove = null; window.touchstart = null; document.onkeydown = null; }); }
Dann können wir es in einer Vue-Komponente wie AppDetails.vue aufrufen:
<script> import { preventscroll } from "./../hooks/preventscroll.js"; ...export default { ... hooks() { preventscroll(); } } </script>
Wir können es nicht nur in dieser Komponente verwenden, wir können die gleiche Funktionalität in der gesamten Anwendung verwenden!
Wir haben bereits erwähnt, dass einer der Hauptunterschiede zwischen Hooks und Mixins darin besteht, dass Hooks tatsächlich Werte aneinander übergeben können. Schauen wir uns dieses einfache, aber etwas unnatürliche Beispiel an.
In unserer Anwendung müssen wir eine Berechnung in einem wiederverwendbaren Hook durchführen und etwas, das das Ergebnis dieser Berechnung verwenden muss. In unserem Fall haben wir einen Hook, der die Fensterbreite übernimmt und an die Animation weitergibt, sodass diese weiß, dass sie nur ausgelöst wird, wenn wir uns auf einem größeren Bildschirm befinden.
Weitere Informationen finden Sie in der Videodemonstration: css-tricks.com/wp-content/…
Erster Hook:
import { useData, useMounted } from 'vue-hooks';export function windowwidth() { const data = useData({ width: 0 }) useMounted(() => { data.width = window.innerWidth }) // this is something we can consume with the other hook return { data } }
Dann verwenden wir ihn im zweiten Hook, um eine Bedingung zu erstellen, die die Animationslogik auslöst:
// the data comes from the other hookexport function logolettering(data) { useMounted(function () { // this is the width that we stored in data from the previous hook if (data.data.width > 1200) { // we can use refs if they are called in the useMounted hook const logoname = this.$refs.logoname; Splitting({ target: logoname, by: "chars" }); TweenMax.staggerFromTo(".char", 5, { opacity: 0, transformOrigin: "50% 50% -30px", cycle: { color: ["red", "purple", "teal"], rotationY(i) { return i * 50 } } }, ...
Dann übergeben wir innerhalb der Komponente einen Hook als Parameter an einen anderen Hook:
<script> import { logolettering } from "./../hooks/logolettering.js"; import { windowwidth } from "./../hooks/windowwidth.js";export default { hooks() { logolettering(windowwidth()); } }; </script>
Jetzt können wir Hooks verwenden, um Logik in unserer gesamten Anwendung zu schreiben! Auch dies ist ein unnatürliches Beispiel für Demonstrationszwecke, aber Sie können sehen, wie effektiv dies für große Anwendungen sein kann, indem die Logik in kleineren, wiederverwendbaren Funktionen beibehalten wird
【Verwandte Empfehlungen:《vue.js-Tutorial》】
Das obige ist der detaillierte Inhalt vonLassen Sie uns darüber sprechen, was Hooks für Vue bedeutet. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!