当前位置: 首页 > article >正文

vue3中mixins替代方案

使用自定义 Hooks(Composables)

自定义 Hooks 是一种基于函数的代码复用方式,可以在 setup 函数中使用。它允许将组件的逻辑分割成更小的、可复用的部分。

useCounter.js

//useCounter.js
import { ref, onMounted } from 'vue';

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

  const increment = () => {
    count.value++;
  };

  onMounted(() => {
    console.log('Counter initialized');
  });

  return { count, increment };
}
<!--MyComponent.vue-->
<template>
  <div>
    <p>{{ count }}</p>
    <button @click="increment">Increment</button>
  </div>
</template>

<script setup>
import { useCounter } from './useCounter';

const { count, increment } = useCounter();
</script>

使用全局 Composition API 函数

如果逻辑需要在多个组件之间共享,可以创建全局的 Composition API 函数,并在需要的地方导入和使用

//globalComposables.js

import { ref } from 'vue';

export function useGlobalLogic() {
  const globalData = ref('Global data');

  return { globalData };
}
<!--MyComponent.vue-->
<template>
  <div>
    <p>{{ globalData }}</p>
  </div>
</template>

<script setup>
import { useGlobalLogic } from './globalComposables';

const { globalData } = useGlobalLogic();
</script>

使用 Vuex 或 Pinia 进行状态管理

如果应用需要全局状态管理,Vuex 或 Pinia 是更好的选择。它们提供了更强大的状态管理功能,包括状态持久化、模块化和调试工具等
Vuex 示例:

//store.js
import { createStore } from 'vuex';

export default createStore({
  state: {
    counter: 0
  },
  mutations: {
    increment(state) {
      state.counter++;
    }
  },
  actions: {
    increment({ commit }) {
      commit('increment');
    }
  },
  getters: {
    counter: state => state.counter
  }
});
<!--MyComponent.vue-->
<template>
  <div>
    <p>{{ counter }}</p>
    <button @click="incrementCounter">Increment</button>
  </div>
</template>

<script setup>
import { useStore } from 'vuex';

// 使用 Vuex store
const store = useStore();

// 从 store 中获取状态
const counter = computed(() => store.state.counter);

// 定义一个方法来调用 store 中的 action
const incrementCounter = () => {
  store.dispatch('increment');
};
</script>

Pinia 示例:

//store.js

import { defineStore } from 'pinia';

export const useCounterStore = defineStore('counter', {
  state: () => ({
    counter: 0
  }),
  actions: {
    increment() {
      this.counter++;
    }
  }
});
<!--MyComponent.vue-->

<template>
  <div>
    <p>{{ counter }}</p>
    <button @click="incrementCounter">Increment</button>
  </div>
</template>

<script setup>
import { computed } from 'vue';
import { useCounterStore } from './store';

// 使用 Pinia store
const counterStore = useCounterStore();

// 从 store 中获取状态
const counter = computed(() => counterStore.counter);

// 定义一个方法来调用 store 中的 action
const incrementCounter = () => {
  counterStore.increment();
};
</script>

**总结:**Vue 3 提供了多种替代 mixins 的方案,包括自定义 Hooks(Composables)、全局 Composition API 函数以及状态管理库(如 Vuex 或 Pinia)。这些方案提供了更灵活、可维护和可测试的代码组织和复用方式。


http://www.kler.cn/a/468444.html

相关文章:

  • 后台运行 Python
  • 现代密码学期末重点(备考ing)
  • 【CPU】堆栈和堆栈指针(个人草稿)
  • Spring MVC实战指南:构建高效Web应用的架构与技巧(三)
  • AlphaPi相关硬件驱动提取
  • 提升汽车金融租赁系统的效率与风险管理策略探讨
  • 【深度学习】Java DL4J基于 CNN 构建农作物病虫害检测模型
  • 【react】常见的性能优化 1
  • 如何用Python爬虫获得淘宝商品详情API返回值说明
  • 在 HTC 手机和计算机之间快速传输视频/电影
  • asp.net core webapi中的数据注解与数据验证
  • Flink使用
  • Three.js教程011:贴图的加载与环境遮蔽贴图强度设置
  • 计算机网络--应用层--HTTP
  • 【HDU】1090 A+B for Input-Output Practice (II)
  • maven的中国镜像有哪些
  • 【QED】魔咒解密
  • USB子系统学习(一)USB电气信号
  • Nginx——静态资源部署(二/五)
  • 基于word2vec的文本大数据分析
  • OpenCV计算机视觉 05 图像边缘检测(Sobel算子、Scharr算子、Laplacian算子、Canny边缘检测)
  • 印象笔记07——试一试PDF标注
  • Go语言的 的引用数据类型(Reference Data Types)基础知识
  • 【DevOps】Jenkins项目发布
  • Linux驱动开发(17):输入子系统–电阻触摸驱动实验
  • 宝塔docker安装milvus向量库