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

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

<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()使对象本身具有响应性

<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. Vue refreactive 响应引用

    2024-02-23 10:04:03       10 阅读
  2. Vue3中的refreactive:构建响应数据的双刃剑

    2024-02-23 10:04:03       12 阅读
  3. Vue3:refreactive实现响应数据

    2024-02-23 10:04:03       24 阅读
  4. Vue3响应基础——ref()和reactive()

    2024-02-23 10:04:03       9 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-23 10:04:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-23 10:04:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-23 10:04:03       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-23 10:04:03       20 阅读

热门阅读

  1. 设计模式-原型模式

    2024-02-23 10:04:03       25 阅读
  2. FFmpeg部分数据结构简介

    2024-02-23 10:04:03       28 阅读
  3. Spring、SpringBoot、SpringCloud三者的区别

    2024-02-23 10:04:03       28 阅读
  4. 技术心得--如何成为优秀的架构师

    2024-02-23 10:04:03       33 阅读
  5. Flutter学习5 - Dart 方法类型

    2024-02-23 10:04:03       28 阅读
  6. 滴滴二面:kafka的零拷贝原理?

    2024-02-23 10:04:03       23 阅读
  7. 进程间传递 SQL 文的方法

    2024-02-23 10:04:03       32 阅读