Skip to content

数据绑定

数据绑定是Vue的核心特性之一,它允许你将Vue的响应式数据与DOM元素绑定,实现数据与视图的同步。本章节将详细介绍Vue3中的数据绑定方式。

单向数据绑定

单向数据绑定是指数据从数据模型流向视图,当数据发生变化时,视图会自动更新。

1. 插值表达式

语法

作用:将数据绑定到模板中

示例

vue
<template>
  <div>
    <h1>{{ message }}</h1>
    <p>{{ count * 2 }}</p>
    <p>{{ user.name }}</p>
  </div>
</template>

<script setup>
import { ref, reactive } from 'vue'

const message = ref('Hello Vue3!')
const count = ref(0)
const user = reactive({ name: 'John' })
</script>

2. v-bind 指令

语法v-bind:attribute="expression":attribute="expression"

作用:绑定HTML属性

示例

vue
<template>
  <div>
    <img :src="imageUrl" :alt="imageAlt">
    <div :class="{ active: isActive }">Active</div>
    <div :style="{ color: textColor, fontSize: '16px' }">Styled text</div>
  </div>
</template>

<script setup>
import { ref } from 'vue'

const imageUrl = ref('https://example.com/image.jpg')
const imageAlt = ref('Example image')
const isActive = ref(true)
const textColor = ref('red')
</script>

双向数据绑定

双向数据绑定是指数据不仅从数据模型流向视图,还从视图流向数据模型,当用户在视图中修改数据时,数据模型也会自动更新。

1. v-model 指令

语法v-model="expression"

作用:实现双向数据绑定

示例

vue
<template>
  <div>
    <input v-model="message" type="text">
    <p>{{ message }}</p>
    <input v-model="count" type="number">
    <p>{{ count }}</p>
  </div>
</template>

<script setup>
import { ref } from 'vue'

const message = ref('')
const count = ref(0)
</script>

2. v-model 修饰符

lazy:延迟更新,在失去焦点或按下回车键时更新

vue
<template>
  <div>
    <input v-model.lazy="message" type="text">
    <p>{{ message }}</p>
  </div>
</template>

<script setup>
import { ref } from 'vue'

const message = ref('')
</script>

number:将输入值转换为数字

vue
<template>
  <div>
    <input v-model.number="count" type="number">
    <p>{{ typeof count }}</p>
  </div>
</template>

<script setup>
import { ref } from 'vue'

const count = ref(0)
</script>

trim:去除输入值的首尾空格

vue
<template>
  <div>
    <input v-model.trim="name" type="text">
    <p>{{ name }}</p>
  </div>
</template>

<script setup>
import { ref } from 'vue'

const name = ref('')
</script>

响应式数据

在Vue3中,我们使用 refreactive 来创建响应式数据。

1. ref

作用:创建响应式的基本类型数据

使用方法

javascript
import { ref } from 'vue'

const count = ref(0)
const message = ref('Hello')
const isActive = ref(true)

// 访问值
console.log(count.value)

// 修改值
count.value++

2. reactive

作用:创建响应式的对象或数组

使用方法

javascript
import { reactive } from 'vue'

const user = reactive({
  name: 'John',
  age: 25,
  address: {
    city: 'New York',
    country: 'USA'
  }
})

// 访问值
console.log(user.name)

// 修改值
user.age = 26
user.address.city = 'Los Angeles'

3. toRef 和 toRefs

作用:创建指向响应式对象属性的引用

使用方法

javascript
import { reactive, toRef, toRefs } from 'vue'

const user = reactive({
  name: 'John',
  age: 25
})

// toRef
const nameRef = toRef(user, 'name')
console.log(nameRef.value) // John

// toRefs
const { name, age } = toRefs(user)
console.log(name.value) // John
console.log(age.value) // 25

计算属性

计算属性是基于响应式数据计算出来的值,它会缓存计算结果,只有当依赖的响应式数据发生变化时才会重新计算。

1. 使用计算属性

vue
<template>
  <div>
    <input v-model="firstName" type="text">
    <input v-model="lastName" type="text">
    <p>Full name: {{ fullName }}</p>
  </div>
</template>

<script setup>
import { ref, computed } from 'vue'

const firstName = ref('John')
const lastName = ref('Doe')

const fullName = computed(() => {
  return `${firstName.value} ${lastName.value}`
})
</script>

2. 计算属性的 setter

vue
<template>
  <div>
    <input v-model="fullName" type="text">
    <p>First name: {{ firstName }}</p>
    <p>Last name: {{ lastName }}</p>
  </div>
</template>

<script setup>
import { ref, computed } from 'vue'

const firstName = ref('John')
const lastName = ref('Doe')

const fullName = computed({
  get: () => `${firstName.value} ${lastName.value}`,
  set: (value) => {
    const [first, last] = value.split(' ')
    firstName.value = first
    lastName.value = last
  }
})
</script>

监听属性

监听属性用于监听响应式数据的变化,当数据发生变化时执行相应的操作。

1. watch

作用:监听响应式数据的变化

使用方法

vue
<template>
  <div>
    <input v-model="message" type="text">
    <p>{{ message }}</p>
  </div>
</template>

<script setup>
import { ref, watch } from 'vue'

const message = ref('Hello')

watch(message, (newValue, oldValue) => {
  console.log(`Message changed from ${oldValue} to ${newValue}`)
})
</script>

2. watchEffect

作用:自动追踪响应式数据的变化

使用方法

vue
<template>
  <div>
    <input v-model="message" type="text">
    <input v-model="count" type="number">
  </div>
</template>

<script setup>
import { ref, watchEffect } from 'vue'

const message = ref('Hello')
const count = ref(0)

watchEffect(() => {
  console.log(`Message: ${message.value}, Count: ${count.value}`)
})
</script>

数据绑定的最佳实践

1. 优先使用单向数据绑定

对于大多数场景,单向数据绑定已经足够,它更加简单和可预测。

2. 合理使用双向数据绑定

双向数据绑定适合用于表单输入场景,它可以简化代码。

3. 使用计算属性处理复杂逻辑

当需要基于响应式数据计算新值时,优先使用计算属性。

4. 合理使用监听属性

当需要在数据变化时执行副作用操作时,使用监听属性。

5. 避免在模板中使用复杂表达式

模板中的表达式应该简单明了,复杂逻辑应该放在计算属性或方法中。

总结

数据绑定是Vue的核心特性,它使得数据与视图的同步变得简单和直观。通过单向数据绑定和双向数据绑定,你可以构建响应式的用户界面;通过计算属性和监听属性,你可以处理复杂的业务逻辑。

在后续的章节中,我们将学习Vue3的指令系统,包括常用指令的使用方法和最佳实践。

© 2026 编程马·菜鸟教程 版权所有