Vue响应式状态ref()与reactive()

1. ref()声明响应式状态

javascript 复制代码
<template>
  <!--在DOM元素调用变量时,不需要指定输出变量的value,因为Vue会帮你输出.value
  但是注意,这个帮助只会帮助顶级的ref属性才会被解包-->
  <div>{{ count }}</div>

  <div>{{ object }}</div>

  <div>{{ array }}</div>
</template>
<script setup>
//从vue中获取ref方法
import { ref } from "vue";

name: "App";
console.log('--------------------------------------------------------------------------')
//定义一个变量count,设置为响应式,初始值为0
let count = ref(0);
//输出变量count的值,结果为RefImpl对象,其内部会有被数据劫持的value
console.log('count:',count);
//输出变量count的value值,结果为0
console.log('count.value:',count.value);
//实现对变量的操作,0+1
count.value++;
//再次输出变量count的value值,结果为1
console.log('+1后的count.value:',count.value);

console.log('------------------------------ref使用对象-------------------------------------')

//定义一个对象,使用ref声明其状态为响应式
let object=ref({
  id:1,
  name:'小绿'
})
//输出object的value值为Proxy(Object) {id: 1, name: '小绿'}
console.log('其value:',object.value)
//输出object下name的值为小绿
console.log('对象object的name值:',object.value.name)
//修改object的name值为小红
object.value.name='小红'
//输出修改后的object的name值为小红
console.log('修改object的name值后输出:',object.value.name)

console.log('------------------------------ref使用数组-------------------------------------')
let array=ref(['洗澡','学习','唱歌'])
//输出array的value值为Proxy(Array) {0: '洗澡', 1: '学习', 2: '唱歌'}
console.log('其value:',array.value)
//输出array下标为0的值为洗澡
console.log('对象array的下标为0的值:',array.value[0])
//修改array下标为0的值为打扑克
array.value[0]='打扑克'
//输出修改后的array下标为0值为打扑克
console.log('改后的array下标为0值输出:',array.value[0])
</script>

<style scoped>
</style>

HTML输出

1

{ "id": 1, "name": "小红" }

"打扑克", "学习", "唱歌"

2. reactive()使对象本身具有响应性

javascript 复制代码
<template>
  <!--在DOM元素调用变量时,不需要指定输出变量的value,因为Vue会帮你输出.value
  但是注意,这个帮助只会帮助顶级的ref属性才会被解包-->
  <div>{{ state.count }}</div>

  <div>{{ array[0] }}</div>
</template>
<script setup>
//从vue中获取ref方法
import { reactive } from "vue";

name: "App";
console.log('------------------------------reactive使用对象-------------------------------------')
//定义一个对象state,设置其响应性,state对象的count属性值为0
let state = reactive({
  count:0
});
//输出state对象值
console.log('state对象值为:',state)
//输出state对象的count属性值
console.log('state对象的count属性值为:',state.count)
//设置state对象的属性count值为1
state.count++
//输出state对象的count属性加1后的值
console.log('输出state对象的count属性加1后的值:',state.count)

console.log('------------------------------reactive使用数组-------------------------------------')
//定义数组,设置其响应性
let array = reactive(['洗澡','学习','唱歌']);
//输出array数组值
console.log('array数组值为:',array)
//输出array数组下标为0的值
console.log('array数组下标为0的值为:',array[0])
//设置array数组下标为0的值为看电视
array[0]='看电视'
//输出array数组下标为0的数据修改后的值
console.log('输出array数组下标为0的数据修改后的值:',array[0])

console.log('------------------------------数据原理及注意事项-------------------------------------')
//reactive() 返回的是一个原始对象的 Proxy,它和原始对象是不相等的
const raw={}
const proxy=reactive(raw)
console.log('对比proxy与raw设置响应性后是否相等:',proxy===raw)

//对同一个原始对象调用 reactive() 会总是返回同样的代理对象,而对一个已存在的代理对象调用 reactive() 会返回其本身
console.log('对同一个原始对象raw调用reactive():',proxy===reactive(raw))
console.log('对一个已存在的代理proxy对象调用reactive():',proxy===reactive(proxy))

//依靠深层响应性,响应式对象内的嵌套对象依然是代理
const proxy1=reactive({})
proxy.nested = raw
console.log('proxy1嵌套对象nested与raw是否相等:',proxy.nested===raw)
</script>

<style scoped>
</style>
相关推荐
Predestination王瀞潞13 分钟前
WEB前端技术基础(第四章:JavaScript-网页动态交互语言)
前端·javascript·交互
静西子2 小时前
Vue3路由
前端·javascript·vue.js
J总裁的小芒果2 小时前
vue3 全局定义动态样式
前端·javascript·vue.js
whalekv2 小时前
10月25日
前端·javascript·vue.js
xuelong-ming2 小时前
uniapp vue3 点击跳转外部网页
vue.js·uni-app
万邦科技Lafite4 小时前
京东按图搜索京东商品(拍立淘) API (.jd.item_search_img)快速抓取数据
开发语言·前端·数据库·python·电商开放平台·京东开放平台
Never_Satisfied6 小时前
在JavaScript / Node.js / 抖音小游戏中,使用tt.request通信
开发语言·javascript·node.js
一只小透明啊啊啊啊7 小时前
Java Web 开发的核心组件:Servlet, JSP,Filter,Listener
java·前端·servlet
你的人类朋友7 小时前
设计模式有哪几类?
前端·后端·设计模式
Yeats_Liao7 小时前
Go Web 编程快速入门 10 - 数据库集成与ORM:连接池、查询优化与事务管理
前端·数据库·后端·golang