vue3組件庫(kù)Shake抖動(dòng)組件搭建過(guò)程詳解
正文
先看下效果
其實(shí)就是個(gè)抖動(dòng)效果組件,實(shí)現(xiàn)起來(lái)也非常簡(jiǎn)單。之所以做這樣一個(gè)組件是為了后面寫Form表單的時(shí)候會(huì)用到它做一個(gè)規(guī)則校驗(yàn),比如下面一個(gè)簡(jiǎn)單的登錄頁(yè)面,當(dāng)點(diǎn)擊登錄會(huì)提示用戶哪個(gè)信息沒(méi)輸入,當(dāng)然這只是一個(gè)簡(jiǎn)陋的demo
接下來(lái)就開(kāi)始我們的Shake組件實(shí)現(xiàn)
CSS樣式
其實(shí)樣式很簡(jiǎn)單,當(dāng)你需要抖動(dòng)的時(shí)候就給它添加個(gè)抖動(dòng)的樣式,不需要就移除這個(gè)樣式即可。抖動(dòng)效果就用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
的,做到用戶傳什么我們就抖什么,做到萬(wàn)物皆可抖。
這里使用vue3中的v-model
指令會(huì)更方便,如下,當(dāng)我們使用Shake
組件時(shí),trigger
為true
即開(kāi)始抖動(dòng)
<Shake v-model="trigger"> 抖動(dòng) </Shake>
組件具體實(shí)現(xiàn)代碼,同樣的這次還是使用setup
語(yǔ)法糖形式實(shí)現(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傳來(lái)的值即為modelValue type ShakeProps = { modelValue?: boolean } //發(fā)送update:modelValue來(lái)配合v-model語(yǔ)法糖 type Emits = { (e: 'update:modelValue', value: boolean): void } //獲取props屬性并且設(shè)置默認(rèn)值 const props = withDefaults(defineProps<ShakeProps>(), { modelValue: false }) const emits = defineEmits<Emits>() //監(jiān)聽(tīng)modelValue,為true的話,1s后置為false watch(() => props.modelValue, (newVal) => { if (newVal) { setTimeout(() => { emits("update:modelValue", false) }, 1000); } }, { immediate: true }) </script>
說(shuō)明
這里接收參數(shù)props
以及事件emits
使用了以泛型的形式定義,不了解的可以看下這個(gè)傳送門。watch加了立即監(jiān)聽(tīng)為了防止用戶上來(lái)就賦值為true
導(dǎo)致下次不觸發(fā)。
單元測(cè)試
新建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') }) })
這個(gè)單元測(cè)試的意思其實(shí)就是
slot
傳入Hello world
,期望頁(yè)面就會(huì)出現(xiàn)Hello world
props
傳入modelValue
為true
,那么組件就包含樣式k-shakeactive
最后執(zhí)行pnpm run coverage
命令就會(huì)放下shake
測(cè)試代碼通過(guò)了
導(dǎo)出打包發(fā)布
這里和以往組件實(shí)現(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ā)布
組件庫(kù)的所有實(shí)現(xiàn)細(xì)節(jié)都在這個(gè)專欄里,包括環(huán)境搭建
,自動(dòng)打包發(fā)布
,文檔搭建
,vitest單元測(cè)試
等等。
開(kāi)源地址 kitty-ui: Vite+Ts搭建的Vue3組件庫(kù)
以上就是vue3組件庫(kù)Shake抖動(dòng)組件搭建過(guò)程詳解的詳細(xì)內(nèi)容,更多關(guān)于vue3 Shake抖動(dòng)組件庫(kù)搭建的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
vue中如何通過(guò)iframe方式加載本地的vue頁(yè)面
這篇文章主要介紹了vue中如何通過(guò)iframe方式加載本地的vue頁(yè)面,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09Vue實(shí)現(xiàn)生成二維碼的簡(jiǎn)單方式
與后端生成二維碼相比,前端生成二維碼更具有靈活性,下面這篇文章主要給大家介紹了關(guān)于Vue實(shí)現(xiàn)生成二維碼的簡(jiǎn)單方式,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-01-01Vue+Koa2+mongoose寫一個(gè)像素繪板的實(shí)現(xiàn)方法
這篇文章主要介紹了Vue+Koa2+mongoose寫一個(gè)像素繪板的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09JavaScript的MVVM庫(kù)Vue.js入門學(xué)習(xí)筆記
這篇文章主要介紹了JavaScript的MVVM庫(kù)Vue.js入門學(xué)習(xí)筆記,Vue.js是一個(gè)新興的js庫(kù),主要用于實(shí)現(xiàn)響應(yīng)的數(shù)據(jù)綁定和組合的視圖組件,需要的朋友可以參考下2016-05-05vue elementui 實(shí)現(xiàn)搜索欄公共組件封裝的實(shí)例代碼
這篇文章主要介紹了vue elementui 搜索欄公共組件封裝,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-01-01