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,您可以编写更加模块化、可读和可维护的代码。

相关推荐
码海扬帆:前端探索之旅7 小时前
深度定制 uni-combox:新增功能详解与实战指南
前端·vue.js·uni-app
换日线°11 小时前
vue 加入购物车抛物线动画
前端·javascript·vue.js
计算机学姐11 小时前
基于微信小程序的图书馆座位预约系统【uniapp+springboot+vue】
vue.js·spring boot·微信小程序·小程序·java-ee·uni-app·intellij-idea
镜宇秋霖丶13 小时前
2026.5.8@霖宇博客制作中遇见的问题
前端·vue.js·elementui
花归去15 小时前
vue3中 function getText(){} 、 const getText=()=>{} ;区别在哪里,优缺点
javascript·vue.js·ecmascript
web行路人16 小时前
前端对Commands(斜杠命令)一些常用
前端·javascript·vue.js·vue
饺子不吃醋16 小时前
深入理解 Vue 3 的 setup(含 Composition API)
前端·vue.js
UXbot18 小时前
AI画原型工具如何帮非设计师快速生成UI界面
前端·vue.js·ui·kotlin·swift·原型模式·web app
invicinble20 小时前
前端框架使用vue-cli( 第二层:工程配置层--4.axios需要做的基础配置)
前端·vue.js·前端框架