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

Vue 3.0 自定义 Composition API 管理状态

自定义 Composition API 用于管理状态,先明确一个思路,Composition API 封装的是将视图与状态解耦,所以状态解耦是我们封装的第一目标,首先我们需要分析有哪些必要状态、有哪些必要处理函数,进而在组件中使用即可。

在 Vue 3 中,自定义 Composition API 通过组合函数来封装逻辑,提供了一种更灵活和可重用的方式来管理组件状态。

下面是两个详细的例子,分别展示了如何封装拖拽逻辑和动画逻辑。

1. 封装拖拽逻辑 useDrag

1.1. 创建组件useDrag

import { ref, onMounted, onUnmounted } from 'vue';export function useDrag() {const position = ref({ x: 0, y: 0 });const isDragging = ref(false);const onMouseDown = (event) => {isDragging.value = true;position.value = { x: event.clientX, y: event.clientY };}const onMouseMove = (event) => {if (isDragging.value) {const deltaX = event.clientX - position.value.x;const deltaY = event.clientY - position.value.y;position.value = { x: event.clientX, y: event.clientY };document.documentElement.style.setProperty('--drag-x', ~$(deltaX)px');document.documentElement.style.setProperty('--drag-y', ~$(deltaY)px');}};const onMouseUp = () => {isDragging.value = false;};onMounted(() => {window.addEventListener('mousemove', onMouseMove);window.addEventListener('mouseup', onMouseUp);});onUnmounted(() => {window.removeEventListener('mousemove', onMouseMove);window.removeEventListener('mouseup', onMouseUp);});return {position,onMouseDown};
}

1.2. 使用组件useDrag

<template><div class="draggable" @mousedown="onMousedown">Drag me!</div>
</template><script>
import { useDrag } from './useDrag';export default {setup() {const { onMouseDown } = useDrag();return {onMousedown: onMouseDown};}
};
</script><style>
.draggable {position: absolute;top: calc(50% + var(--drag-y, 0px));left: calc(50% + var(--drag-x, 0px));transform: translate(-50%, -50%);background-color: lightblue;padding: 20px;cursor: grab;
}
</style>

1.3. useDrag总结

1. 状态管理:position 用于跟踪拖拽元素的位置,isDragging 用于指示是否正在拖拽;

2. 事件处理:

(1). onMouseDown:记录初始化位置并设置拖拽状态;

(2). onMouseMove:根据鼠标移动更新位置,并通过 CSS 变量更新元素位置;

(3). onMouseUp:结束拖拽;

3. 生命周期管理:在组件挂载和卸载时分别添加和移除事件监听器;

2. 封装动画逻辑useAnimation

2.1. 创建组件useAnimation

import { ref, onMounted, onUnmounted } from 'vue';export function useAnimation(animationName, duration) {const isAnimating = ref(false);const startAnimation = () => {isAnimating.value = true;setTimeout(() => {isAnimating.value = false;}, duration);};return {isAnimating,startAnimation};
}

2.2. 使用组件useAnimation

<template><div :class="{ animated: isAnimating }" @click="startAnimation">Click me to animate!</div>
</template><script>
import { useAnimation } from './useAnimation';export default {setup() {const { isAnimating, startAnimation } = useAnimation('fade', 1000);return {isAnimating,startAnimation};}
};
</script><style>
.animated {animation: fade 1s;
}@keyframes fade {0% { opacity: 0; }100% { opacity: 1; }
}
</style>

2.3. useAnimation总结

1. 状态管理:isAnimating 用于指示动画状态;

2. 动画控制:startAnimation 函数用于触发动画,并在动画结束后重置状态;


文章转载自:
http://allopatric.hfstrb.cn
http://chongqing.hfstrb.cn
http://carina.hfstrb.cn
http://calumniation.hfstrb.cn
http://bench.hfstrb.cn
http://carboxylase.hfstrb.cn
http://aetiological.hfstrb.cn
http://bereaved.hfstrb.cn
http://alienate.hfstrb.cn
http://caffeic.hfstrb.cn
http://auroral.hfstrb.cn
http://bluebell.hfstrb.cn
http://chase.hfstrb.cn
http://adriatic.hfstrb.cn
http://asperifoliate.hfstrb.cn
http://akyab.hfstrb.cn
http://chemicophysical.hfstrb.cn
http://carnality.hfstrb.cn
http://antivirus.hfstrb.cn
http://broadways.hfstrb.cn
http://brushability.hfstrb.cn
http://bedmaker.hfstrb.cn
http://barish.hfstrb.cn
http://acknowledgment.hfstrb.cn
http://artificial.hfstrb.cn
http://buchmanism.hfstrb.cn
http://arnica.hfstrb.cn
http://apport.hfstrb.cn
http://autodidact.hfstrb.cn
http://aidant.hfstrb.cn
http://www.dtcms.com/a/215576.html

相关文章:

  • 决策树 GBDT XGBoost LightGBM
  • 引导者之歌------------嵌入式软件面试问题集成
  • uni-app(6):Vue3语法基础下
  • vue + ant-design + xlsx 实现Excel多Sheet页导出功能
  • pycharm 新UI 固定菜单栏 pycharm2025 中文版
  • day 23 机器学习管道(pipeline)
  • -资产收集篇FridaHOOKXposed证书提取单向双向检验抓包
  • Python入门手册:函数的定义和使用
  • 【C/C++】多线程下自旋锁的行为逻辑
  • Siege:开源的 HTTP/FTP 压力测试与基准评估工具!全参数详细教程!Kali Linux教程!
  • 网络套接字基础使用和概念
  • 【Mini-F5265-OB开发板试用测评】按键控制测试
  • AWS创建github相关的角色
  • go tour方法和接口
  • Mobaxterm解锁Docker
  • OpenCV CUDA模块图像处理------颜色空间处理之颜色空间转换函数cvtColor()
  • 高效多线程图像处理实战
  • 知识图谱:AI时代语义认知的底层重构逻辑
  • ASP.NET Web Forms框架识别
  • WPF【11_4】WPF实战-重构与美化(MVVM 架构)
  • ArcGIS Pro 3.4 二次开发 - 知识图谱
  • 飞牛fnNAS手机相册备份及AI搜图
  • 私服 nexus 之间迁移 npm 仓库
  • 融智学“新五常”框架:五维方式的重构与协同
  • 银河麒麟V10×R²AIN SUITE:用AI重构安全,以国产化生态定义智能未来
  • libvirt设置虚拟机mtu实现原理
  • 强大的免费工具,集合了30+功能
  • Ansible 配置Playbook文件格式、关键字和语法详解
  • WPF【11_8】WPF实战-重构与美化(UI 与视图模型的联动,实现INotifyPropertyChanged)
  • Leetcode-5 好数对的数目