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

相关推荐
IT_陈寒4 分钟前
Java线程池用错参数,我的服务居然悄悄崩溃了
前端·人工智能·后端
扶风ff16 分钟前
练题簿小程序:家庭在线练题,课后复习更简单
学习·小程序
传奇开心果编程16 分钟前
【Flutter入门练中学】第2课:布局系统
学习·flutter·ui
卡布鲁19 分钟前
React useMemo 与 useCallback 完全指南:原理、场景与避坑
前端·react.js
彧azz34 分钟前
Linux 网络编程学习总结
linux·网络·笔记·学习·面试
碳基修炼35 分钟前
排查记:本地 devServer 是 http,浏览器却把 302 重定向升级成了 https
前端·http
步行cgn37 分钟前
Spring p 命名空间注入详解
java·前端·spring
何何____44 分钟前
Vue 生命周期详解
前端·javascript
一尘之中1 小时前
指挥控制中心与指控系统:概念、应用、厂商与DDS技术全景
学习·架构·ai写作
江米小枣tonylua1 小时前
TypeScript 全面の拥抱 !Prisma 8 + Electron 升级实战
前端