VUE3-ref 响应式

本文介绍了Vue3中ref语法用于创建响应式引用的对象,RefImpl的value属性利用Object.defineProperty实现响应式,当读取或修改属性时触发get和set方法。文中通过示例代码展示了如何在模板和脚本中使用ref来改变和展示数据,并提及了与vue3和Object.defineProperty相关的内容。

VUE3-ref 响应式

重点

  • ref对’张三’这个数据进行了包裹,引用对象RefImpl
  • RefImpl对象中有value属性,这个value属性是具有响应式的,并且这个value的底层使用了object.defineProperty完成了响应式
  • RefImpl对象的value属性,有对应的set和get
  • 当读取RefImpl属性时:get执行
  • 当修改RefImpl属性时:set执行

img

img

代码

<template>
  <h2>姓名:{{name}}</h2>
  <h2>年龄:{{age}}</h2>
  <button @click="editUserInfo">改变用户信息</button>
</template>
# VUE3-ref 响应式

## 重点

* ref对'张三'这个数据进行了包裹,引用对象RefImpl
* RefImpl对象中有value属性,这个value属性是具有响应式的,并且这个value的底层使用了object.defineProperty完成了响应式
* RefImpl对象的value属性,有对应的set和get
* 当读取RefImpl属性时:get执行
* 当修改RefImpl属性时:set执行

![img](https://i-blog.csdnimg.cn/blog_migrate/042c2614d31f9d50e1ec7e1f1c532114.jpeg)

![img](https://gitee.com/zhang_luwei/image-resources/raw/master/image/1689149649171.jpg)

## 代码

```html
<template>
  <h2>姓名:{{name}}</h2>
  <h2>年龄:{{age}}</h2>
  <button @click="editUserInfo">改变用户信息</button>
</template>

<script>
  import {
    ref
  } from 'vue'
  export default {
    setup() {
      // data
      // ref对'张三'这个数据进行了包裹,引用对象RefImpl
      // RefImpl对象中有value属性,这个value属性是具有响应式的,并且这个value的底层使用了object.defineProperty完成了响应式
      // RefImpl对象的value属性,有对应的set和get
      // 当读取RefImpl属性时:get执行
      // 当修改RefImpl属性时:set执行
      const name = ref('张三')
      const age = ref(20)
      console.log(age);

      function editUserInfo() {
        name.value = '李四'
        age.value = 18
      }
      return {
        name,
        age,
        editUserInfo
      }
    }
  }
</script>

文章涉及内容:
vue3、Object.defineProperty


###  文章涉及内容:
vue3、Object.defineProperty
Vue 3 中,`ref` 是一种用于创建响应式数据的方式,尤其适用于基本类型数据,也可以用于对象类型。当希望取消 `ref` 的响应式连接时,需要理解 Vue 3响应式系统如何管理这些引用。 ### 如何取消 ref响应式绑定 Vue 3响应式系统基于 `Proxy` 和 `Reflect` 实现,而 `ref` 本质上是一个带有 `.value` 属性的对象,该属性指向响应式数据。取消 `ref` 的响应式绑定意味着要将其从响应式上下文中移除,使其不再触发视图更新。 一种常见方式是将 `ref` 的值赋给一个普通变量,从而断开响应式上下文的连接。例如: ```javascript import { ref } from &#39;vue&#39;; const reactiveRef = ref(10); let normalValue = reactiveRef.value; // 取消响应式连接 reactiveRef.value = 20; // 视图会更新 normalValue = 30; // 不会影响响应式系统 ``` 此外,如果希望保留数据但不再监听其变化,可以将 `ref` 设置为 `null` 或 `undefined`,从而清除其引用: ```javascript const reactiveRef = ref(10); reactiveRef.value = null; // 清除引用,不再响应 ``` 需要注意的是,对于对象类型的 `ref`,即使将其赋值给其他变量,由于对象的引用机制,原始 `ref` 仍然可能保持响应性。因此,如果希望完全取消对象类型 `ref` 的响应式行为,应创建一个深拷贝而不是直接赋值: ```javascript const reactiveRef = ref({ count: 10 }); const copy = JSON.parse(JSON.stringify(reactiveRef.value)); // 深拷贝,取消响应式连接 ``` 这种方式适用于需要保留数据但不再希望其影响响应式系统的情况。 ### 注意事项 - 使用 `.value` 获取 `ref` 的值时,若该值为对象,则修改其属性仍会影响原始响应式数据,除非进行深拷贝 [^1]。 - 若 `ref` 被用作响应式对象的属性Vue 会自动解包 `.value`,因此在取消响应式连接时也需手动处理这种情况 [^2]。 - 在组合式 API 中,使用 `watchEffect` 或 `watch` 监听 `ref` 时,若希望停止监听,应调用返回的 `stop` 函数,而非直接操作 `ref` 值 。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值