>  기사  >  웹 프론트엔드  >  Hooks가 Vue에 어떤 의미인지 이야기해 봅시다.

Hooks가 Vue에 어떤 의미인지 이야기해 봅시다.

WBOY
WBOY앞으로
2022-02-15 17:32:451558검색

이 기사는 Hooks 및 vue에 대한 관련 지식을 제공합니다. Hooks는 V16.7.0-alpha 버전에서 주로 패턴 재사용에 대한 보다 명확한 아이디어를 제공합니다.

Hooks가 Vue에 어떤 의미인지 이야기해 봅시다.

Hooks를 Vue의 Lifecycle Hooks와 혼동하지 마세요. Hooks는 V16.7.0-alpha 버전에서 React에 의해 도입되었으며 Vue는 며칠 후에 개념 증명 버전을 출시했습니다. Hooks는 React에 의해 도입되었지만 모든 JavaScript 프레임워크 생태계에 대한 가치 있고 중요한 구성 메커니즘이므로 오늘은 Hooks가 무엇을 의미하는지 논의하는 데 약간의 시간을 할애하겠습니다.

Hooks는 주로 패턴 재사용에 대한 보다 명확한 아이디어를 제공합니다. 즉, 구성 요소 자체를 다시 작성하는 것을 방지하고 상태 저장 논리의 다양한 부분이 원활하게 함께 작동하도록 허용합니다.

원래 질문

React에 관한 한 문제는 다음과 같습니다. 클래스는 상태 개념을 표현할 때 가장 일반적인 구성 요소 형태입니다. 상태 비저장 기능 구성 요소도 매우 인기가 있지만 순수하게만 렌더링할 수 있기 때문에 그 사용은 프레젠테이션 작업으로 제한됩니다.

수업 자체에 문제가 좀 있습니다. 예를 들어 React가 점점 대중화되면서 클래스 문제는 초보자에게 흔한 걸림돌이 되었습니다. React를 이해하려면 개발자는 클래스도 이해해야 합니다. 바인딩을 사용하면 코드가 장황해지고 읽기가 어려워지므로 JavaScript에서 이것을 이해해야 합니다. 클래스 사용으로 인해 발생하는 최적화 장애물 중 일부도 여기에서 설명합니다. this。这里还讨论了使用类所带来的一些优化障碍。

在逻辑复用方面,我们通常使用 render props 和高阶组件等模式。但使用这些模式后会发现自己处于类似的“厄运金字塔”中 —— 样式实现地狱,即过度使用嵌套可能会导致组件难以维护。这导致我想对 Dan Abramov 像喝醉了一样大吼大叫,没有人想要那样。

Hooks 允许我们使用函数调用来定义组件的有状态逻辑,从而解决这些问题。这些函数调用变得更具有组合性、可复用性,并且允许我们在使用函数式组件的同时能够访问和维护状态。React 发布 Hooks 时,人们很兴奋 —— 下面你可以看到 Hooks 展示的一些优势,关于它们如何减少代码和重复:

在维护方面,简单性是关键,Hooks 提供了一种单一的、函数式的方式来实现逻辑共享,并且可能代码量更小。

为什么 Vue 中需要 Hooks?

读到这里你肯定想知道 Hooks 在 Vue 中必须提供什么。这似乎是一个不需要解决的问题。毕竟,类并不是 Vue 主要使用的模式。Vue 提供无状态函数式组件(如果需要它们),但为什么我们需要在函数式组件中携带状态呢?我们有 mixins 用于组合可以在多个组件复用的相同逻辑。问题解决了。

我想到了同样的事情,但在与 Evan You 交谈后,他指出了我忽略的一个主要用例:mixins 不能相互消费和使用状态,但 Hooks 可以。这意味着如果我们需要链式封装逻辑,可以使用 Hooks。

Hooks 实现了 mixins 的功能,但避免了 mixins 带来的两个主要问题:

  • 允许相互传递状态。
  • 明确指出逻辑来自哪里。

如果使用多个 mixins,我们不清楚哪个属性是由哪个 mixins 提供的。使用 Hooks,函数的返回值会记录消费的值。

那么,这在 Vue 中如何运行呢?我们之前提到过,在使用 Hooks 时,逻辑在函数调用时表达从而可复用。在 Vue 中,这意味着我们可以将数据调用、方法调用或计算属性调用封装到另一个自定义函数中,并使它们可以自由组合。数据、方法和计算属性现在可用于函数式组件了。

例子

让我们来看一个非常简单的 hook,以便我们在继续学习 Hooks 中的组合例子之前理解构建块。

useWat?

好的,Vue Hooks 和 React Hooks 之间存在交叉部分。使用 use 作为前缀是 React 的约定,所以如果你在 React 中查找 Hooks,你会发现 Hooks 的名称都会像 useStateuseEffect 等。更多信息可以查看这里。

在 Evan 的在线 demo 里,你可以看到他在何处访问 useStateuseEffect 并用于 render 函数。

如果你不熟悉 Vue 中的 render 函数,那么看一看官网文档可能会有所帮助。

但是当我们使用 Vue 风格的 Hooks 时,我们会如何命名呢 —— 你猜对了 —— 比如:useDatauseComputed

로직 재사용 측면에서 우리는 일반적으로 렌더 소품 및 고차 구성 요소와 같은 패턴을 사용합니다. 그러나 이러한 패턴을 사용하면 유사한 "파멸의 피라미드"에 빠질 수 있습니다. 즉, 중첩을 과도하게 사용하면 구성 요소를 유지 관리하기 어렵게 만드는 스타일 구현 지옥에 빠질 수 있습니다. 이로 인해 나는 Dan Abramov가 취한 것처럼 소리를 지르고 싶었는데, 아무도 그것을 원하지 않았습니다.

Hooks는 함수 호출을 사용하여 구성 요소에 대한 상태 저장 논리를 정의할 수 있도록 하여 이러한 문제를 해결합니다. 이러한 함수 호출은 더욱 구성 가능하고 재사용 가능해지며 기능적 구성 요소를 사용하는 동안 상태에 액세스하고 유지할 수 있습니다. React가 Hooks를 출시했을 때 사람들은 열광했습니다. 아래에서는 코드와 중복을 줄이는 측면에서 Hooks가 보여주는 몇 가지 이점을 볼 수 있습니다. 🎜🎜유지 관리에 있어 단순성은 핵심이며 Hooks는 단일 기능적 방법을 제공합니다. 논리 공유를 달성하면 코드 크기가 더 작아질 수 있습니다. 🎜🎜Vue에 Hook이 필요한 이유는 무엇인가요? 🎜🎜이 글을 읽으면서 Vue에서 Hooks가 무엇을 제공하는지 궁금하실 것입니다. 이건 풀 필요가 없는 문제인 것 같습니다. 결국 클래스는 Vue에서 사용되는 기본 패턴이 아닙니다. Vue는 필요한 경우 상태 비저장 기능 구성 요소를 제공하지만 왜 기능 구성 요소에 상태를 전달해야 합니까? 여러 구성 요소에서 재사용할 수 있는 동일한 논리를 결합하기 위한 믹스인이 있습니다. 문제가 해결되었습니다. 🎜🎜저도 같은 생각을 하고 있었는데 Evan You와 이야기를 나눈 후 제가 간과했던 주요 사용 사례를 지적했습니다. 믹스인은 서로의 상태를 소비하고 사용할 수 없지만 Hooks는 가능합니다. 즉, 캡슐화된 로직을 연결해야 한다면 Hooks를 사용할 수 있습니다. 🎜🎜Hooks는 믹스인의 기능을 구현하지만 믹스인으로 인해 발생하는 두 가지 주요 문제를 방지합니다. 🎜
  • 상태가 서로 전달되도록 허용합니다.
  • 논리의 출처를 명확히 하세요.
🎜여러 믹스인을 사용하는 경우 어떤 믹스인이 어떤 속성을 제공하는지 명확하지 않습니다. Hooks를 사용하면 함수의 반환 값에 소비된 값이 기록됩니다. 🎜🎜그렇다면 Vue에서는 어떻게 작동하나요? 앞서 Hooks를 사용할 때 로직이 함수 호출로 표현되므로 재사용이 가능하다고 언급했습니다. Vue에서 이는 데이터 호출, 메소드 호출 또는 계산된 속성 호출을 다른 사용자 정의 함수로 캡슐화하고 자유롭게 구성할 수 있음을 의미합니다. 이제 기능적 구성 요소에 데이터, 메서드 및 계산된 속성을 사용할 수 있습니다. 🎜🎜Example🎜🎜Hooks의 구성 예제로 넘어가기 전에 빌딩 블록을 이해하기 위해 매우 간단한 Hook을 살펴보겠습니다. 🎜

useWat?

🎜좋아, Vue Hooks와 React Hooks 사이에는 크로스오버가 있습니다. use를 접두사로 사용하는 것이 React의 관례이므로 React에서 Hooks를 찾아보면 Hooks의 이름이 useState와 같은 것을 알 수 있습니다. code>useEffect 잠깐만요. 자세한 내용은 여기에서 확인할 수 있습니다. 🎜🎜Evan의 온라인 데모에서 그가 렌더링 기능을 위해 useStateuseEffect에 액세스하는 위치를 볼 수 있습니다. 🎜🎜Vue의 렌더링 기능이 익숙하지 않다면 공식 웹사이트 문서를 살펴보는 것이 도움이 될 수 있습니다. 🎜🎜하지만 Vue 스타일 Hooks를 사용할 때 useData, useCompulated 등과 같이 이름을 어떻게 지정할까요? 🎜🎜그래서 Vue에서 Hooks를 사용하는 방법을 알아보기 위해 샘플 애플리케이션을 만들었습니다. 🎜

src/hooks 폴더에 useMounted hook 上阻止了滚动,并在 useDestroyed에서 스크롤을 다시 활성화하는 후크를 만들었습니다. 이렇게 하면 콘텐츠 보기 대화 상자가 열릴 때 페이지 스크롤을 일시 중지하고 보기 대화 상자가 끝나면 다시 스크롤할 수 있습니다. 이는 애플리케이션 전체에서 여러 번 사용될 수 있으므로 좋은 추상화입니다.

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;
  });
}

그런 다음 AppDetails.vue와 같은 Vue 구성 요소에서 호출할 수 있습니다.

<script>
import { preventscroll } from "./../hooks/preventscroll.js";
...export default {
  ...  hooks() {
    preventscroll();
  }
}
</script>

해당 구성 요소에서 사용할 수 있을 뿐만 아니라 전체 애플리케이션에서 동일한 기능을 사용할 수 있습니다!

서로를 이해하는 두 개의 Hook

앞서 Hook과 믹스인의 주요 차이점 중 하나는 Hook이 실제로 서로에게 값을 전달할 수 있다는 점을 언급했습니다. 간단하지만 다소 부자연스러운 예를 살펴보겠습니다.

우리 애플리케이션에서는 재사용 가능한 후크에서 계산을 수행해야 하며 해당 계산 결과를 사용해야 합니다. 우리의 경우 창 너비를 가져와서 애니메이션에 전달하는 후크가 있어서 더 큰 화면에 있을 때만 실행된다는 것을 알 수 있습니다.

자세한 내용은 비디오 데모를 참조하세요: css-tricks.com/wp-content/…

첫 번째 후크:

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
  }
}

그런 다음 두 번째 후크에서는 이를 사용하여 애니메이션 로직을 트리거하는 조건을 생성합니다.

그런 다음 구성 요소 내에서 하나의 후크를 다른 후크에 매개변수로 전달합니다.

// 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
            }
          }
        },
        ...
이제 후크를 사용하여 애플리케이션 전체에 로직을 작성할 수 있습니다! 다시 말하지만, 이는 데모 목적으로는 부자연스러운 예이지만, 더 작고 재사용 가능한 함수에서 로직을 유지하여 대규모 애플리케이션에 어떻게 효과적일 수 있는지 확인할 수 있습니다

【관련 권장 사항: 《

vue.js tutorial》】

위 내용은 Hooks가 Vue에 어떤 의미인지 이야기해 봅시다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제