先看下效果

其实就是个抖动效果组件,实现起来也非常简单。之所以做这样一个组件是为了后面写Form表单的时候会用到它做一个规则校验,比如下面一个简单的登录页面,当点击登录会提示用户哪个信息没输入,当然这只是一个简陋的demo

接下来就开始我们的Shake组件实现

CSS样式

当你需要抖动的时候就给它添加个抖动的类名,不需要就移除这个类名即可。抖动效果就用CSS3中的transform的平移属性加动画实现

@keyframes shake {

    10%,
90% {
transform: translate3d(-1px, 0, 0);
} 20%,
80% {
transform: translate3d(2px, 0, 0);
} 30%,
70% {
transform: translate3d(-4px, 0, 0);
} 40%,
60% {
transform: translate3d(4px, 0, 0);
} 50%,
50% {
transform: translate3d(-4px, 0, 0);
}
} .k-shake.k-shakeactive {
animation: shake 1s linear;
}

组件逻辑

根据上面效果,很显然是需要用到插槽slot的,做到用户传什么我们就抖什么,做到万物皆可抖。

这里使用vue3中的v-model指令会更方便,如下,当我们使用Shake组件时,triggertrue即开始抖动

        <Shake v-model="trigger">
抖动
</Shake>

组件具体实现代码,同样的这次还是使用setup语法糖形式实现

<template>
<div class="k-shake" :class="{['k-shakeactive']:props.modelValue}">
<slot />
</div>
</template>
<script lang="ts">
import { defineComponent } from 'vue'
import './style/index.less'
export default defineComponent({
name: 'k-shake'
});
</script>
<script lang='ts' setup>
import { watch } from 'vue'
//v-model传来的值即为modelValue
type ShakeProps = {
modelValue?: boolean
}
//发送update:modelValue来配合v-model语法糖
type Emits = {
(e: 'update:modelValue', value: boolean): void
} //获取props属性并且设置默认值
const props = withDefaults(defineProps<ShakeProps>(), {
modelValue: false
})
const emits = defineEmits<Emits>() //监听modelValue,为true的话,1s后置为false
watch(() => props.modelValue, (newVal) => {
if (newVal) {
setTimeout(() => {
emits("update:modelValue", false)
}, 1000);
} }, { immediate: true }) </script>

说明

这里接收参数props以及事件emits使用了以泛型的形式定义,不了解的可以看下这个传送门。watch加了立即监听为了防止用户上来就赋值为true导致下次不触发。

单元测试

新建shake.test.ts

import { describe, expect, it } from "vitest";
import { mount } from '@vue/test-utils'
import shake from '../shake.vue'
// The component to test describe('test shake', () => {
it("should render slot", () => {
const wrapper = mount(shake, {
slots: {
default: 'Hello world'
}
}) // Assert the rendered text of the component
expect(wrapper.text()).toContain('Hello world')
})
it("should have class", () => {
const wrapper = mount(shake, {
props: {
modelValue: true
}
})
expect(wrapper.classes()).toContain('k-shakeactive')
})
})

这个单元测试的意思其实就是

  1. slot传入Hello world,期望页面就会出现Hello world
  2. props传入modelValuetrue,那么组件就包含样式k-shakeactive

最后执行pnpm run coverage命令就会放下shake测试代码通过了

导出打包发布

这里和以往组件实现基本一样了,这里直接贴代码

  • shake/index.ts
import shake from './shake.vue'
import { withInstall } from '@kitty-ui/utils'
const Shake = withInstall(shake)
export default Shake
  • src/index.ts
export { default as Button } from './button'
export { default as Icon } from './icon'
export { default as Link } from './link'
export { default as Upload } from './upload'
export { default as Shake } from './shake'

最后执行

pnpm run build:kitty
pnpm run pnpm run build:kitty

即可完成发布

写在最后

组件库的所有实现细节可以关注公众号 web前端进阶 获取,包括环境搭建自动打包发布文档搭建vitest单元测试等等。

如果这篇文章对你有所帮助动动指头点个赞吧~

开源地址

kitty-ui: Vite+Ts搭建的Vue3组件库

从0搭建vue3组件库:Shake抖动组件的更多相关文章

  1. 从0搭建vue3组件库:自动化发布、管理版本号、生成 changelog、tag

    今天看到一篇文章中提到了一个好用的工具release-it.刚好可以用在我正在开发的vue3组件库.纸上得来终觉浅,绝知此事要躬行,说干就干,下面就介绍如何将release-it应用到实际项目中,让组 ...

  2. 从0搭建vue3组件库: Input组件

    本篇文章将为我们的组件库添加一个新成员:Input组件.其中Input组件要实现的功能有: 基础用法 禁用状态 尺寸大小 输入长度 可清空 密码框 带Icon的输入框 文本域 自适应文本高度的文本域 ...

  3. ElementUI2.0组件库el-table表格组件如何自定义表头?

    效果图: npm run dev 编译项目之后,报错,要使用jsx语法需要先安装编译插件 1.安装下列安装包 npm install babel-plugin-syntax-jsx --save-de ...

  4. 从0搭建Vue3组件库:button组件

    button组件几乎是每个组件库都有的:其实实现一个button组件是很简单的.本篇文章将带你一步一步的实现一个button组件.如果你想了解完整的组件库搭建,你可以先看使用Vite和TypeScri ...

  5. 从0搭建vue3组件库: 如何完整搭建一个前端脚手架?

    相信大家在前端开发中都使用过很多前端脚手架,如vue-cli,create-vite,create-vue等:本篇文章将会为大家详细介绍这些前端脚手架是如何实现的,并且从零实现一个create-kit ...

  6. Vue3 企业级优雅实战 - 组件库框架 - 4 组件库的 CSS 架构

    在前一篇文章中分享了搭建组件库的基本开发环境.创建了 foo 组件模块和组件库入口模块,本文分享组件库的样式架构设计. 1 常见的 CSS 架构模式 常见的 CSS 架构模式有很多:OOCSS.ACS ...

  7. Bootstrap Blazor 组件库 Row 布局组件(栅格系统)

    原文链接:https://www.cnblogs.com/ysmc/p/16133351.html 在 Bootstrap 中,栅格相信大家都很熟悉,简直就是布局神器啊,Bootstrap Blazo ...

  8. Blazor Bootstrap 组件库浏览器通知组件介绍

    通知组件 通过浏览器API发送通知信息 , 桌面浏览器表现为右下角系统提示框弹出消息, 移动浏览器表现为弹窗或者到消息列表, blazor页面不在前台也可以通过本组件提醒用户. DEMO https: ...

  9. Vite+TS带你搭建一个属于自己的Vue3组件库

    theme: nico 前言 随着前端技术的发展,业界涌现出了许多的UI组件库.例如我们熟知的ElementUI,Vant,AntDesign等等.但是作为一个前端开发者,你知道一个UI组件库是如何被 ...

随机推荐

  1. JavaScript数组方法总结,本文是根据数组原型上的方法进行总结,由于方法太多将会分篇章发布

    通过浏览器控制台 console 可查看到 Array 数组上原型的所有方法(如下图).对于原型问题此文章暂不过多叙述,单针对对象中的方法进行自我看法的总结:细心的同学可以发现对象原型上所携带的方法基 ...

  2. 羽夏看Linux内核——中断与分页相关入门知识

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.如有好的建议,欢迎反馈.码字不易,如果本篇文章有帮助你的,如有闲钱,可以打赏支持我的创作.如想转载,请把我的转载信息附在文章后面,并 ...

  3. Linux 07 用户组文件

    参考源 https://www.bilibili.com/video/BV187411y7hF?spm_id_from=333.999.0.0 版本 本文章基于 CentOS 7.6 概述 用户组的所 ...

  4. Redis 02 数据库

    参考源 https://www.bilibili.com/video/BV1S54y1R7SB?spm_id_from=333.999.0.0 版本 本文章基于 Redis 6.2.6 Redis 默 ...

  5. MySQL 数据定义语句

    表相关 修改表名 alter table grade rename hang; 新增表字段 alter table grade add `name` varchar(100); 修改表字段类型 alt ...

  6. Aoac唤醒的软件方案

    Aoac唤醒 这篇文章包含了Win10下的Aoac唤醒和Win11下的Aoac唤醒的不同地方,在结尾处: 从Win10时代开始,通过软件来唤醒机器是一个很常见的事情了,但是很少有文档去将如何通过AOA ...

  7. TMC2209步进驱动芯片基本配置及使用

    TMC2209是用于两相步进电机的超静音电机驱动器IC. TMC2209与许多传统驱动器以及TMC2208引脚兼容. TRINAMICs先进的StealthChop2斩波器可确保电机无噪音运行,实现最 ...

  8. 简单创建一个SpringCloud2021.0.3项目(三)

    目录 1. 项目说明 1. 版本 2. 用到组件 3. 功能 2. 上俩篇教程 3. Gateway集成sentinel,网关层做熔断降级 1. 超时熔断降级 2. 异常熔断 3. 集成sentine ...

  9. Linux虚拟机 RHEL8.0安装步骤

    一. 创建空白虚拟机 1.打开 VMware 虚拟机软件依次选择新建虚拟机并选择选择"自定义" 自定义功能更加全面,典型就是比较简单的配置 2.选择对应的 VMware 版本,此则 ...

  10. Helm安装ingress-nginx-4.2.3

    Application version 1.3.0 Chart version 4.2.3 获取chart包 helm fetch ingress-nginx/ingress-nginx --vers ...