Vue3逻辑复用及内置组件

news2024/9/20 20:18:43

 Vue3的逻辑复用主要通过“组合式函数”、“自定义指令”及“插件”来实现。提高了代码复用性,增强代码可维护性及促进团队合作。

1 逻辑复用

1.1 组合式函数

利用Vue组合式API来封装和复用有状态逻辑的函数。对组合式函数有如下约定:

  1. 命名,用驼峰法,并以use作开头。
  2. 输入参数,可以接收ref或getter类型的参数,最好用toValue()函数处理下这种类型的参数。
  3. 推荐始终返回一个包含多个ref的普通的非响应式对象。这样对该对象在组件中解构后仍可以保持响应性。
  4. 确保在onUnmounted()时清理副作用。
  5. 组合式函数只能在<script setup>或setup()钩子中被调用。也只能被同步调用。
import { ref, toValue, watchEffect} from "vue";
import type {Ref} from "vue"
export function useFetch(url: string | Ref<any> ) {
    const data = ref(null)
    const error = ref(null)
    const fetchFun = () => {
        data.value = null
        error.value = null
        fetch(toValue(url))
            .then((res) => res.json())
            .then((json) => (data.value = json))
            .catch((err) => (error.value = err))
    }
    watchEffect(() => {
        fetchFun()
    })
    return { data, error }
}

1.2 自定义指令

重用涉及普通元素的底层DOM访问的逻辑。一个自定义指令由一个包含类似组件生命周期钩子的对象来定义。

el

指令所绑定的DOM元素。

binding对象

value: 传递给指令的值

oldValue: 之前的值

arg: 传递给指令的参数

modifiers:一个包含修饰符的对象

instance:使用该指令的组件实例

dir: 指令的定义对象

vnode

绑定元素的底层VNode

prevVnode

之前的渲染中指令所绑定元素的VNode,仅在beforeUpdate和updated钩子中使用。

表 钩子函数中的参数

<script setup lang="ts">
const vFocus = {
  mounted(el:HTMLElement,bindObj:{value: any,arg: string,modifiers:object}) {
    el.focus()
    console.log(bindObj)
  }
}
</script>

1.3 插件

能为Vue添加全局功能的工具代码。

一个插件可以是一个拥有install()方法的对象,也可以是install函数本身。它会接收app应用实例和传递给app.use的额外选项作为参数。

它有以下的作用:

  1. 通过app.component()和app.directive()注册一个或多个全局组件或自定义指令。
  2. 通过app.provice 使一个资源可被注入进整个应用。
  3. 向app.config.globalProperties中添加一些全局实例属性和方法。
  4. 一个可能包含上述三种功能的功能库。
//globalProvide.ts
export default {
    install(app:App,options: object) {
        console.log(app,options)
        app.provide("globalProvide",options)
    }
}

// main.ts
app.use(globalProvide,{other: 'hmf',address: '深圳'})

2 内置组件

2.1 Transition

会在一个元素组件进入和离开DOM时应用动画。仅支持单个元素或组件作为其插槽内容。

触发条件:1)v-if、v-show触发。2)<component>切换的动态组件。3)改变元素的key属性。

图 6个应用于进入与离开过渡效果的CSS class

<Transition>有个name 属性,用于声明一个过渡效果名。例如,name设置为custom,则上面的v-enter-from 就变为custom-enter-from。

<script setup lang="ts">
import {ref} from "vue";

const tag = ref(true)
const count = ref(0)
</script>

<template>
<button @click="tag = !tag">tag切换</button>
<button @click="count++">{{ count }}</button>
<div class="transition-container">
  <transition name="custom">
    <div v-if="tag">hello transition</div>
  </transition>
  <transition name="custom">
    <div v-if="tag" :key="count">hello {{ count }}</div>
  </transition>
</div>
</template>

<style scoped>
.custom-enter-active,
.custom-leave-active {
  transition: opacity 0.5s ease;
}

.custom-enter-from,
.custom-leave-to {
  opacity: 0;
}
</style>

2.2 TransitionGroup

会在一个v-for列表中的元素或组件被插入、移动或移除时应用动画。

  1. 默认情况下,它不会渲染一个容器元素,可以传入tag来指定容器元素。
  2. 列表中的每个元素都必须有独一无二的key。
  3. CSS过渡的class会被应用在列表内的元素上,而不是容器元素上。
<script setup lang="ts">
import {ref} from "vue";

let count = 0
const array:Array<number> = []
const arr = ref(array)

function randomOpera(type: number) {
   const pos = Math.floor(Math.random() * arr.value.length)
   if (type == -1) {
     if (arr.value.length === 0) return
     arr.value.splice(pos,1)
   } else {
     arr.value.splice(pos,0,count)
     count++
   }
}
</script>

<template>
<div>
  <button @click="randomOpera(1)">插入</button>
  <button @click="randomOpera(-1)">删除</button>
</div>
<div>
  <transition-group name="custom">
     <div v-for="item in arr" :key="item">{{ item }}</div>
  </transition-group>
</div>
</template>

<style scoped>
.custom-enter-active,
.custom-leave-active {
  transition: opacity 0.5s ease;
}

.custom-enter-from,
.custom-leave-to {
  opacity: 0;
}
</style>

2.3 KeepAlive

在多个组件间动态切换时缓存被移除的组件实例。

可以指定需要被包含/排除的组件,指定形式有:1)字符串。2)正则表达式。3)包含这两个的数组。

被缓存实例的生命周期为:onActivated和onDeactivated。

<script setup lang="ts">
import {ref} from "vue";
import ComponentA from "@/article/components/ComponentA.vue";
import ComponentB from "@/article/components/ComponentB.vue";

const tag = ref(true)
</script>

<template>
<button @click="tag = !tag">tag切换</button>
<keep-alive exclude="ComponentB">
  <component :is="tag ? ComponentA : ComponentB"/>
</keep-alive>
</template>

2.4 Teleport

使得一个组件模版的一部分逻辑上从属于该组件,但其部分DOM可以被渲染到该组件之外的其他HTML节点。

<script setup lang="ts">
import {ref} from "vue";

const tag = ref(false)
</script>

<template>
<div class="a6-container">
  <div>
    <button @click="tag = !tag">切换tag</button>
  </div>
  <teleport to="body" v-if="tag">
    <div class="model">
        Hello Teleport
    </div>
  </teleport>
</div>
</template>

<style scoped>
.model {
  background: rgba(229, 231, 231, 0.44);
  position: fixed;
  width: 50%;
  height: 50%;
  left: 25%;
  top: 25%;
  display: flex;
  justify-content: center;
  align-items: center;
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1948448.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

高通Hexagon ENPU4 从ONNX模型转换成EAI浮点模型

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

【MARL】MADDPG + attention 实现(+论文解读)

文章目录 前言注意力机制论文里的attention回顾知识-MADDPG讲解1.Q的定义2.Q的恒等式3.论文里的attention4.好处 实现 和 修改结果展示原论文代码 翻改版修改后原maddpg代码 前言 导师让在MADDPG上加一个注意力机制&#xff0c;试了很多种&#xff0c;下面的参考的论文的效果最…

Maven的概念

1.什么是Maven 1.1.什么是Maven Maven是跨平台的项目管理工具&#xff0c;主要服务于基于Java平台的项目构建、依赖管理以及项目信息管理。 1.2.什么是理想的项目构建 高度自动化&#xff0c;标准化&#xff0c;跨平台&#xff0c;可重用的组件 1.3.什么是依赖&#xff0c…

wget下载github文件得到html文件

从github/gitee下载源文件&#xff0c;本来是22M下载下来只有11k 原因&#xff1a; Github会提供html页面&#xff0c;包括指定的文件、上下文与相关操作。通过wget或者curl下载时&#xff0c;会下载该页面 解决方式&#xff1a; github点击Code一栏的raw按钮&#xff0c;获得源…

HTTPS证书价格差异体现在哪?

HTTPS证书作为保障网站安全的重要工具&#xff0c;其类型、功能和费用差异成为用户选择时的关键考量因素。本文将深入探讨HTTPS证书的不同类型、功能以及费用差异&#xff0c;以帮助用户做出更合适的选择。 HTTPS证书的类型 HTTPS证书主要分为三种&#xff1a;DV&#xff08;D…

24证券从业考试报名『个人信息表』填写模板❗

24证券从业考试报名『个人信息表』填写模板❗ 1️⃣居住城市、通讯地址&#xff1a;写自己现居住的地址就可以。 2️⃣学历&#xff1a;需要注意的是学历填写的是考生已经取得的学历&#xff0c;在校大学生已经不具有报名资格&#xff0c;选择大专以上&#xff0c;或者是高中学…

【轨物方案】成套开关柜在线监测物联网解决方案

随着物联网技术的发展&#xff0c;电力设备状态监测技术也得到了迅速发展。传统的电力成套开关柜设备状态监测方法主要采用人工巡检和定期维护的方式&#xff0c;这种方法不仅效率低下&#xff0c;而且难以保证设备的实时性和安全性。因此&#xff0c;基于物联网技术的成套开关…

ARM架构(二)—— arm v7-a/v8/v9寄存器介绍

1、ARM v7-A寄存器 1.1 通用寄存器 V7 V8开始 FIQ个IRQ优先级一样&#xff0c; 通用寄存器&#xff1a;31个 1.2 程序状态寄存器 CPSR是程序状态毒存器&#xff0c;保存条件标志位&#xff0c;中断禁止位&#xff0c;当前处理器模式等控制和状态位。每种异常模式下还存在SPS…

MySQL之索引及简单运用

索引&#xff1a; 什么是索引 索引是数据库中一种非常重要的数据结构&#xff0c;用于帮助快速查询数据库表中的数据。它就像一本书的目录&#xff0c;能够让你快速定位到书中的某个具体章节或内容&#xff0c;而不需要一页一页地翻阅整本书。 在数据库管理系统中&#xff0c;…

Servlet 3.0的新特征

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhlServlet 3.0概述 Servlet 3.0规范是在2009年随着Java EE 6的发布而推出的。它引入了一系列新特性和改进,旨在简化Web应用的开发和部署过程,并提高Web应用的性能和可扩展性。Servlet 3.0的发布标…

C++ | Leetcode C++题解之第279题完全平方数

题目&#xff1a; 题解&#xff1a; class Solution { public:// 判断是否为完全平方数bool isPerfectSquare(int x) {int y sqrt(x);return y * y x;}// 判断是否能表示为 4^k*(8m7)bool checkAnswer4(int x) {while (x % 4 0) {x / 4;}return x % 8 7;}int numSquares(i…

河南萌新联赛2024第(二)场---G. lxy的通风报信

题目描述 在 nnn mmm 的平面星球里&#xff08; 5<n5 < n5<n&#xff0c; m<1000m < 1000m<1000 &#xff09;&#xff0c;存在着 aaa 支军队 ( 2<a<502 < a < 502<a<50 ) , 和 bbb 支驻扎在地图中的敌军 ( 0<b<n∗m−a0 < b &…

Python写UI自动化--playwright(通过UI文本匹配实现定位)

本篇简单拓展一下元素定位技巧&#xff0c;通过UI界面的文本去实现定位 目录 匹配XPath 匹配文本元素 .count()统计匹配数量 处理匹配文本返回多个元素 1、使用.nth(index)选择特定元素: 2、获取所有匹配的元素并遍历: 3、错误处理: 匹配XPath 比如我们要定位到下图的…

SpringBoot 项目配置文件注释乱码的问题解决方案

一、问题描述 在项目的配置文件中&#xff0c;我们写了一些注释&#xff0c;如下所示&#xff1a; 但是再次打开注释会变成乱码&#xff0c;如下所示&#xff1a; 那么如何解决呢&#xff1f; 二、解决方案 1. 点击” File→Setting" 2. 搜索“File Encodings”, 将框…

JCR一区级 | Matlab实现TTAO-Transformer-LSTM多变量回归预测

JCR一区级 | Matlab实现TTAO-Transformer-LSTM多变量回归预测 目录 JCR一区级 | Matlab实现TTAO-Transformer-LSTM多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.【JCR一区级】Matlab实现TTAO-Transformer-LSTM多变量回归预测&#xff0c;三角拓扑聚合…

【C++进阶学习】第八弹——红黑树的原理与实现——探讨树形结构存储的最优解

二叉搜索树&#xff1a;【C进阶学习】第五弹——二叉搜索树——二叉树进阶及set和map的铺垫-CSDN博客 AVL树&#xff1a; ​​​​​​【C进阶学习】第七弹——AVL树——树形结构存储数据的经典模块-CSDN博客 前言&#xff1a; 在前面&#xff0c;我们已经学习了二叉搜索树和…

Sentinel限流规则详解

上一期教程讲解了 Sentinel 的快速入门&#xff1a;Sentinel快速入门&#xff0c;这一期主要讲述 Sentinel 的限流规则 簇点链路 簇点链路就是项目内的调用链路&#xff08;Controller -> Service -> Mapper&#xff09;&#xff0c;链路中被监控的每个接口就是一个资源…

论文阅读【检测】:商汤 ICLR2021 | Deformable DETR

文章目录 论文地址AbstractMotivation技术细节多尺度backbone特征MSDeformAttention 小结 论文地址 Deformable DETR 推荐视频&#xff1a;bilibili Abstract DETR消除对目标检测中许多手工设计的组件的需求&#xff0c;同时表现出良好的性能。然而&#xff0c;由于Transfor…

微服务案例搭建

案例搭建 使⽤微服务架构的分布式系统,微服务之间通过⽹络通信。我们通过服务提供者与服务消费者来描述微服 务间的调⽤关系。 服务提供者&#xff1a;服务的被调⽤⽅&#xff0c;提供调⽤接⼝的⼀⽅ 服务消费者&#xff1a;服务的调⽤⽅&#xff0c;依赖于其他服务的⼀⽅ 我…

pyenv-win | python版本管理,无需卸载当前版本

系统&#xff1a;windows&#xff0c;且已安装git。 使用 pyenv-win 在Windows中管理多个python版本&#xff0c;而无需卸载当前版本。安装步骤如下&#xff1a; 安装 pyenv-win 1. 安装 Git 和 pyenv-win: git clone https://github.com/pyenv-win/pyenv-win.git %USERPRO…