学习随笔-hooks和mixins

·)hooks

javascript 复制代码
// useCounter.js
import { ref, onMounted } from 'vue'

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

  const load = () => {
    const v = localStorage.getItem('count')
    if (v) count.value = Number(v)
  }
  const save = () => {
    localStorage.setItem('count', count.value)
  }
  const inc = () => {
    count.value++
    save()
  }

  onMounted(load)        // 生命周期也封装进去
  return { count, inc }   // 显式导出
}
javascript 复制代码
<script setup>
import { useCounter } from './useCounter'
const { count, inc } = useCounter()  // 哪里需要就引哪里
</script>

<template>
  <button @click="inc">{{ count }}</button>
</template>
  • 函数级粒度 ;可以 return { a, b } 只拿 a。

  • 任意嵌套组合:

    javascript 复制代码
    export function useFoo() {
      const { count, inc } = useCounter() // hook 里再调 hook
      const double = computed(() => count.value * 2)
      return { count, double, inc }
    }

hooks 坑集(易解决)

  1. 多次调用重复 state

    同一 hook 在多个组件调用 → 各有一份 state;需要共享可抽 useStorepinia

  2. 忘记 return

    函数没 return → 组件拿不到变量,立即报错,反而更安全。

  3. 循环调用

    hook 里写 onMounted 里再调自己 → 无限递归,逻辑一目了然易修。

·)mixins

javascript 复制代码
// counterMixin.js
export default {
  data() {
    return { count: 0 }
  },
  created() {
    this.load()
  },
  methods: {
    load() {
      const v = localStorage.getItem('count')
      if (v) this.count = Number(v)
    },
    save() {
      localStorage.setItem('count', this.count)
    },
    inc() {
      this.count++
      this.save()
    }
  }
}
javascript 复制代码
// MyComp.vue
import counterMixin from './counterMixin'
export default {
  mixins: [counterMixin],   // 黑盒注入
  created() {                // 生命周期合并
    console.log('组件自身 created')
  }
}
  • 只能整体引入;无法只复用其中一部分逻辑。

  • 多个 mixins 组合时可能出现链式依赖(A 依赖 B 的 data),调试困难。

mixins 坑集(官方文档自嘲)

  1. 命名冲突

    两个 mixin 都有 load() → 后者覆盖前者,静默失败。

  2. 依赖隐式

    mixin A 里用 this.user 要求组件必须自己声明 user,否则运行时 undefined

  3. 合并策略混乱

    data 是深合并,methods 是覆盖,hooks(生命周期)是队列,记忆成本高。

  4. 来源不明

    组件里 20 个字段,不知道谁注入的,IDE 无法跳转。

·)hooks和mixins比较

相关推荐
powerfulhell9 小时前
寒假python作业5
java·前端·python
木子啊9 小时前
前端组件化:模板继承拯救发际线
前端
三十_A9 小时前
零基础通过 Vue 3 实现前端视频录制 —— 从原理到实战
前端·vue.js·音视频
前端小菜袅9 小时前
PC端原样显示移动端页面方案
开发语言·前端·javascript·postcss·px-to-viewport·移动端适配pc端
蒸蒸yyyyzwd9 小时前
分布式算法学习笔记1.1-1.4
笔记·学习
Highcharts.js9 小时前
如何使用Highcharts SVG渲染器?
开发语言·javascript·python·svg·highcharts·渲染器
We་ct9 小时前
LeetCode 228. 汇总区间:解题思路+代码详解
前端·算法·leetcode·typescript
爱问问题的小李9 小时前
ue 动态 Key 导致组件无限重置与 API 重复提交
前端·javascript·vue.js
匆匆那年96710 小时前
llamafactory推理消除模型的随机性
linux·服务器·学习·ubuntu
码云数智-大飞10 小时前
从回调地狱到Promise:JavaScript异步编程的演进之路
开发语言·javascript·ecmascript