Vue3中的hook

2023-11-01

一、hook的基本使用

Vue3中的hook通常被称为Composition API,是Vue.js框架中的一个重要特性。它们的本质是一些可以在组件内部使用的函数,这些函数能够让你在不影响组件逻辑的情况下,增强和扩展组件的功能。

Hook主要作用允许在组件之间重用状态逻辑。举个例子,如果你有一个处理异步请求和管理请求状态的功能,那么你可能会在多个组件中需要这个功能。在Vue2.x中,你可能需要使用mixins或者HOC(高阶组件)来抽象和重用这些逻辑,但这通常会导致命名冲突和逻辑混乱。

而使用Vue3中的或者说Composition API,就无需担心上述问题。你可以通过调用useFetch这样的自定义hook,来在任何组件中很容易地重用异步请求逻辑。例如:

import { reactive, onMounted } from 'vue';

function useFetch(url) {
  const state = reactive({
    data: null,
    loading: true,
    error: null
  });
  
  const fetchData = async () => {
    try {
      const response = await fetch(url);
      const data = await response.json();
      state.data = data;
      state.loading = false;
    } catch (error) {
      state.error = error;
      state.loading = false;
    }
  };
  
  onMounted(fetchData);
  
  return state;
}

export default useFetch;

这样,在其他组件中,我们可以很简单地使用这个状态:

import useFetch from './useFetch';

export default {
  setup() {
    const posts = useFetch('/api/posts');
    
    return {
      posts
    };
  }
};

这里的useFetch就是一个自定义的hook(或者说是Composition API),它可以在各个组件之间重用。

二、vue3中的hook和mixin的对比

Vue3中的hook(复用性函数)和mixin(混入)都是Vue.js中为实现逻辑复用和代码组织提供的机制。不过,这两种方式有一些不同之处。以下是部分对比:

1.复用性:``mixin允许多个Vue组件共享JavaScript功能,但mixin内的生命周期函数不易理解,容易导致命名冲突。Vue3hook`则是以函数形式将可复用性内容提取出来,可解决命名冲突的问题。

2.逻辑相关性:,由于mixin混入方法、生命周期函数中的逻辑可能散落在一整块的代码中,不方便管理与维护;而在Vue3中,hook更容易形成一块独立的、能够根据功能集中管理的代码。

3.类型支持:通过mixin混入的属性或方法,在类型系统中很难得到良好的支持。Vue3通过Composition APIhook,因其都是通过函数返回值主动暴露出来的,因此在TypeScript环境下有更好的类型推导支持。

4.逻辑组织mixin无法将一个大的组件拆分为使用mixin的更小函数单元,而Vue3中的hook能够轻松实现这一点。

Hooks Mixins
定义 hook是通过Composition API引入的一种新特性,类似于React的hook。 mixin是一种对Vue组件进行扩展的方式。
功能 它可以组织和重用逻辑。在组件中,我们可以创建和重用复杂的逻辑代码,使得组件的逻辑更加清晰和可维护。 它可以将组件の代码封装到一个可复用的模块。常用于将公用的代码片段进行抽离,实现复用,使得组件的逻辑更加清晰和可维护。
使用 使用setup方法,可以组织和复用各类逻辑. 使用mixin属性,加载公用的代码片段。
组织代码效果 使用Hooks,我们可以让组件的逻辑函数按功能组织,使得组件的逻辑结构更加清晰。 使用Mixins,我们可以将组件的各个生命周期的相关函数统一放在一起,但这样做可能会使得组件的逻辑函数分散在各个生命周期中。
冲突问题 Hooks允许我们命名冲突的功能,从而避免了各种命名冲突。 Mixins可能会导致函数名冲突。如果两个mixin中包含相同的函数,会导致后一个mixin的函数覆盖先前的函数。
难以追踪的来源 Hooks使用的是函数,所以如果不加注释,可能不太容易找到其来源。 在Mixin中,我们可以在每个使用了公用代码片段的地方都用注释表明这段代码の来源,有助于我们更好地追踪和维护代码。
Debug困难度 Hooks有更好的Stack Trace,可以提供更优秀的debug体验。 对mixins的支持可能会出现在运行时错误的情况下,无法找到那块代码が出错的问题,从而导致调试困难。

举个例子说明这两者的区别:

使用mixin的部分:

//定义一个mixin
let myMixin = {
  created: function () {
    this.hello()
  },
  methods: {
    hello: function () {
      console.log('hello from mixin!')
    }
  }
}

//在组件中使用mixin
var Component = Vue.extend({
  mixins: [myMixin]
})

这里"hello"方法是被添加到该组件的methods属性中的,并且在组件的created生命周期钩子被调用后,也调用了mixin中的created。

使用hook的部分:

//定义一个hook
function useHello() {
  const hello = () => {
    console.log('hello from hook!');
  }
  
  onMounted(hello);
  
  return {
    hello
  };
}

//在组件中使用hook
const Component = {
  setup() {
    const { hello } = useHello();
    return {
      hello
    }
  }
}

在这里,使用"onMounted"函数代替了"created"生命周期钩子,并且"hello"函数是从hook中解构出来的。相比之下,Vue3hook将逻辑保持在一个独立的函数中,使得组件代码保持清晰。

注意vue3中可以继续使用mixin,但是,Vue 3推荐使用Composition API来组合和重用逻辑,这使得逻辑组合和重用变得更加方便和灵活,而且可读性和可维护性也更好。根据Vue 3 的官方文档,MixinVue 3已经被认为是一种过时的API,而将来可能会被Composition API完全取代

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vue3中的hook 的相关文章

随机推荐

  • CSS——背景(background)和列表(list-style)

    背景 background attachment图片滚动条滚动 div width 300px height 2000px background image url img a31c4997d0d261be5329cf402f6b7ec1
  • 异常数据剔除

    1 在SPSS中做箱型图 图中可以显示异常值 然后剔除 但问题是大数据 采用箱形图已经不显示了 2 拉依达准则法 3 简单 无需查表 测量次数较多或要求不高时用 是最常用的异常值判定与剔除准则 但当测量次数 10次时 该准则失效 如果实验数
  • conda安装opencv

    conda install chttps conda binstar org menpo opencv
  • Cef经典N大问题

    1 cef启动 退出的时候怎么崩溃了 答 如果是启动时崩溃 请看资源目录是否文件都齐全 退出的话见https github com fanfeilong cefutil blob master doc CEF Close md 如果是cen
  • mysql和m_MySQL-----(M-S,和,M-M)

    实验项目 一主多备 双主双备 一 一主多备 1 需要至少两台MySQL 一台主 一台备 在主备上创建数据库 mysql uroot p123 create databse HA use HA create table T1 id int n
  • 详解:字符转换函数(大写转小写,小写转大写)

    对于我们在刚刚学习C语言的时候的练习题 不知道大家还能记得多少 多组输入 输入一个英文字符 判断 如果是大写 则输出小写 如果是小写 则输出大写 这个题目 其实在刚刚开始学习的时候 为难了笔者老久都没有攻克 主要还是在于 回车键没有抵消 所
  • 使用OpenAPIKey来调用ChatGPT并解决生成回答控制台显示不全的问题

    使用OpenAPIKey来调用ChatGPT并解决生成回答控制台显示不全的问题 Code import os import openai import re def get ai response prompt engine text da
  • react-lazyload懒加载控件源码解析

    简介 本篇文章主要介绍一个优秀的基于react实现的懒加载控件 github com twobin reac 优点 易于使用 比如
  • 基于机器学习的心脏成像诊断

    心脏成像在心血管疾病 CVD 的诊断中起着重要作用 但到目前为止 它的作用仅限于对心脏结构和功能的观察和定量评估 然而 随着大数据和机器学习的出现 人工智能方法的出现将直接帮助临床医生诊断CVD 本文全面回顾了这一领域的最新研究成果 并为读
  • js数组去重常用方法

    js数组去重是面试中经常会碰到的问题 无论是前端还是node js数组常见的有两种形式 一种是数组各元素均为基本数据类型 常见的为数组字符串格式 形如 a b c 一种是数组各元素不定 元素中既有基本数据类型 也有引用数据类型 形式如 na
  • 某书最新版X-s(2023/5/23更新)

    前不久刚写过xhs的x s 前几天听一些小伙伴说又更新了 我二话不说还按原先的逆向思路 直接搜function sign 开始施展补环境大法 一顿无用的折腾 补完后 测试发现死活不成功 这真是离了大谱了 对比了一下 通过补环境 sign生成
  • 【linux】【tar】tar命令详解之czvf,xzvf

    Linux tar 英文全拼 tape archive 命令主要用于文件的打包压缩及解压 命令最初的设计目的是为了将文件备份到磁带上 tapearchive 因而得名tar 1 常用tar命令实例 打包命令 tar czvf xxx 说明
  • 代码布局优化

    代码布局优化是编译技术中的一种策略 其目的是调整程序中函数和数据的物理布局 以提高程序的执行速度 更好的代码布局能够有效利用现代处理器的特性 例如指令缓存和分支预测 从而提高性能 以下是代码布局优化的几个关键方面 指令缓存效率 当处理器执行
  • linux系统支持ntfs吗,Linux支持NTFS格式文件的方法

    一般情况下Linux系统是不支持NTFS文件系统的 所以我们不能在Linux系统中挂载NTFS文件系统类型的硬盘或移动硬盘 那么我们如何才能让Linux系统支持NTFS文件系统呢 现在我们去看看Linux支持NTFS格式文件的方法介绍 Li
  • VS 2022(Visual Studio 2022)菜单栏中增加文件-高级保存选项

    背景 最近想使用VS工具来开发Qt项目 但运行后发现程序运行中文会显示乱码 在网上找了相关资料后需要使用高级保存选项来更改文件编码为UTF 8类型 但VS2022貌似没有高级保存选项 摸索一番后发现添加该选项的方法 故而分享一下 参考连接
  • iwebsec靶场 文件包含漏洞通关笔记8-php://input伪协议利用

    目录 前言 1 php input伪协议原理 2 php input伪协议使用条件 第08关 php input伪协议利用 1 打开靶场 2 源码分析 3 伪协议渗透获取php信息 1 构造post信息 2 渗透 4 伪协议获取目录信息 1
  • 基础指针【指针的基本使用方法和注意事项】

    基础指针目录 前言 指针 指针是什么 指针的大小 指针的定义和赋值 指针的使用 传值调用和传址调用 传值调用 传址调用 指针的弊端 野指针 使用指针的注意事项 前言 指针 是我们在学习C语言中的一个重难点 关乎到我们学习C语言的深度和理解
  • module.exports、exports、export default、export、require、import

    在es5中 用 module exports 和 exports 导出模块 用 require 导入模块 在es6中 新增 export default 和 export 导出模块 用 import 导入模块 一般的 module expo
  • java 设置不缓存,java – 禁用通过外部属性的spring方法缓存

    我使用ehcache和注释驱动配置配置了 spring方法缓存 但是 我希望能够从我们在应用程序中使用的配置文件中禁用它 我的第一个想法是如果禁用方法缓存 则调用net sf ehcache CacheManager CacheManage
  • Vue3中的hook

    一 hook的基本使用 Vue3中的hook通常被称为Composition API 是Vue js框架中的一个重要特性 它们的本质是一些可以在组件内部使用的函数 这些函数能够让你在不影响组件逻辑的情况下 增强和扩展组件的功能 Hook的主