在 vue 3 的 Composition api 中,reactive() 函数专门用来创建对象类型的响应式数据。无论是普通对象、数组、Map 还是 Set,reactive 都能让它们变成响应式的。
使用 reactive 前需要先引入:
import { reactive } from 'vue'创建响应式对象很简单:
const user = reactive({
name: '张三',
age: 25,
address: {
city: '北京',
street: '朝阳区'
}
})在模板中使用这些数据:
<template>
<div class="person">
<h2>{{ user.name }}</h2>
<p>年龄: {{ user.age }}</p>
<p>城市: {{ user.address.city }}</p>
</div>
</template>让我们添加按钮来验证数据的响应式特性:
<template>
<div>
<h2>{{ user.name }}</h2>
<p>年龄: {{ user.age }}</p>
<p>城市: {{ user.address.city }}</p>
<button @click="incrementAge">增加年龄</button>
<button @click="updateCity">更新城市</button>
</div>
</template>
<script lang="ts" setup>
import { reactive } from 'vue'
const user = reactive({
name: '张三',
age: 25,
address: {
city: '北京',
street: '朝阳区'
}
})
const incrementAge = () => {
user.age++
}
const updateCity = () => {
user.address.city = '上海'
}
</script>点击"增加年龄"按钮时,页面上的年龄显示会立即更新。点击"更新城市"按钮时,城市信息也会实时变化。这就是响应式数据的威力——数据变化时,界面自动更新。
reactive 同样适用于数组和复杂的嵌套结构:
const todos = reactive([
{ id: 1, text: '学习 Vue 3' },
{ id: 2, text: '掌握响应式' }
])在模板中展示数组数据:
<template>
<div>
<h2>{{ user.name }}</h2>
<p>年龄: {{ user.age }}</p>
<p>城市: {{ user.address.city }}</p>
<button @click="incrementAge">增加年龄</button>
<button @click="updateCity">更新城市</button>
<ul>
<li v-for="todo in todos" :key="todo.id">
{{ todo.text }}
</li>
</ul>
<button @click="addTodo">添加任务</button>
</div>
</template>
<script lang="ts" setup>
import { reactive } from 'vue'
const user = reactive({
name: '张三',
age: 25,
address: {
city: '北京',
street: '朝阳区'
}
})
const todos = reactive([
{ id: 1, text: '学习 Vue 3' },
{ id: 2, text: '掌握响应式' }
])
const incrementAge = () => {
user.age++
}
const updateCity = () => {
user.address.city = '上海'
}
const addTodo = () => {
todos.push({
id: todos.length + 1,
text: `访问${user.address.city}`
})
}
</script>这里有几个重要概念:
reactive 创建的响应式对象具有深层响应性,即使是多层嵌套的对象也是响应式的:
<template>
<div>
<h2>嵌套对象值: {{ test.x.y.c }}</h2>
<button @click="updateNestedValue">更新嵌套值</button>
</div>
</template>
<script lang="ts" setup>
import { reactive } from 'vue'
const test = reactive({
x: {
y: {
c: 666
}
}
})
const updateNestedValue = () => {
test.x.y.c = 777
}
</script>点击按钮时,即使修改的是深层嵌套的属性,界面也会正确更新。
const state = reactive({
user: {
name: '李四',
age: 30
},
settings: {
theme: 'dark',
language: 'zh-CN'
}
})
// 修改属性
state.user.name = '王五'
// 添加新属性
state.user.gender = '男'
// 删除属性
delete state.user.ageconst list = reactive(['苹果', '香蕉', '橙子'])
// 添加元素
list.push('葡萄')
// 删除元素
list.splice(1, 1) // 删除第二个元素
// 修改元素
list[0] = '西瓜'
// 过滤数组
const filteredList = list.filter(item => item !== '香蕉')理解 reactive 和 ref 的区别很重要:
reactive 专门用于对象类型(对象、数组、Map、Set)
ref 可以用于任何类型,包括基本类型
reactive 返回的是原始对象的 Proxy 对象
ref 返回的是包含 value 属性的对象
import { reactive, ref } from 'vue'
// 使用 reactive 处理对象
const user = reactive({ name: '张三', age: 25 })
// 使用 ref 处理基本类型
const count = ref(0)
const message = ref('Hello')
// 使用 ref 处理对象(不推荐)
const userRef = ref({ name: '李四', age: 30 })
// 访问时需要 .value
console.log(userRef.value.name)<template>
<form @submit.prevent="handleSubmit">
<input v-model="formData.username" placeholder="用户名">
<input v-model="formData.email" placeholder="邮箱">
<input v-model="formData.password" type="password" placeholder="密码">
<button type="submit">注册</button>
</form>
</template>
<script lang="ts" setup>
import { reactive } from 'vue'
const formData = reactive({
username: '',
email: '',
password: ''
})
const handleSubmit = () => {
console.log('提交数据:', formData)
// 这里可以发送数据到服务器
}
</script><template>
<div>
<div v-for="item in cart.items" :key="item.id" class="cart-item">
<span>{{ item.name }}</span>
<span>¥{{ item.price }}</span>
<span>数量: {{ item.quantity }}</span>
<button @click="increaseQuantity(item.id)">+</button>
<button @click="decreaseQuantity(item.id)">-</button>
</div>
<p>总价: ¥{{ cart.total }}</p>
</div>
</template>
<script lang="ts" setup>
import { reactive, computed } from 'vue'
const cart = reactive({
items: [
{ id: 1, name: '商品A', price: 100, quantity: 1 },
{ id: 2, name: '商品B', price: 200, quantity: 2 }
],
total: computed(() => {
return cart.items.reduce((sum, item) => sum + item.price * item.quantity, 0)
})
})
const increaseQuantity = (id: number) => {
const item = cart.items.find(item => item.id === id)
if (item) item.quantity++
}
const decreaseQuantity = (id: number) => {
const item = cart.items.find(item => item.id === id)
if (item && item.quantity > 1) item.quantity--
}
</script>直接替换会失去响应性
// 错误做法
let state = reactive({ count: 0 })
state = { count: 1 } // 失去响应性
// 正确做法
Object.assign(state, { count: 1 })解构会失去响应性
const state = reactive({ count: 0, name: 'test' })
// 错误:解构后失去响应性
const { count, name } = state
// 正确:使用 toRefs 保持响应性
import { toRefs } from 'vue'
const { count, name } = toRefs(state)响应式对象在异步中仍然有效
const state = reactive({ data: null })
setTimeout(() => {
state.data = '异步数据' // 仍然响应式
}, 1000)reactive 是 Vue 3 Composition API 的核心功能之一,它让对象类型的数据变得响应式。无论是简单的对象、复杂的嵌套结构还是数组,reactive 都能很好地处理。
记住这些要点:
掌握 reactive 的使用,能够让你在 Vue 3 开发中更加得心应手,构建出响应迅速、用户体验良好的应用。
本文内容仅供个人学习/研究/参考使用,不构成任何决策建议或专业指导。分享/转载时请标明原文来源,同时请勿将内容用于商业售卖、虚假宣传等非学习用途哦~感谢您的理解与支持!
rem是相对于根元素html,这样就意味着,我们只需要在根元素确定一个px字号,则可以来算出元素的宽高。
通过模块化缩放,使用传统属性和calc()来动态缩放你的字体大小.为字体大小使用百分比.给文本内容和媒体查询使用em,针对不同视口尺寸使用不同缩放值.视口越小,缩放比例越小,使用媒体查询或者media()函数基于视口来改变比例和基础字号
在目前的前端开发中,我们经常需要进行响应式的网站开发。本文着重介绍一下弹性图片,也就是响应式图片的解决方案:js或服务端、srcset 、sizes 、picture标签、svg图片
HTML5+CSS3响应式垂直时间轴,使用了HTML5标签<section>,时间轴中所有的内容包括标题、简介、时间和图像都放在.cd-timeline-block的DIV中,多个DIV形成一个序列,并把这些DIV放在<section>中。
CSS 变量是 CSS 引入的一个新特性,目前绝大多数浏览器已经支持了,它可以帮助我们用更少的代码写出同样多的样式,大大提高了工作效率,本篇文章将教你如何使用 CSS 变量(css variable)。CSS中原生的变量定义语法是:--*,变量使用语法是:var(--*),其中*表示变量名称
Vue通过设定对象属性的setter/getter方法来监听数据的变化,通过getter进行依赖收集,而每个setter方法就是一个观察者,在数据变更的时候通知订阅者更新视图。
Vue 最独特的特性之一,是其非侵入性的响应式系统。数据模型仅仅是普通的JavaScript 对象,而当你修改它们时,视图会进行更新,这使得状态管理非常简单直接,我们可以只关注数据本身
常见的布局方案:固定布局:以像素作为页面的基本单位,不管设备屏幕及浏览器宽度,只设计一套尺寸;可切换的固定布局:同样以像素作为页面单位,参考主流设备尺寸
响应式布局,即 Responsive design,在实现不同屏幕分辨率的终端上浏览网页的不同展示方式。通过响应式设计能使网站在手机和平板电脑上有更好的浏览阅读体验。响应式布局的关键不仅仅在于布局
说到响应式原理其实就是双向绑定的实现,说到 双向绑定 其实有两个操作,数据变化修改dom,input等文本框修改值的时候修改数据1. 数据变化 -> 修改dom;2. 通过表单修改value -> 修改数据
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!