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>
相关推荐
也无晴也无风雨1 小时前
深入剖析输入URL按下回车,浏览器做了什么
前端·后端·计算机网络
Martin -Tang2 小时前
Vue 3 中,ref 和 reactive的区别
前端·javascript·vue.js
FakeOccupational3 小时前
nodejs 020: React语法规则 props和state
前端·javascript·react.js
放逐者-保持本心,方可放逐3 小时前
react 组件应用
开发语言·前端·javascript·react.js·前端框架
曹天骄4 小时前
next中服务端组件共享接口数据
前端·javascript·react.js
阮少年、4 小时前
java后台生成模拟聊天截图并返回给前端
java·开发语言·前端
郝晨妤6 小时前
鸿蒙ArkTS和TS有什么区别?
前端·javascript·typescript·鸿蒙
AvatarGiser6 小时前
《ElementPlus 与 ElementUI 差异集合》Icon 图标 More 差异说明
前端·vue.js·elementui
喝旺仔la6 小时前
vue的样式知识点
前端·javascript·vue.js
别忘了微笑_cuicui6 小时前
elementUI中2个日期组件实现开始时间、结束时间(禁用日期面板、控制开始时间不能超过结束时间的时分秒)实现方案
前端·javascript·elementui