前言:哈嘍,大家好,今天給大家分享一篇文章!并提供具體代碼幫助大家深入理解,徹底掌握!創作不易,如果能幫助到大家或者給大家一些靈感和啟發,歡迎收藏+關注哦 💕
目錄
- DeepSeek 助力 Vue 開發:打造絲滑的 鍵盤快捷鍵(Keyboard Shortcuts)
- 📚前言
- 📚頁面效果
- 📚指令輸入
- 屬性定義
- 1. 快捷鍵綁定數組 `shortcuts`
- 2. 啟用狀態 `enabled`
- 3. 全局監聽 `global`
- 4. 組合鍵分隔符 `separator`
- 5. 修飾鍵順序敏感 `modifierSensitive`
- 事件定義
- 1. `shortcut-triggered` 事件
- 2. `shortcut-failed` 事件
- 其他
- 1. 快捷鍵驗證
- 2. 沖突處理
- 3. 跨平臺兼容性
- 4. 文檔和示例
- 5. 測試
- 📘組件代碼
- 📚代碼測試
- 📚添加參數后主要代碼
- 📘組件 \src\views\KeyboardShortcutsView.vue
- 📚測試代碼正常跑通,附其他基本代碼
- 📘編寫路由 src\router\index.js
- 📘編寫展示入口 src\App.vue
- 📚頁面效果
- 📚相關文章
📚📗📕📘📖🕮💡📝🗂???🛠?💻🚀🎉🏗?🌐🖼?🔗📊👉🔖??🌟🔐??·正文開始
??·🎥😊🎓📩😺🌈🤝🤖📜📋🔍?🧰?📄📢📈 🙋0??1??2??3??4??5??6??7??8??9??🔟🆗*??#??
DeepSeek 助力 Vue 開發:打造絲滑的 鍵盤快捷鍵(Keyboard Shortcuts)
📚前言
在日常工作中,DeepSeek 也為許多用戶帶來了便利。一位市場營銷經理在策劃一場新產品推廣活動時,利用 DeepSeek 進行市場分析和競品研究。DeepSeek 通過對大量市場數據和消費者反饋的分析,為他提供了詳細的市場趨勢報告和競品優劣勢分析。基于這些分析結果,他制定了更有針對性的推廣策略,成功提高了新產品的市場知名度和銷量。他說:“DeepSeek 幫助我做出了更明智的決策,讓我的工作變得更加高效和輕松。
📚頁面效果
📚指令輸入
已經創建好了一個基于Vue3的組合式API的項目(Composition API),并能正常運行起來,請幫我用 Vue3的組合式API(Composition API) 生成一個 鍵盤快捷鍵(Keyboard Shortcuts) 的功能組件,所有代碼都保存在components/KeyboardShortcuts 下的文件夾中。功能組件的script標簽中只有setup屬性,使用普通 JavaScript 實現,不使用TypeScript。
功能要有,如下屬性:
屬性定義
1. 快捷鍵綁定數組 shortcuts
- 類型:數組
- 描述:用于定義一組快捷鍵及其對應的回調函數或動作標識。數組中的每個元素可以是一個對象,包含快捷鍵組合和對應的處理邏輯。例如,
[{ keys: 'Ctrl + S', action: 'save' }, { keys: 'Ctrl + C', action: 'copy' }]
。
2. 啟用狀態 enabled
- 類型:布爾值
- 描述:控制快捷鍵組件是否啟用。當設置為
false
時,快捷鍵將不會觸發任何動作,可用于臨時禁用快捷鍵功能。
3. 全局監聽 global
- 類型:布爾值
- 描述:指定快捷鍵是否在全局范圍內監聽。如果設置為
true
,則無論焦點在哪個元素上,快捷鍵都會生效;如果設置為false
,則只有當焦點在組件內部時快捷鍵才會生效。
4. 組合鍵分隔符 separator
- 類型:字符串
- 描述:用于指定快捷鍵組合中各個鍵之間的分隔符,默認為
+
。例如,用戶可以自定義為-
,則快捷鍵定義可以寫成Ctrl - S
。
5. 修飾鍵順序敏感 modifierSensitive
- 類型:布爾值
- 描述:指定修飾鍵(如
Ctrl
、Alt
、Shift
)的順序是否敏感。如果設置為true
,則Ctrl + Shift + A
和Shift + Ctrl + A
被視為不同的快捷鍵;如果設置為false
,則它們被視為相同的快捷鍵。
事件定義
1. shortcut-triggered
事件
- 描述:當用戶按下定義的快捷鍵時觸發該事件,事件參數包含觸發的快捷鍵組合和對應的動作標識。例如,當用戶按下
Ctrl + S
時,會觸發該事件,并傳遞{ keys: 'Ctrl + S', action: 'save' }
作為參數。
2. shortcut-failed
事件
- 描述:當用戶按下的鍵組合未匹配到任何定義的快捷鍵時觸發該事件,事件參數包含用戶按下的鍵組合。可用于記錄用戶的無效操作或提供提示信息。
其他
1. 快捷鍵驗證
在組件內部對用戶定義的快捷鍵進行驗證,確保其格式正確,避免因無效的快捷鍵定義導致組件出錯。例如,檢查快捷鍵組合中是否包含非法字符或不支持的鍵。
2. 沖突處理
當多個快捷鍵之間存在沖突時,提供相應的處理機制。可以選擇忽略沖突,只觸發第一個匹配的快捷鍵;也可以拋出錯誤或警告,提示用戶存在沖突。
3. 跨平臺兼容性
考慮不同操作系統和瀏覽器對快捷鍵的支持情況,確保組件在各種環境下都能正常工作。例如,在 Mac 系統中,Ctrl
鍵通常對應 Command
鍵,需要進行相應的轉換。
4. 文檔和示例
提供詳細的文檔和示例,說明組件的使用方法、屬性和事件的含義,方便其他開發者使用該組件。
5. 測試
編寫單元測試和集成測試,確保組件的功能正常,快捷鍵能夠正確觸發和處理。測試用例應覆蓋各種情況,包括不同的快捷鍵組合、啟用和禁用狀態等。
你有更好的建議也可以添加,要注明。組件定義好后給出5個及以上的調用示例。
下面是現有目錄
vueAndDeepseek/
├── src/ # 源代碼目錄
│ ├── assets/ # 靜態資源
│ │ ├── base.css
│ │ ├── main.css
│ │ └── logo.svg
│ ├── components/ # 組件目錄
│ │ ├── HelloWorld.vue
│ │ ├── TheWelcome.vue
│ │ ├── WelcomeItem.vue
│ │ ├── Progress/
│ │ │ └── Progress.vue
│ │ ├── Accordion/
│ │ ├── BackToTop/
│ │ ├── Card/
│ │ ├── InfiniteScroll/
│ │ ├── Notification/
│ │ ├── Timeline/
│ │ ├── Switch/
│ │ ├── Tabs/
│ │ ├── Sidebar/
│ │ ├── Breadcrumbs/
│ │ ├── MasonryLayout/
│ │ ├── Rating/
│ │ ├── ColorPicker/
│ │ ├── RightClickMenu/
│ │ ├── RangePicker/
│ │ ├── Navbar/
│ │ ├── FormValidation/
│ │ ├── CopyToClipboard/
│ │ ├── ClickAnimations/
│ │ ├── ThumbnailList/
│ │ ├── KeyboardShortcuts/
│ │ ├── DatePicker/
│ │ └── icons/
│ ├── router/ # 路由配置
│ │ └── index.js
│ ├── stores/ # Pinia 狀態管理
│ │ └── counter.js
│ ├── views/ # 頁面組件
│ │ ├── ProgressView.vue
│ │ ├── TabsView.vue
│ │ ├── SwitchView.vue
│ │ ├── TimelineView.vue
│ │ ├── NotificationView.vue
│ │ ├── CardView.vue
│ │ ├── InfiniteScrollView.vue
│ │ ├── BackToTopView.vue
│ │ ├── AccordionView.vue
│ │ ├── SidebarView.vue
│ │ ├── BreadcrumbsView.vue
│ │ ├── MasonryLayoutView.vue
│ │ ├── RatingView.vue
│ │ ├── ColorPickerView.vue
│ │ ├── RightClickMenuView.vue
│ │ ├── RangePickerView.vue
│ │ ├── NavbarView.vue
│ │ ├── FormValidationView.vue
│ │ ├── CopyToClipboardView.vue
│ │ ├── ClickAnimationsView.vue
│ │ ├── ThumbnailListView.vue
│ │ ├── KeyboardShortcutsView.vue
│ │ ├── DatePickerView.vue
│ │ └── AboutView.vue
│ ├── App.vue # 根組件
│ └── main.js # 應用入口
├── public/ # 公共資源目錄
├── index.html # HTML 模板
├── package.json # 項目配置
├── vite.config.js # Vite 配置
└── node_modules/ # 依賴包目錄
📘組件代碼
根據你的需求,我幫你創建了一個功能完善的鍵盤快捷鍵組件,以下是實現代碼和調用示例:
<!-- components/KeyboardShortcuts/KeyboardShortcuts.vue -->
<template><div ref="root"><slot></slot></div>
</template><script setup>
import { ref, computed, watch, onMounted, onUnmounted } from 'vue'const props = defineProps({shortcuts: {type: Array,required: true,validator: (value) => value.every(item => item.keys && item.action)},enabled: {type: Boolean,default: true},global: {type: Boolean,default: false},separator: {type: String,default: '+'},modifierSensitive: {type: Boolean,default: false}
})const emit = defineEmits(['shortcut-triggered', 'shortcut-failed'])const root = ref(null)
const isMac = /macintosh|mac os x/i.test(navigator.userAgent)
let currentTarget = null
let isListening = falseconst keyAliases = {ctrl: 'control',control: 'control',cmd: 'meta',command: 'meta',meta: 'meta',shift: 'shift',alt: 'alt',option: 'alt',esc: 'escape',space: ' ',up: 'arrowup',down: 'arrowdown',left: 'arrowleft',right: 'arrowright'
}const normalizeKey = (key) => {const lowerKey = key.toLowerCase()return keyAliases[lowerKey] || lowerKey
}const parseKeys = (keysStr) => {return keysStr.split(props.separator).map(k => normalizeKey(k.trim())).map(k => isMac && k === 'control' ? 'meta' : k)
}const normalizeCombo = (keys, isModifierSensitive) => {const modifiers = []const others = []keys.forEach(key => {if (['control', 'meta', 'shift', 'alt'].includes(key)) {modifiers.push(key)} else {others.push(key)}})if (!isModifierSensitive) {modifiers.sort()}return [...modifiers, ...others].join('+')
}const shortcutMap = computed(() => {const map = new Map()props.shortcuts.forEach(shortcut => {try {const keys = parseKeys(shortcut.keys)const combo = normalizeCombo(keys, props.modifierSensitive)if (map.has(combo)) {console.warn(`Shortcut conflict: ${shortcut.keys} conflicts with existing shortcut`)}map.set(combo, shortcut)} catch (e) {console.error(`Invalid shortcut: ${shortcut.keys}`, e)}})return map
})const handleKeyDown = (event) => {if (!props.enabled) returnconst pressedModifiers = []if (event.ctrlKey) pressedModifiers.push('control')if (event.shiftKey) pressedModifiers.push('shift')if (event.altKey) pressedModifiers.push('alt')if (event.metaKey) pressedModifiers.push('meta')const key = normalizeKey(event.key)if (['control', 'shift', 'alt', 'meta'].includes(key)) returnconst pressedKeys = [...pressedModifiers, key]const combo = normalizeCombo(pressedKeys, props.modifierSensitive)const matched = shortcutMap.value.get(combo)if (matched) {event.preventDefault()emit('shortcut-triggered', { keys: matched.keys, action: matched.action })if (typeof matched.action === 'function') {matched.action()}} else {const userCombo = pressedKeys.join(props.separator)emit('shortcut-failed', { keys: userCombo })}
}const updateEventListener = () => {if (isListening) {currentTarget.removeEventListener('keydown', handleKeyDown)isListening = false}if (props.enabled) {currentTarget = props.global ? window : root.valueif (currentTarget) {currentTarget.addEventListener('keydown', handleKeyDown)isListening = true}}
}onMounted(updateEventListener)
onUnmounted(() => {if (isListening) {currentTarget.removeEventListener('keydown', handleKeyDown)}
})watch([() => props.enabled, () => props.global], updateEventListener)
</script>
以下是5個調用示例:
<!-- 示例1: 基本使用 -->
<KeyboardShortcuts:shortcuts="[{ keys: 'Ctrl + S', action: 'save' },{ keys: 'Ctrl + C', action: 'copy' }]"@shortcut-triggered="handleShortcut"
/><!-- 示例2: 帶回調函數 -->
<KeyboardShortcuts:shortcuts="[{ keys: 'Ctrl + K', action: () => openSearch() }]"
/><!-- 示例3: 非全局作用域 -->
<KeyboardShortcuts:global="false":shortcuts="[{ keys: 'Enter', action: 'submit' }]"
><input type="text" placeholder="Focus here to use Enter shortcut">
</KeyboardShortcuts><!-- 示例4: 自定義分隔符 -->
<KeyboardShortcuts:separator="'-'":shortcuts="[{ keys: 'Ctrl - Alt - D', action: 'debug' }]"
/><!-- 示例5: 復雜組合 -->
<KeyboardShortcuts:modifier-sensitive="true":shortcuts="[{ keys: 'Shift + Ctrl + Tab', action: 'prevTab' },{ keys: 'Ctrl + Tab', action: 'nextTab' }]"
/><!-- 示例6: 禁用狀態 -->
<KeyboardShortcuts:enabled="false":shortcuts="[...]"
/>
組件特性:
- 自動處理Mac系統的Command鍵映射
- 支持修飾鍵順序敏感設置
- 完善的類型驗證和錯誤提示
- 自動處理事件監聽的生命周期
- 支持組合鍵和單鍵觸發
- 詳細的調試信息輸出
使用時可以根據需要組合不同的屬性來實現各種快捷鍵場景,組件會自動處理瀏覽器兼容性和平臺差異。
📚代碼測試
運行正常。代碼示例需要添加一些參數。
📚添加參數后主要代碼
📘組件 \src\views\KeyboardShortcutsView.vue
<template><div class="keyboard-shortcuts-demo"><h2>鍵盤快捷鍵示例</h2><!-- 示例1: 基本使用 --><section class="demo-section"><h3>基本使用</h3><div class="demo-box"><p>嘗試按下: <code>Ctrl + S 保存</code> 或 <code>Ctrl + C 復制</code></p><KeyboardShortcuts:shortcuts="[{ keys: 'Ctrl + S', action: 'save' },{ keys: 'Ctrl + C', action: 'copy' }]"@shortcut-triggered="handleShortcut"><div class="action-log">最后執行的操作: {{ lastAction }}</div></KeyboardShortcuts></div></section><!-- 示例2: 帶回調函數 --><section class="demo-section"><h3>帶回調函數</h3><div class="demo-box"><p>嘗試按下: <code>Ctrl + K</code></p><KeyboardShortcuts:shortcuts="[{keys: 'Ctrl + K',action: () => openSearch()}]"><div class="search-box" v-if="isSearchOpen">搜索框已打開<button @click="isSearchOpen = false">關閉</button></div></KeyboardShortcuts></div></section><!-- 示例3: 非全局作用域 --><section class="demo-section"><h3>非全局作用域</h3><div class="demo-box"><p>在輸入框內按 <code>Enter</code></p><KeyboardShortcuts:global="false":shortcuts="[{ keys: 'Enter', action: 'submit' }]"@shortcut-triggered="handleSubmit"><inputtype="text"v-model="inputText"placeholder="Focus here to use Enter shortcut"class="demo-input"><div class="action-log">{{ submitMessage }}</div></KeyboardShortcuts></div></section><!-- 示例4: 自定義分隔符 --><section class="demo-section"><h3>自定義分隔符</h3><div class="demo-box"><p>嘗試按下: <code>Ctrl-Alt-D</code></p><KeyboardShortcutsseparator="-":shortcuts="[{ keys: 'Ctrl-Alt-D', action: 'debug' }]"@shortcut-triggered="handleDebug"><div class="action-log">{{ debugStatus }}</div></KeyboardShortcuts></div></section><!-- 示例5: 復雜組合 --><section class="demo-section"><h3>復雜組合</h3><div class="demo-box"><p>嘗試按下: <code>Shift + Ctrl + Tab</code> 或 <code>Ctrl + Tab</code></p><KeyboardShortcuts:modifier-sensitive="true":shortcuts="[{ keys: 'Shift + Ctrl + Tab', action: 'prevTab' },{ keys: 'Ctrl + Tab', action: 'nextTab' }]"@shortcut-triggered="handleTabSwitch"><div class="tabs-demo">當前標簽頁: {{ currentTab }}</div></KeyboardShortcuts></div></section></div>
</template><script setup>
import { ref } from 'vue'
import KeyboardShortcuts from '@/components/KeyboardShortcuts/KeyboardShortcuts.vue'// 狀態變量
const lastAction = ref('')
const isSearchOpen = ref(false)
const inputText = ref('')
const submitMessage = ref('')
const debugStatus = ref('')
const currentTab = ref(1)// 事件處理函數
const handleShortcut = (event) => {lastAction.value = `執行了 ${event.action} 操作`
}const openSearch = () => {isSearchOpen.value = true
}const handleSubmit = () => {submitMessage.value = `提交的內容: ${inputText.value}`inputText.value = ''
}const handleDebug = () => {debugStatus.value = '調試模式已' + (debugStatus.value.includes('開啟') ? '關閉' : '開啟')
}const handleTabSwitch = (event) => {if (event.action === 'nextTab') {currentTab.value = currentTab.value >= 3 ? 1 : currentTab.value + 1} else {currentTab.value = currentTab.value <= 1 ? 3 : currentTab.value - 1}
}
</script><style scoped>
.keyboard-shortcuts-demo {padding: 20px;max-width: 800px;margin: 0 auto;
}h2 {color: #2c3e50;text-align: center;margin-bottom: 30px;
}.demo-section {margin-bottom: 30px;padding: 20px;border: 1px solid #ebeef5;border-radius: 8px;background: white;
}h3 {color: #2c3e50;margin-bottom: 15px;
}.demo-box {padding: 15px;background: #f8f9fa;border-radius: 6px;
}code {background: #e9ecef;padding: 2px 6px;border-radius: 4px;font-family: monospace;
}.action-log {margin-top: 10px;padding: 10px;background: #e9ecef;border-radius: 4px;font-size: 14px;
}.demo-input {width: 100%;padding: 8px;border: 1px solid #dcdfe6;border-radius: 4px;margin-top: 10px;
}.search-box {margin-top: 10px;padding: 10px;background: #e9ecef;border-radius: 4px;display: flex;justify-content: space-between;align-items: center;
}.search-box button {padding: 4px 8px;border: none;background: #409eff;color: white;border-radius: 4px;cursor: pointer;
}.tabs-demo {margin-top: 10px;padding: 10px;background: #e9ecef;border-radius: 4px;text-align: center;
}
</style>
📚測試代碼正常跑通,附其他基本代碼
- 添加路由
- 頁面展示入口
📘編寫路由 src\router\index.js
import { createRouter, createWebHistory } from 'vue-router'
import RightClickMenuView from '../views/RightClickMenuView.vue'
import RangePickerView from '../views/RangePickerView.vue'const router = createRouter({history: createWebHistory(import.meta.env.BASE_URL),routes: [{path: '/',name: 'progress',component: () => import('../views/ProgressView.vue'),},{path: '/tabs',name: 'tabs',// route level code-splitting// this generates a separate chunk (About.[hash].js) for this route// which is lazy-loaded when the route is visited.// 標簽頁(Tabs)component: () => import('../views/TabsView.vue'),},{path: '/accordion',name: 'accordion',// 折疊面板(Accordion)component: () => import('../views/AccordionView.vue'),},{path: '/timeline',name: 'timeline',// 時間線(Timeline)component: () => import('../views/TimelineView.vue'),},{path: '/backToTop',name: 'backToTop',component: () => import('../views/BackToTopView.vue')},{path: '/notification',name: 'notification',component: () => import('../views/NotificationView.vue')},{path: '/card',name: 'card',component: () => import('../views/CardView.vue')},{path: '/infiniteScroll',name: 'infiniteScroll',component: () => import('../views/InfiniteScrollView.vue')},{path: '/switch',name: 'switch',component: () => import('../views/SwitchView.vue')},{path: '/sidebar',name: 'sidebar',component: () => import('../views/SidebarView.vue')},{path: '/breadcrumbs',name: 'breadcrumbs',component: () => import('../views/BreadcrumbsView.vue')},{path: '/masonryLayout',name: 'masonryLayout',component: () => import('../views/MasonryLayoutView.vue')},{path: '/rating',name: 'rating',component: () => import('../views/RatingView.vue')},{path: '/datePicker',name: 'datePicker',component: () => import('../views/DatePickerView.vue')},{path: '/colorPicker',name: 'colorPicker',component: () => import('../views/ColorPickerView.vue')},{path: '/rightClickMenu',name: 'rightClickMenu',component: RightClickMenuView},{path: '/rangePicker',name: 'rangePicker',component: () => import('../views/RangePickerView.vue')},{path: '/navbar',name: 'navbar',component: () => import('../views/NavbarView.vue')},{path: '/formValidation',name: 'formValidation',component: () => import('../views/FormValidationView.vue')},{path: '/copyToClipboard',name: 'copyToClipboard',component: () => import('../views/CopyToClipboardView.vue')},{path: '/clickAnimations',name: 'clickAnimations',component: () => import('../views/ClickAnimationsView.vue')},{path: '/thumbnailList',name: 'thumbnailList',component: () => import('../views/ThumbnailListView.vue')},{path: '/keyboardShortcuts',name: 'keyboardShortcuts',component: () => import('../views/KeyboardShortcutsView.vue')}],
})export default router
📘編寫展示入口 src\App.vue
<script setup>
import { RouterLink, RouterView } from 'vue-router'
import HelloWorld from './components/HelloWorld.vue'
</script><template><header><img alt="Vue logo" class="logo" src="@/assets/logo.svg" width="125" height="125" /><div class="wrapper"><HelloWorld msg="You did it!" /><nav><RouterLink to="/">Progress</RouterLink><RouterLink to="/tabs">Tabs</RouterLink><RouterLink to="/accordion">Accordion</RouterLink><RouterLink to="/timeline">Timeline</RouterLink><RouterLink to="/backToTop">BackToTop</RouterLink><RouterLink to="/notification">Notification</RouterLink><RouterLink to="/card">Card</RouterLink><RouterLink to="/infiniteScroll">InfiniteScroll</RouterLink><RouterLink to="/switch">Switch</RouterLink><RouterLink to="/sidebar">Sidebar</RouterLink><RouterLink to="/breadcrumbs">Breadcrumbs</RouterLink><RouterLink to="/masonryLayout">MasonryLayout</RouterLink><RouterLink to="/rating">Rating</RouterLink><RouterLink to="/datePicker">DatePicker</RouterLink><RouterLink to="/colorPicker">ColorPicker</RouterLink><RouterLink to="/rightClickMenu">RightClickMenu</RouterLink><RouterLink to="/rangePicker">RangePicker</RouterLink><RouterLink to="/navbar">Navbar</RouterLink><RouterLink to="/formValidation">FormValidation</RouterLink><RouterLink to="/copyToClipboard">CopyToClipboard</RouterLink><RouterLink to="/clickAnimations">ClickAnimations</RouterLink><RouterLink to="/thumbnailList">ThumbnailList</RouterLink><RouterLink to="/keyboardShortcuts">KeyboardShortcuts</RouterLink></nav></div></header><RouterView />
</template><style scoped>
header {line-height: 1.5;max-height: 100vh;
}.logo {display: block;margin: 0 auto 2rem;
}nav {width: 100%;font-size: 12px;text-align: center;margin-top: 2rem;
}nav a.router-link-exact-active {color: var(--color-text);
}nav a.router-link-exact-active:hover {background-color: transparent;
}nav a {display: inline-block;padding: 0 1rem;border-left: 1px solid var(--color-border);
}nav a:first-of-type {border: 0;
}@media (min-width: 1024px) {header {display: flex;place-items: center;padding-right: calc(var(--section-gap) / 2);}.logo {margin: 0 2rem 0 0;}header .wrapper {display: flex;place-items: flex-start;flex-wrap: wrap;}nav {text-align: left;margin-left: -1rem;font-size: 1rem;padding: 1rem 0;margin-top: 1rem;}
}
</style>
📚頁面效果
📚相關文章
?
?
-
0基礎3步部署自己的DeepSeek安裝步驟
-
DeepSeek 助力 Vue 開發:打造絲滑的步驟條(Step bar)https://blog.csdn.net/qq_33650655/article/details/145560497
-
DeepSeek 助力 Vue 開發:打造絲滑的進度條(Progress Bar)https://blog.csdn.net/qq_33650655/article/details/145577034
-
自己部署 DeepSeek 助力 Vue 開發:打造絲滑的標簽頁(Tabs)https://blog.csdn.net/qq_33650655/article/details/145587999
-
自己部署 DeepSeek 助力 Vue 開發:打造絲滑的折疊面板(Accordion)https://blog.csdn.net/qq_33650655/article/details/145590404
-
自己部署 DeepSeek 助力 Vue 開發:打造絲滑的時間線(Timeline )https://blog.csdn.net/qq_33650655/article/details/145597372
-
DeepSeek 助力 Vue 開發:打造絲滑的返回頂部按鈕(Back to Top)https://blog.csdn.net/qq_33650655/article/details/145615550
-
DeepSeek 助力 Vue 開發:打造絲滑的通知欄(Notification Bar)https://blog.csdn.net/qq_33650655/article/details/145620055
-
DeepSeek 助力 Vue 開發:打造絲滑的卡片(Card)https://blog.csdn.net/qq_33650655/article/details/145634564
-
DeepSeek 助力 Vue 開發:打造絲滑的無限滾動(Infinite Scroll)https://blog.csdn.net/qq_33650655/article/details/145638452
-
DeepSeek 助力 Vue 開發:打造絲滑的開關切換(Switch)https://blog.csdn.net/qq_33650655/article/details/145644151
-
DeepSeek 助力 Vue 開發:打造絲滑的側邊欄(Sidebar)https://blog.csdn.net/qq_33650655/article/details/145654204
-
DeepSeek 助力 Vue 開發:打造絲滑的面包屑導航(Breadcrumbs)https://blog.csdn.net/qq_33650655/article/details/145656895
-
DeepSeek 助力 Vue 開發:打造絲滑的瀑布流布局(Masonry Layout)https://blog.csdn.net/qq_33650655/article/details/145663699
-
DeepSeek 助力 Vue 開發:打造絲滑的評分組件(Rating)https://blog.csdn.net/qq_33650655/article/details/145664576
-
DeepSeek 助力 Vue 開發:打造絲滑的日期選擇器(Date Picker),未使用第三方插件 https://blog.csdn.net/qq_33650655/article/details/145673279
-
DeepSeek 助力 Vue 開發:打造絲滑的顏色選擇器(Color Picker)https://blog.csdn.net/qq_33650655/article/details/145689522
-
DeepSeek 助力 Vue 開發:打造絲滑的右鍵菜單(RightClickMenu)https://blog.csdn.net/qq_33650655/article/details/145706658
-
DeepSeek 助力 Vue 開發:打造絲滑的范圍選擇器(Range Picker)https://blog.csdn.net/qq_33650655/article/details/145713572
-
DeepSeek 助力 Vue 開發:打造絲滑的導航欄(Navbar)https://blog.csdn.net/qq_33650655/article/details/145732421
-
DeepSeek 助力 Vue 開發:打造絲滑的表單驗證(Form Validation)https://blog.csdn.net/qq_33650655/article/details/145735582
-
DeepSeek 助力 Vue 開發:打造絲滑的復制到剪貼板(Copy to Clipboard)https://blog.csdn.net/qq_33650655/article/details/145739569
-
DeepSeek 助力 Vue 開發:打造絲滑的點擊動畫(Click Animations)https://blog.csdn.net/qq_33650655/article/details/145766184
-
DeepSeek 助力 Vue 開發:打造絲滑的縮略圖列表(Thumbnail List)https://blog.csdn.net/qq_33650655/article/details/145776679
到此這篇文章就介紹到這了,更多精彩內容請關注本人以前的文章或繼續瀏覽下面的文章,創作不易,如果能幫助到大家,希望大家多多支持寶碼香車~💕,若轉載本文,一定注明本文鏈接。
更多專欄訂閱推薦:
👍 html+css+js 絢麗效果
💕 vue
?? Electron
?? js
📝 字符串
?? 時間對象(Date())操作