核心概念
Vue3 data() 函数是组件实例的数据仓库,返回的对象会成为组件实例的响应式属性。它相当于 Vue 2 中的 data 选项,但通过组合式 API 的函数形式实现。
data() 函数返回的每个属性都会被 Vue 3 的响应式系统追踪,当属性值变化时会自动更新视图。这种设计让组件数据管理更清晰,同时避免了 Vue 2 中 data 必须是函数的限制。
基础语法
组件中定义 data() 的最简形式:
export default {
data() {
return {
count: 0 // 定义响应式数据 count
}
}
}
数据绑定
在模板中可以直接通过 {{ count }} 访问 data 返回的属性,修改时会触发视图更新:
// 修改数据
this.count = 10 // this 是组件实例
响应式更新
data 返回的属性会自动转换为 Proxy 对象:
// 模板中绑定数据
<p>当前计数: {{ count }}</p>
// 方法中修改数据
methods: {
increment() {
this.count++ // 自动触发视图更新
}
}
不可变属性
data 返回的属性不能是函数或类实例等非可变类型:
// 错误示例
data() {
return {
log: console.log // 会导致警告
}
}
进阶特性
| 特性 | 说明 | 示例 |
|---|---|---|
| 响应式嵌套 | 支持多层嵌套对象的响应式 |
data() {
return {
user: { name: 'Alice' } // user.name 变化也会触发更新
}
}
| ref 与 reactive | 基本类型用 ref,对象用 reactive |
import { ref, reactive } from 'vue'
data() {
return {
text: ref(''), // 使用 ref 包装基本类型
config: reactive({ // 使用 reactive 包装对象
theme: 'dark'
})
}
}
| 与计算属性结合 | data 作为计算属性的依赖 |
computed: {
doubleCount() {
return this.count * 2 // 自动追踪 count 变化
}
}
实战应用
表单数据绑定
<template>
<input v-model="formData.name" placeholder="输入姓名">
</template>
<script>
export default {
data() {
return {
formData: { // 表单数据对象
name: '', // 初始为空
email: 'example@example.com' // 可设置默认值
}
}
}
}
</script>
购物车管理
export default {
data() {
return {
cartItems: [ // 响应式购物车列表
{ name: '苹果', price: 5, quantity: 2 },
{ name: '香蕉', price: 3, quantity: 1 }
],
totalPrice: 0 // 非响应式计算结果
}
},
watch: {
cartItems: { // 监听数组变化
deep: true,
handler(newVal) {
this.totalPrice = newVal.reduce((sum, item) =>
sum + item.price * item.quantity, 0)
}
}
}
}
注意事项
-
不要直接修改 data 属性
通过this.$set()修改嵌套属性,避免数组索引直接赋值:this.$set(this.user, 'age', 30) // 正确方式 // this.user.age = 30 会失效 -
避免返回对象的引用
每个组件实例应返回独立数据对象:// 错误:共享对象 data: () => ({ count: 0 }) // 正确:独立对象 data() { return { count: 0 } } -
初始化数据的最佳实践
复杂数据结构建议使用工厂函数初始化:data() { return { items: createDefaultItems() // 保证每个实例独立 } }
总结
Vue3 data() 函数通过返回响应式对象为组件提供可追踪的数据源,是构建动态界面的核心机制。理解其工作原理能帮助开发者更高效地管理组件状态。