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 world
props
傳入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+Koa2+mongoose寫一個像素繪板的實現(xiàn)方法
這篇文章主要介紹了Vue+Koa2+mongoose寫一個像素繪板的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-09-09vue elementui 實現(xiàn)搜索欄公共組件封裝的實例代碼
這篇文章主要介紹了vue elementui 搜索欄公共組件封裝,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2020-01-01