学习随笔-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比较

相关推荐
青春喂了后端5 小时前
IntelliGit 前端状态层重构:把一个全局 Store 拆成清晰的状态边界
前端·重构·状态模式
Bechamz5 小时前
大数据开发学习Day36
大数据·学习
IT_陈寒6 小时前
Redis内存用爆了,原来我们都忽略了这个配置
前端·人工智能·后端
qq_2518364576 小时前
基于java Web汽车销售管理系统设计与实现
java·前端·汽车
花椒技术6 小时前
低代码平台接入 Agent 后,我们踩到的组件、上下文和追问坑
前端·人工智能·agent
happymaker06266 小时前
SpringBoot学习日记——DAY02(SpringBoot整合Swagger3)
java·spring boot·学习
豹哥学前端7 小时前
事件循环(Event Loop)深度解析:让你彻底搞懂 JS 的执行顺序
前端·javascript·面试
竹林8187 小时前
用 wagmi v2 + Next.js 14 搞 NFT 交易市场前端:从合约调用失败到顺利上架,我踩了哪些坑
javascript·next.js
前端不开发7 小时前
用一个 Bookmarklet(书签脚本),给任意网页挂一个可拖拽悬浮窗
前端·javascript