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

相关推荐
vipbic1 天前
我封装了一个“瑞士军刀”级插件,并顺手搞定了自动化部署
vue.js·nuxt.js
Youyzq1 天前
前端项目发布到cdn上css被编译失效问题rgba失效和rgb失效
前端·css·算法·cdn
San30.1 天前
深入 JavaScript 内存机制:从栈与堆到闭包的底层原理
开发语言·javascript·udp
Fantastic_sj1 天前
Vue3相比Vue2的改进之处
前端·javascript·vue.js
灰灰勇闯IT1 天前
RN路由与状态管理:打造多页面应用
开发语言·学习·rn路由状态
vipbic1 天前
解决npm publish的404/403和配置警告全记录
前端·npm·node.js
Bigger1 天前
🚀 “踩坑日记”:shadcn + Vite 在 Monorepo 中配置报错
前端·react.js·vite
ttod_qzstudio1 天前
深入理解 TypeScript 数组的 find 与 filter 方法:精准查找的艺术
javascript·typescript·filter·find
思成不止于此1 天前
【MySQL 零基础入门】DQL 核心语法(四):执行顺序与综合实战 + DCL 预告篇
数据库·笔记·学习·mysql
冬男zdn1 天前
优雅处理数组的几个实用方法
前端·javascript