Vue 3 Hooks 教程

Vue 3 Hooks 教程

1. 什么是 Hooks?

在 Vue 3 中,Hooks 是一种组织和复用组件逻辑的强大方式。它们允许您将组件的状态逻辑提取到可重用的函数中,从而简化代码并提高代码的可维护性。

2. 基本 Hooks 介绍

2.1 refreactive

这两个函数是响应式数据的基础:

typescript 复制代码
import { ref, reactive } from 'vue'

// ref 用于基本类型
const count = ref(0)

// reactive 用于对象
const state = reactive({
  name: '张三',
  age: 25
})

2.2 computed

计算属性 Hook,用于基于其他响应式数据创建衍生状态:

typescript 复制代码
import { ref, computed } from 'vue'

const count = ref(0)
const doubleCount = computed(() => count.value * 2)

3. 生命周期 Hooks

Vue 3 提供了多个生命周期相关的 Hooks:

typescript 复制代码
import { onMounted, onUpdated, onUnmounted } from 'vue'

export function useLifecycleDemo() {
  onMounted(() => {
    console.log('组件已挂载')
  })

  onUpdated(() => {
    console.log('组件已更新')
  })

  onUnmounted(() => {
    console.log('组件即将卸载')
  })
}

4. 自定义 Hooks

4.1 创建可复用的状态逻辑

typescript 复制代码
// useCounter.ts
import { ref, computed } from 'vue'

export function useCounter(initialValue = 0) {
  const count = ref(initialValue)

  function increment() {
    count.value++
  }

  function decrement() {
    count.value--
  }

  const isPositive = computed(() => count.value > 0)

  return {
    count,
    increment,
    decrement,
    isPositive
  }
}

4.2 异步 Hooks

typescript 复制代码
// useFetch.ts
import { ref, computed } from 'vue'

export function useFetch(url: string) {
  const data = ref(null)
  const error = ref(null)
  const loading = ref(true)

  async function fetchData() {
    try {
      const response = await fetch(url)
      data.value = await response.json()
      loading.value = false
    } catch (err) {
      error.value = err
      loading.value = false
    }
  }

  fetchData()

  return {
    data,
    error,
    loading
  }
}

5. Hooks 最佳实践

  1. 保持 Hooks 简单:每个 Hook 应该专注于单一功能。
  2. 命名约定 :以 use 开头,如 useCounteruseFetch
  3. 避免副作用:尽量保持 Hooks 的纯净性。
  4. 错误处理:在 Hooks 中添加适当的错误处理机制。

6. 常见 Hooks 示例

6.1 本地存储 Hook

typescript 复制代码
import { ref, watch } from 'vue'

export function useLocalStorage(key: string, initialValue: any) {
  const storedValue = localStorage.getItem(key)
  const value = ref(storedValue ? JSON.parse(storedValue) : initialValue)

  watch(value, (newValue) => {
    localStorage.setItem(key, JSON.stringify(newValue))
  }, { deep: true })

  return value
}

6.2 鼠标位置 Hook

typescript 复制代码
import { ref, onMounted, onUnmounted } from 'vue'

export function useMousePosition() {
  const x = ref(0)
  const y = ref(0)

  function update(event: MouseEvent) {
    x.value = event.pageX
    y.value = event.pageY
  }

  onMounted(() => {
    window.addEventListener('mousemove', update)
  })

  onUnmounted(() => {
    window.removeEventListener('mousemove', update)
  })

  return { x, y }
}

7. 结论

Vue 3 的 Hooks 为组件逻辑复用提供了一种强大而灵活的方式。通过合理使用 Hooks,您可以编写更加模块化、可读和可维护的代码。

相关推荐
DarkLONGLOVE20 小时前
快速上手 Pinia!Vue3 极简状态管理使用教程
javascript·vue.js
宸翰21 小时前
解决 uni-app App 端 vue-i18n 占位符丢失:封装跨端可用的 tf 格式化方法
前端·vue.js·uni-app
用户2136610035721 天前
VueRouter进阶-动态路由与嵌套路由
前端·vue.js
暴走的小呆2 天前
Vue 2 中 Object 的变化侦测:从 getter/setter 到 Dep、Watcher、Observer
vue.js
英勇无比的消炎药2 天前
TinyVue v-auto-tip: 文本超长自动提示的优雅方案
vue.js
时光足迹2 天前
腾讯云 TRTC UniApp SDK 从入门到上线
前端·vue.js·uni-app
时光足迹2 天前
uni-app 里把加密视频嵌入页面播放?我分析了 4 种方案,只有 1 种接近完美
前端·vue.js·uni-app
时光足迹2 天前
JPush UniApp UTS 插件完全参考手册:API、事件与厂商通道一网打尽
vue.js·ios·uni-app
时光足迹2 天前
极光推送全攻略(下):uni-app 代码实现与 iOS 排查实战
vue.js·ios·uni-app
疯狂的魔鬼2 天前
一个"懂分寸"的文本省略组件是怎样炼成的
前端·vue.js·设计