Vue 最强大的能力之一,就是它的"声明式渲染"。简单来说,就是你只需要描述"数据长什么样",Vue 会自动帮你把它渲染成对应的页面,并在数据变化时自动更新视图。
你不再需要手动操作 DOM,比如 document.querySelector
或 innerHTML
,Vue 全帮你搞定。
💡 什么是"响应式状态"?
Vue 通过一个"响应式系统"来追踪数据的变化。只要你的数据是响应式的,Vue 就能知道它变了,然后自动更新页面。
我们可以用两种方式创建响应式状态:
✅ reactive()
:让对象变响应式
js
import { reactive } from 'vue'
// 创建一个响应式对象,包含一个 count 属性
const counter = reactive({
count: 0
})
console.log(counter.count) // 输出 0
counter.count++ // 改变 count 的值,页面会自动响应更新
🔍 说明:
reactive()
接收一个对象,并返回这个对象的响应式"代理版"。- 它内部使用了
Proxy
,可以追踪对象的属性访问与修改。 - 适用于:对象、数组、Map、Set 等 复合类型。
✅ ref()
:让任意类型变响应式
js
import { ref } from 'vue'
// 创建一个字符串类型的响应式变量
const message = ref('Hello World!')
console.log(message.value) // 输出 "Hello World!"
message.value = 'Changed' // 修改 value,页面会自动更新
🔍 说明:
ref()
适用于基本类型(如string
、number
、boolean
)。- 它会返回一个包裹对象,值存在
.value
属性里。 - 相当于把普通变量"包裹"进一个响应式盒子中。
💡 什么是"自动解包"?------ Vue 帮你更舒服地写代码!
你可能注意到了:在 JavaScript 里,我们通过 .value
来访问 ref
:
js
console.log(message.value)
但在模板(<template>
)里,却能直接这样写:
js
<template>
<h1>{{ message }}</h1>
</template>
为什么不需要 .value
?这就是 Vue 的一个贴心设计:模板中会自动"解包" ref 的值!
✅ 自动解包的好处:
- 省去
.value
,让模板更直观。 - 你只管把变量塞进模板里,Vue 会自动帮你取
.value
。
❗ 注意:
- 只有在模板里(或者
setup()
返回值中)才自动解包。 - 在 JS 代码中,仍然需要
.value
来访问或修改ref
的值。
✨ 使用响应式数据渲染模板
我们可以这样结合上面的 ref()
和 reactive()
,在模板中实现动态展示:
js
<template>
<!-- message 是 ref,会自动解包 -->
<h1>{{ message }}</h1>
<!-- counter 是 reactive 对象,直接访问属性 -->
<p>Count is: {{ counter.count }}</p>
</template>
<script setup>
import { ref, reactive } from 'vue'
// 创建响应式的字符串
const message = ref('Hello Vue!')
// 创建响应式对象,包含计数器
const counter = reactive({
count: 0
})
</script>
🧪 模板中还能用 JavaScript 表达式
你可以直接在 {{ }}
中写合法的 JS 表达式,比如对字符串进行处理:
vue
<!-- 将 message 倒序显示 -->
<h1>{{ message.split('').reverse().join('') }}</h1>
⛳ 提示:
- 表达式不要太复杂,保持模板简洁易读。
- 如果逻辑过多,建议写在
<script>
中,用计算属性或方法处理。
📌 总结重点
功能点 | 说明 |
---|---|
reactive() |
创建响应式对象(如对象、数组等),基于 Proxy |
ref() |
创建可响应的基本类型(如字符串、数字等) |
.value |
ref 包裹的值必须通过 .value 访问(除模板中) |
自动解包 | 模板中使用 ref 时无需 .value ,Vue 自动处理 |
声明式渲染 | 页面展示内容由数据状态决定,状态变化自动更新 |
🛠️ 小练习:试试这个!
试着写一个简单组件,包含一个输入框,实时展示用户输入的内容:
js
<template>
<input v-model="inputText" placeholder="输入点什么..." />
<p>你刚才输入的是:{{ inputText }}</p>
</template>
<script setup>
import { ref } from 'vue'
// 创建响应式的输入文本
const inputText = ref('')
</script>
这就是声明式渲染 + 响应式的魅力:你只管写数据逻辑,界面会自己动起来!
📖 结语
Vue 的响应式系统是它强大功能的核心之一。通过 reactive()
和 ref()
,我们可以轻松地将数据变为响应式状态,而 Vue 的自动解包机制也大大提升了开发体验。
希望这篇文章能帮助你更好地理解 Vue 的声明式渲染机制。如果你是 Vue 新手,建议多动手实践,加深理解。
📌 关注我,获取更多 Vue 学习干货!