一起聊聊Hooks对Vue而言意味着什么

本篇文章给大家带来了关于hooks与vue的相关知识,hooks是react在v16.7.0-alpha版本中引入的,hooks主要是对模式的复用提供了一种更明确的思路,希望对大家有帮助。

一起聊聊Hooks对Vue而言意味着什么

不要把 Hooks 和 Vue 的生命周期钩子(Lifecycle Hooks) 弄混了,Hooks 是 React 在 V16.7.0-alpha 版本中引入的,而且几天后 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 的名称都会像 useState、useEffect 等。更多信息可以查看这里。

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

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

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

因此,为了让我们看看如何在 Vue 中使用 Hooks,我创建了一个示例应用程序供我们探索。

在 src/hooks 文件夹中,我创建了一个 hook,它在 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 组件中调用它:

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

登录后复制

我们不仅可以在该组件中使用它,还可以在整个应用程序中使用相同的功能!

能够相互理解的两个 Hooks

我们之前提到过,Hooks 和 mixins 之间的主要区别之一是 Hooks 实际上可以互相传值。让我们看一下这个简单但有点不自然的例子。

在我们的应用程序中,我们需要在一个可复用的 hook 中进行计算,还有一些需要使用该计算结果的东西。在我们的例子中,我们有一个 hook,它获取窗口宽度并将其传递给动画,让它知道只有当我们在更大的屏幕上时才会触发。

详见视频演示:css-tricks.com/wp-content/…

第一个 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  }}

登录后复制

然后,在第二个 hook 中,我们使用它来创建一个触发动画逻辑的条件:

// 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            }          }        },        ...

登录后复制

然后,在组件内部,我们将一个 hook 作为参数传递给另一个 hook:

import { logolettering } from "./../hooks/logolettering.js";import { windowwidth } from "./../hooks/windowwidth.js";export default {  hooks() {    logolettering(windowwidth());  }};

登录后复制

现在我们可以在整个应用程序中使用 Hooks 来编写逻辑!再提一下,这是一个用于演示目的不太自然的例子,但你可以看到这对于大型应用程序,将逻辑保存在较小的、可复用的函数中是有效的

【相关推荐:《vue.js教程》】

以上就是一起聊聊Hooks对Vue而言意味着什么的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2937636.html

(0)
上一篇 2025年3月11日 21:14:50
下一篇 2025年2月24日 02:33:09

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • vue和laravel有什么区别

    vue和laravel的区别:1、vue是一款基于JavaScript语言的开源Web应用框架,而laravel是一款基于PHP语言的Web开源框架;2、vue的体积小、学习成本低,而laravel的体积大、学习成本高。 本教程操作环境:w…

    2025年3月11日
    200
  • vue-router两种模式有什么区别

    区别:1、history的url没有“#”号,而hash有;3、history修改的url可以是同域的任意url,而hash是同文档的url;3、相同的url,history会触发添加到浏览器历史记录栈中,而hash不会触发。 本教程操作环…

    2025年3月11日
    200
  • vue的优势是什么

    vue的优势是:1、可以进行组件化开发,使代码编写量大大减少;2、可以对数据进行双向绑定;3、使用Vue.js编写出来的界面效果本身就是响应式的,这使网页在各种设备上都能显示出非常好看的效果;4、使用路由不会刷新页面。 本教程操作环境:wi…

    2025年3月11日
    200
  • vscode用哪些vue插件

    vue开发插件有:1、“Vetur”,用于语法高亮、智能感知等;2、“EsLint”,用于语法纠错;3、“Path Intellisense”,用于自动路径补全;4、“HTML CSS Support”;5、“Beautify”等。 本教程…

    2025年3月11日
    200
  • vue基本类型都有哪些

    vue的基本类型有:1、字符串(Sring)类型,是一段以单引号或双引号包裹起来的文本;2、布尔值(Boolean)类型,只有true和false两个值;3、数字(Number)类型,用来定义数值,不区分整数和小数。 本教程操作环境:win…

    2025年3月11日
    200
  • vue有什么常用api

    vue的api有:1、nextTick;2、mixin;3、“$forceUpdate”;4、set和delete;5、filter;6、directive;7、“$root”;8、“$el”;9、“$data”;10、“$props”等。…

    2025年3月11日
    200
  • angular和vue有什么区别

    区别:1、vue占用空间较小,而angular较大;2、Vue比Angular灵活,可按照不同需要去组织项目的应用代码;3、vue简单易学,angular的上手难度较高;4、angular指令是“ng-xxx”,vue指令是“v-xxx”。…

    2025年3月11日
    200
  • vue如何删除数组元素

    删除方法:1、用forEach遍历数组,用splice方法删除下标为index的元素,语法“this.splice(index, 1);”;2、用filer()删除,语法“listArr.filter(item=>item.check…

    2025年3月11日
    200
  • vue怎么将数组转为字符串

    在vue中,可以利用join()方法来将数组转为字符串,该方法可以将数组作为字符串返回,数组元素会使用指定分隔符进行分隔;语法为“数组对象.join(‘分隔符’)”。 本教程操作环境:windows7系统、vue2.…

    2025年3月11日
    200
  • 什么叫vue生命周期

    在vue中,生命周期是指vue实例对象从创建之初到销毁的过程。vue所有的功能实现都是围绕其生命周期进行的,在生命周期的不同阶段调用对应的钩子函数实现组件数据管理和DOM渲染两大重要功能。 本文操作环境:windows10系统、Vue2.9…

    2025年3月11日
    200

发表回复

登录后才能评论