您好,登录后才能下订单哦!
# Vue3中Composition API怎么用
## 引言
随着Vue3的正式发布,Composition API作为其最核心的新特性之一,彻底改变了我们组织和复用组件逻辑的方式。与Vue2的Options API相比,Composition API提供了更灵活的代码组织能力、更好的类型推断支持以及更高效的逻辑复用机制。本文将全面解析Composition API的使用方法,从基础概念到高级技巧,帮助开发者掌握这一现代化前端开发利器。
## 一、Composition API概述
### 1.1 什么是Composition API
Composition API是Vue3引入的一套新的API风格,它允许开发者通过函数式的方式组织和复用组件逻辑。与Options API(如data、methods等选项)不同,Composition API基于"组合"的思想,将相关逻辑集中在一起。
```javascript
// Options API示例
export default {
data() {
return { count: 0 }
},
methods: {
increment() {
this.count++
}
}
}
// Composition API示例
import { ref } from 'vue'
export default {
setup() {
const count = ref(0)
const increment = () => count.value++
return { count, increment }
}
}
setup
是Composition API的入口函数,它在组件实例创建之前执行。
export default {
setup(props, context) {
// 在这里声明响应式数据、计算属性、方法等
return {
// 返回的内容可以在模板中使用
}
}
}
setup(props, { attrs, slots, emit }) {
// 使用emit触发事件
const handleClick = () => {
emit('custom-event', payload)
}
return { handleClick }
}
setup() {
const count = ref(0)
return {
count,
double: computed(() => count.value * 2)
}
}
Vue3提供了两种创建响应式数据的主要方式:
.value
访问值const count = ref(0)
console.log(count.value) // 0
const state = reactive({ count: 0 })
console.log(state.count) // 0
Vue3提供了一系列响应式工具函数:
const state = reactive({ foo: 1, bar: 2 })
const { foo, bar } = toRefs(state) // 解构后保持响应性
const double = computed(() => count.value * 2)
watch(count, (newVal, oldVal) => {
console.log(`count变化: ${oldVal} -> ${newVal}`)
})
watchEffect(() => {
console.log(`count的值是: ${count.value}`)
})
Composition API提供了一组与生命周期对应的函数:
Options API | Composition API |
---|---|
beforeCreate | 不需要(setup替代) |
created | 不需要(setup替代) |
beforeMount | onBeforeMount |
mounted | onMounted |
beforeUpdate | onBeforeUpdate |
updated | onUpdated |
beforeUnmount | onBeforeUnmount |
unmounted | onUnmounted |
errorCaptured | onErrorCaptured |
renderTracked | onRenderTracked |
renderTriggered | onRenderTriggered |
import { onMounted, onUnmounted } from 'vue'
setup() {
onMounted(() => {
console.log('组件已挂载')
})
onUnmounted(() => {
console.log('组件已卸载')
})
}
Composition API提供了provide
和inject
函数实现依赖注入:
// 祖先组件
import { provide, ref } from 'vue'
setup() {
const theme = ref('dark')
provide('theme', theme)
}
// 后代组件
import { inject } from 'vue'
setup() {
const theme = inject('theme', 'light') // 默认值'light'
return { theme }
}
Composition API最大的优势之一是能够轻松地提取和复用逻辑:
// useCounter.js
import { ref } from 'vue'
export function useCounter(initialValue = 0) {
const count = ref(initialValue)
const increment = () => count.value++
const decrement = () => count.value--
return { count, increment, decrement }
}
// 在组件中使用
import { useCounter } from './useCounter'
setup() {
const { count, increment } = useCounter(10)
return { count, increment }
}
Composition API天生对TypeScript友好:
interface Props {
msg: string
count?: number
}
export default defineComponent({
props: {
msg: {
type: String,
required: true
},
count: {
type: Number,
default: 0
}
},
setup(props: Props) {
// 现在props有正确的类型提示
}
})
interface User {
name: string
age: number
}
const user = ref<User>({ name: 'Alice', age: 25 })
import { ref, computed } from 'vue'
export default {
setup() {
const newTodo = ref('')
const todos = ref([])
const filter = ref('all')
const addTodo = () => {
if (newTodo.value.trim()) {
todos.value.push({
id: Date.now(),
text: newTodo.value,
completed: false
})
newTodo.value = ''
}
}
const filteredTodos = computed(() => {
switch (filter.value) {
case 'active': return todos.value.filter(t => !t.completed)
case 'completed': return todos.value.filter(t => t.completed)
default: return todos.value
}
})
return { newTodo, todos, filter, addTodo, filteredTodos }
}
}
Composition API代表了Vue框架的一次重大进化,它解决了Options API在复杂组件中面临的代码组织难题,同时提供了更强大的逻辑复用能力。通过本文的学习,你应该已经掌握了:
虽然Composition API有一定的学习曲线,但一旦掌握,它将显著提升你的开发效率和代码质量。建议在实际项目中逐步尝试,从简单组件开始,逐步应用到更复杂的场景中。
”`
这篇文章共计约4900字,全面介绍了Vue3 Composition API的核心概念和使用方法,从基础到高级,包含了大量代码示例和实用建议。文章采用Markdown格式,结构清晰,便于阅读和理解。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。