vue3中的reactive、readonly和shallowReactive使用详解

 更新时间:2024年04月29日 10:08:21   作者:猛扇赵四那半好嘴  
在 Vue3 中,可以使用 shallowReactive 函数创建一个浅层响应式对象,它接收一个普通对象作为参数,返回一个浅层响应式代理对象,本文给大家介绍vue3中的reactive、readonly和shallowReactive使用,感兴趣的朋友跟随小编一起看看吧

1. reactive 与 readonly 使用

readonly:拷贝一份 proxy 对象将其设置为只读。

使用 readonly 时, 变量里的属性不可改变。

需要注意的是:

当原本数据改变时,使用了 readonly 函数的值也会发生改变。

<template>
  <div>
    <form>
      <input v-model="obj.name" type="text" />
      <br />
      <input v-model="obj.age" type="text" />
      <br />
      <button @click.prevent="submit">提交</button>
    </form>
  </div>
</template>
<script setup lang="ts">
import { ref, reactive, readonly, shallowReactive } from 'vue'
const obj = reactive({
  name: '张三',
  age: 23
})
const copy = readonly(obj)
const submit = () => {
  obj.age++
  console.log(copy)
}
</script>

在这个例子中,修改响应式对象中的 age 属性, readonly 中的 age 属性也会随之更改。

2. shallowReactive

  • 创建浅层响应式对象
  • 修改内部属性时,只改变值不更新视图

在 Vue3 中,可以使用 shallowReactive 函数创建一个浅层响应式对象。它接收一个普通对象作为参数,返回一个浅层响应式代理对象。这个代理对象只能处理对象的一级属性,不能处理嵌套在对象中的属性的响应式更新。当我们读取代理对象的属性时,会触发依赖收集;当我们修改代理对象的属性时,会触发相应的依赖更新。在调用 shallowReactive 函数时, Vue3 会使用 Proxy 对象对传入的对象进行代理,从而实现浅层响应式特性。

<template>
  <div>{{ state }}</div>
  <br />
  <button @click="change1">test1</button>
  <br />
  <button @click="change2">test2</button>
</template>
<script setup lang="ts">
import { ref, reactive, readonly, shallowReactive } from 'vue'
const state = shallowReactive({
  a: 1,
  first: {
    b: 2,
    second: {
      c: 3
    }
  }
})
const change1 = () => {
  state.a = 7
}
const change2 = () => {
  state.first.b = 8
  state.first.second.c = 9
  console.log(state)
}
</script>

点击 test1 后: state.a 的值变为 7 

点击 test2 后:视图没有发生改变,控制台如下

到此这篇关于vue3中的reactive、readonly和shallowReactive的文章就介绍到这了,更多相关vue3 reactive、readonly和shallowReactive内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解决Vue.js父组件$on无法监听子组件$emit触发事件的问题

    解决Vue.js父组件$on无法监听子组件$emit触发事件的问题

    今天小编就为大家分享一篇解决Vue.js父组件$on无法监听子组件$emit触发事件的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09
  • vue自定义上传头像组件功能

    vue自定义上传头像组件功能

    这篇文章主要介绍了vue自定义上传头像组件功能,介绍了与一般上传组件的区别,通过实例代码介绍了上传图片组件的方法,需要的朋友可以参考下
    2024-01-01
  • vue element和nuxt的使用技巧分享

    vue element和nuxt的使用技巧分享

    这篇文章主要介绍了vue element和nuxt的使用技巧分享,帮助大家更好的理解和使用vue框架,感兴趣的朋友可以了解下
    2021-01-01
  • vue踩坑之backgroundImage路径问题及解决

    vue踩坑之backgroundImage路径问题及解决

    这篇文章主要介绍了vue踩坑之backgroundImage路径问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • Vue基础popover弹出框编写及bug问题分析

    Vue基础popover弹出框编写及bug问题分析

    这篇文章主要为大家介绍了Vue基础popover弹出框编写及bug问题分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • 解决vue+router路由跳转不起作用的一项原因

    解决vue+router路由跳转不起作用的一项原因

    这篇文章主要介绍了解决vue+router路由跳转不起作用的一项原因,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • Vue中直接操作数组索引不奏效的问题解读

    Vue中直接操作数组索引不奏效的问题解读

    这篇文章主要介绍了Vue中直接操作数组索引不奏效的问题解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • Vue2中使用Monaco Editor的教程详解

    Vue2中使用Monaco Editor的教程详解

    Monaco-editor,一个vs code 编辑器,这篇文章主要为大家详细介绍了如何在Vue2中使用Monaco Editor,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-01-01
  • Vue.js结合bootstrap实现分页控件

    Vue.js结合bootstrap实现分页控件

    这篇文章主要为大家详细介绍了Vue.js 合bootstrap实现分页控件的相关资料,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • vite2打包的时候vendor-xxx.js文件过大的解决方法

    vite2打包的时候vendor-xxx.js文件过大的解决方法

    vite2是一个非常好用的工具,只是随着代码的增多,打包的时候 vendor-xxxxxx.js 文件也越来越大,本文主要介绍了vite2打包的时候vendor-xxx.js文件过大的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03

最新评论