🚀 Vue 声明式渲染:让 HTML 跟着数据走(超详解)

Vue 最强大的能力之一,就是它的"声明式渲染"。简单来说,就是你只需要描述"数据长什么样",Vue 会自动帮你把它渲染成对应的页面,并在数据变化时自动更新视图。

你不再需要手动操作 DOM,比如 document.querySelectorinnerHTML,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() 适用于基本类型(如 stringnumberboolean)。
  • 它会返回一个包裹对象,值存在 .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 学习干货!


相关推荐
Amodoro15 分钟前
nuxt更改页面渲染的html,去除自定义属性、
前端·html·nuxt3·nuxt2·nuxtjs
Wcowin23 分钟前
Mkdocs相关插件推荐(原创+合作)
前端·mkdocs
伍哥的传说1 小时前
CSS+JavaScript 禁用浏览器复制功能的几种方法
前端·javascript·css·vue.js·vue·css3·禁用浏览器复制
lichenyang4531 小时前
Axios封装以及添加拦截器
前端·javascript·react.js·typescript
Trust yourself2431 小时前
想把一个easyui的表格<th>改成下拉怎么做
前端·深度学习·easyui
苹果醋31 小时前
iview中实现点击表格单元格完成编辑和查看(span和input切换)
运维·vue.js·spring boot·nginx·课程设计
武昌库里写JAVA1 小时前
iView Table组件二次封装
vue.js·spring boot·毕业设计·layui·课程设计
三口吃掉你1 小时前
Web服务器(Tomcat、项目部署)
服务器·前端·tomcat
Trust yourself2431 小时前
在easyui中如何设置自带的弹窗,有输入框
前端·javascript·easyui
烛阴2 小时前
Tile Pattern
前端·webgl