以下为你提供 4 个实用的 Vue3 组合式函数(Composition API)实例,包含详细代码和使用说明:
import { ref } from 'vue'
export function useToggle(initialValue = false) {
const state = ref(initialValue)
const toggle = () => {
state.value = !state.value
}
const set = (value) => {
state.value = Boolean(value)
}
return {
state,
toggle,
set
}
}
// 使用示例
// const { state: isOpen, toggle: toggleMenu } = useToggle()
// <button @click="toggleMenu">{{ isOpen ? 'Close' : 'Open' }}</button>
功能说明:
import { ref } from 'vue'
export function useFetch(url) {
const data = ref(null)
const error = ref(null)
const loading = ref(false)
const execute = async () => {
try {
loading.value = true
const response = await fetch(url)
data.value = await response.json()
} catch (err) {
error.value = err
} finally {
loading.value = false
}
}
return {
data,
error,
loading,
execute
}
}
// 使用示例
// const { data, loading, execute } = useFetch('/api/data')
// onMounted(() => execute())
功能说明:
import { ref, watchEffect } from 'vue'
export function useLocalStorage(key, defaultValue) {
const storedValue = localStorage.getItem(key)
const state = ref(storedValue ? JSON.parse(storedValue) : defaultValue)
watchEffect(() => {
localStorage.setItem(key, JSON.stringify(state.value))
})
return state
}
// 使用示例
// const theme = useLocalStorage('theme', 'light')
// theme.value = 'dark' // 自动保存到 localStorage
功能说明:
import { ref, onMounted, onUnmounted } from 'vue'
export function useMousePosition() {
const x = ref(0)
const y = ref(0)
const update = (e) => {
x.value = e.clientX
y.value = e.clientY
}
onMounted(() => {
window.addEventListener('mousemove', update)
})
onUnmounted(() => {
window.removeEventListener('mousemove', update)
})
return { x, y }
}
// 使用示例
// const { x, y } = useMousePosition()
// <div>鼠标位置:{{ x }}, {{ y }}</div>
功能说明:
import { ref } from 'vue'
export function useDebounce(value, delay = 300) {
const debouncedValue = ref(value.value)
let timeout = null
const updateValue = (newValue) => {
clearTimeout(timeout)
timeout = setTimeout(() => {
debouncedValue.value = newValue
}, delay)
}
watch(value, (newVal) => {
updateValue(newVal)
})
return debouncedValue
}
// 使用示例
// const searchText = ref('')
// const debouncedText = useDebounce(searchText)
// watch(debouncedText, value => fetchResults(value))
功能说明:
组合式函数优势:
每个示例都遵循组合式 API 的最佳实践,包含清晰的关注点分离和响应式处理。建议通过实际项目练习来加深理解,可以根据具体需求扩展这些基础 Hook 的功能。