首页 > 其他分享 >Vue 3 Composition API与Hooks模式

Vue 3 Composition API与Hooks模式

时间:2024-06-05 23:01:08浏览次数:22  
标签:count Vue return Hooks API export import const ref

Vue 3 的 Composition API 引入了 Hook 函数的概念,这是一种更加模块化和可重用的状态管理和逻辑组织方式。

自定义Hook

首先,我们创建一个自定义 Hook,例如 useCounter,它封装了计数器的逻辑:

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

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

  function increment() {
    count.value++;
  }

  function decrement() {
    count.value--;
  }

  return {
    count,
    increment,
    decrement
  };
}

在上面的代码中,ref 用于创建响应式数据,incrementdecrement 方法分别用于增加和减少计数器的值。return 语句暴露了可以被组件直接使用的数据和方法。

然后,在组件中,我们可以导入并使用这个 Hook:

<template>
  <div>
    <h1>Count: {{ count }}</h1>
    <button @click="increment">+</button>
    <button @click="decrement">-</button>
  </div>
</template>

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

export default defineComponent({
  setup() {
    const { count, increment, decrement } = useCounter();

    return {
      count,
      increment,
      decrement
    };
  }
});
</script>

在组件的 setup 函数中,我们调用了 useCounter Hook 并将返回的对象解构赋值给局部变量。这些变量可以直接在模板中使用,因为它们都是响应式的。

这种模式的好处在于:

  1. 逻辑分离:Hook 可以封装特定的业务逻辑,使得组件代码更清晰,更容易维护。
  2. 复用性:Hook 可以在多个组件之间共享,减少代码重复。
  3. 类型安全:在 TypeScript 中,自定义 Hook 可以提供类型定义,提高代码的可读性和可预测性。
  4. 响应式系统:通过 ref 或 reactive 创建的响应式数据,可以确保状态变化时视图的自动更新。

Vue 3 的 Composition API 结合 Hook 模式,使得开发者能够更灵活地组织和重用代码,提高了代码的可维护性和开发效率。

内置Hook

除了自定义 Hook,Vue 3 的 Composition API 还提供了许多内置 Hook,如 watch, onMounted, onBeforeUpdate, onUpdated, onBeforeUnmount, onUnmounted, toRefs, computed, watchEffect 等。

1. onMounted: 当组件挂载完成后执行的钩子。

import { onMounted } from 'vue';

export default {
  setup() {
    let element;

    onMounted(() => {
      element = document.querySelector('#someElement');
      // 在这里可以执行依赖于DOM的初始化操作
    });

    return {};
  }
};

2. computed: 计算属性,类似于 Vue 2 中的计算属性。

import { ref, computed } from 'vue';

export default {
  setup() {
    const base = ref(10);
    const multiplier = ref(2);

    const result = computed(() => {
      return base.value * multiplier.value;
    });

    return {
      base,
      multiplier,
      result
    };
  }
};

3. watch: 监听响应式数据的变化。

import { ref, watch } from 'vue';

export default {
  setup() {
    const base = ref(10);
    const multiplier = ref(2);

    watch(base, (newBase, oldBase) => {
      console.log(`Base changed from ${oldBase} to ${newBase}`);
    });

    return {
      base,
      multiplier
    };
  }
};

4. watchEffect: 在任何依赖改变时运行的副作用函数。

import { ref, watchEffect } from 'vue';

export default {
  setup() {
    const base = ref(10);
    const multiplier = ref(2);

    watchEffect(() => {
      console.log(`Result: ${base.value * multiplier.value}`);
    });

    return {
      base,
      multiplier
    };
  }
};

5. toRefs: 将对象的属性转换为响应式引用,以便直接在模板中使用。

import { ref, toRefs } from 'vue';

export default {
  props: {
    user: {
      type: Object,
      required: true
    }
  },
  setup(props) {
    const { name, age } = toRefs(props.user);

    return {
      name,
      age
    };
  }
};

6. reactive: 创建一个响应式对象,允许深度监听对象的属性变化。

import { reactive } from 'vue';

export default {
  setup() {
    const state = reactive({
      count: 0,
      user: {
        name: 'John Doe',
        age: 30
      }
    });

    function increment() {
      state.count++;
    }

    return {
      state,
      increment
    };
  }
};

7. provide/inject: 提供和注入依赖,类似于 Vue 2 中的非响应式版本,但Vue 3中可以提供响应式数据。

// 父组件
import { provide } from 'vue';

export default {
  setup() {
    const theme = ref('light');

    provide('theme', theme);

    return {};
  }
};
// 子组件
import { inject } from 'vue';

export default {
  setup() {
    const theme = inject('theme');

    return {
      theme
    };
  }
};

8. watch with options:

提供更细粒度的控制,如深度监听、异步处理和仅在初始值更改时触发。

import { ref, watch } from 'vue';

export default {
  setup() {
    const base = ref(10);
    const multiplier = ref(2);

    watch(
      [base, multiplier],
      ([newBase, newMultiplier], [oldBase, oldMultiplier]) => {
        if (newBase !== oldBase || newMultiplier !== oldMultiplier) {
          console.log(`Result: ${newBase * newMultiplier}`);
        }
      },
      {
        deep: true, // 深度监听
        immediate: true // 初始值更改时立即触发回调
      }
    );

    return {
      base,
      multiplier
    };
  }
};

9. effectScope: 用于在特定作用域内运行副作用,便于清理和管理。

import { effectScope, ref } from 'vue';

export default {
  setup() {
    const scope = effectScope();
    const count = ref(0);

    const stopEffect = scope.run(() => {
      console.log('Effect running');
      scope.watch(count, () => {
        console.log(`Count is now: ${count.value}`);
      });
    });

    return {
      count,
      stopEffect
    };
  }
};

标签:count,Vue,return,Hooks,API,export,import,const,ref
From: https://blog.csdn.net/A1215383843/article/details/139484116

相关文章

  • 『手撕Vue-CLI』拷贝模板
    开篇经过上篇文章的介绍,实现了可以根据用户选择的模板名称加上对应的版本号,可以下载对应的模板,并且将下载之后的文件存放在用户目录下的.nue-template文件夹中。接下来这篇文章主要实现内容是将下载的模板文件拷贝到当前所执行命令的目录下。拷贝模板例如我现在在终端当中输......
  • 最新OpenAI免费API-openai api key获取方式
    最近又开始准备LLM应用开发,要用到apikey,才发现过我之前免费发放的额度没了!我都没咋用过,痛心......
  • vue 实现路由权限方式2,通过菜单角色,和用户角色是否重合实现匹配过滤权限
    接口数据查看,业务方式查看给角色分配路由权限,然后路由信息上meta就会有哪些角色可以访问的数组。就是说一个路径,哪些角色可以访问,都在meta下的roles里面保存着接着用户角色分配前端代码实现核心代码通过用户信息上用户的角色数组和路由meta上的角色数组是否包含用户角色......
  • 前端-Vue 快速上手
    Vue概念:Vue是一个用于构建用户界面的渐进式框架①构建用户界面:基于数据动态渲染页面②渐进式:循环渐进的学习③框架:一套完整的项目解决方案,提升开发效率↑(理解记忆规则)   规则→官网(v2.cn.vuejs.org / cn.vuejs.org)Vue的两种使用方式:1.Vue核......
  • Vue 3 Teleport:掌控渲染的艺术
    title:Vue3Teleport:掌控渲染的艺术date:2024/6/5updated:2024/6/5description:这篇文章介绍了Vue3框架中的一个创新特性——Teleport,它允许开发者将组件内容投送到文档对象模型(DOM)中的任意位置,即使这个位置在组件的挂载点之外。Teleport旨在解决某些特定场景下的布局和......
  • Vue的viewUI框架安装与使用
    1.安装pycharm进入到项目目录C:\Users\Administrator\PycharmProjects\myvue02>npminstallview-design--save 2.引用在项目的src/main.js中加入如下代码【src/main.js】importVuefrom'vue'importAppfrom'./App.vue'importViewUIfrom'view-design&......
  • vue中html导出成word
    vue中将html中内容转换为word文档导出,无需模板,可以导出echarts图表。使用html-docx-js、file-saver。先将html中内容获取,之后将页面上的元素转成图片,然后把图片放到word文件中进行导出。参考链接:https://blog.csdn.net/weixin_47494533/article/details/13701867......
  • vue中html导出成word
    vue中将html中内容转换为word文档导出,无需模板,可以导出echarts图表。使用html-docx-js、file-saver。先将html中内容获取,之后将页面上的元素转成图片,然后把图片放到word文件中进行导出。参考链接:https://blog.csdn.net/weixin_47494533/article/details/137018678 ......
  • Ant Design Vue 动态表头并填充数据
    AntDesignVue动态表头并填充数据AntDesignVue是基于AntDesign的Vue版本,它为Vue.js提供了一套高质量的UI组件库。在本文中,我们将介绍如何使用AntDesignVue创建一个动态表头并填充数据。首先,确保你已经安装了AntDesignVue。如果还没有安装,可以通过以下命......
  • FastAPI-1:现代网络
    1现代网络曾几何时,网络小而简单。开发者们把PHP、HTML和MySQL调用放到一个文件中,然后自豪地告诉大家去看看他们的网站,这样做非常有趣。但随着时间的推移,网络发展到了数以亿计,不对,是数以万亿计的页面,早期的游乐场变成了主题公园的元宇宙。在本章中,我将指出一些与现代网络日......