vue3組件庫Shake抖動組件搭建過程詳解
正文
先看下效果

其實就是個抖動效果組件,實現(xiàn)起來也非常簡單。之所以做這樣一個組件是為了后面寫Form表單的時候會用到它做一個規(guī)則校驗,比如下面一個簡單的登錄頁面,當點擊登錄會提示用戶哪個信息沒輸入,當然這只是一個簡陋的demo

接下來就開始我們的Shake組件實現(xiàn)
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;
}
組件邏輯
根據(jù)上面效果,很顯然是需要用到插槽slot的,做到用戶傳什么我們就抖什么,做到萬物皆可抖。
這里使用vue3中的v-model指令會更方便,如下,當我們使用Shake組件時,trigger為true即開始抖動
<Shake v-model="trigger">
抖動
</Shake>
組件具體實現(xiàn)代碼,同樣的這次還是使用setup語法糖形式實現(xiàn)
<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
}
//發(fā)送update:modelValue來配合v-model語法糖
type Emits = {
(e: 'update:modelValue', value: boolean): void
}
//獲取props屬性并且設置默認值
const props = withDefaults(defineProps<ShakeProps>(), {
modelValue: false
})
const emits = defineEmits<Emits>()
//監(jiān)聽modelValue,為true的話,1s后置為false
watch(() => props.modelValue, (newVal) => {
if (newVal) {
setTimeout(() => {
emits("update:modelValue", false)
}, 1000);
}
}, { immediate: true })
</script>
說明
這里接收參數(shù)props以及事件emits使用了以泛型的形式定義,不了解的可以看下這個傳送門。watch加了立即監(jiān)聽為了防止用戶上來就賦值為true導致下次不觸發(fā)。
單元測試
新建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')
})
})
這個單元測試的意思其實就是
slot傳入Hello world,期望頁面就會出現(xiàn)Hello worldprops傳入modelValue為true,那么組件就包含樣式k-shakeactive
最后執(zhí)行pnpm run coverage命令就會放下shake測試代碼通過了

導出打包發(fā)布
這里和以往組件實現(xiàn)基本一樣了,這里直接貼代碼
- 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'
最后執(zhí)行
pnpm run build:kitty
pnpm run pnpm run build:kitty
即可完成發(fā)布
組件庫的所有實現(xiàn)細節(jié)都在這個專欄里,包括環(huán)境搭建,自動打包發(fā)布,文檔搭建,vitest單元測試等等。
開源地址 kitty-ui: Vite+Ts搭建的Vue3組件庫
以上就是vue3組件庫Shake抖動組件搭建過程詳解的詳細內(nèi)容,更多關于vue3 Shake抖動組件庫搭建的資料請關注腳本之家其它相關文章!
相關文章
vue router帶參數(shù)頁面刷新或回退參數(shù)消失的解決方法
這篇文章主要介紹了vue router帶參數(shù)頁面刷新或回退參數(shù)消失的解決方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-02-02
使用vue自定義指令開發(fā)表單驗證插件validate.js
今天就來介紹一下如何利用vue的自定義指令directive來開發(fā)一個表單驗證插件的過程,需要的朋友可以參考下2019-05-05
vue awesome swiper異步加載數(shù)據(jù)出現(xiàn)的bug問題
這篇文章主要介紹了vue awesome swiper異步加載數(shù)據(jù)出現(xiàn)的bug問題,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2018-07-07
Vue?先初始化父組件再初始化子組件的方法(自定義父子組件mounted執(zhí)行順序)
這篇文章主要介紹了Vue?先初始化父組件再初始化子組件的方法(自定義父子組件mounted執(zhí)行順序),本篇內(nèi)容內(nèi)容主要講述了,在使用?Konva?進行開發(fā)過程中遇到的一些問題,需要的朋友可以參考下2024-07-07
Vue遞歸組件+Vuex開發(fā)樹形組件Tree--遞歸組件的簡單實現(xiàn)
這篇文章也是我自己開發(fā)的從無到有的過程,所以它可以為你提供一些Tree組件開發(fā)的思路,本文重點給大家介紹vue遞歸組件的簡單實現(xiàn),感興趣的朋友跟隨小編一起看看吧2019-04-04

