首页 > 其他分享 >Vue3中shallowReactive 与 shallowRef 的用法

Vue3中shallowReactive 与 shallowRef 的用法

时间:2023-10-07 14:55:26浏览次数:29  
标签:... 对象 shallowReactive 响应 Vue3 shallowRef sum

转自:https://blog.csdn.net/qq_54527592/article/details/119840044

 

 

shallowReactive 与 shallowRef

    shallowReactive:只处理对象最外层属性的响应式(浅响应式)。

    shallowRef:只处理基本数据类型的响应式, 不进行对象的响应式处理。

    什么时候使用?

        如果有一个对象数据,结构比较深, 但变化时只是外层属性变化 ===> shallowReactive。

        如果有一个对象数据,后续功能不会修改该对象中的属性,而是生新的对象来替换 ===> shallowRef。

代码演示

        shallowReactive

        我们在组件中使用shallowReactive方法定义了一个对象 我们返回对象将对象的属性在模板中使用

    <template>
      <div>
        <h1>姓名:{{name}}</h1>
        <h2>年龄:{{age}}</h2>
        <h3>喜欢的水果:{{likeFood.fruits.apple}}</h3>
        <button @click="name += '~'">修改姓名</button>
        <button @click="age++">修改年龄</button>
        <button @click="likeFood.fruits.apple += '!'">修改水果</button>
      </div>
    </template>
     
    <script>
    import {reactive, toRefs, shallowReactive} from 'vue'
    export default {
      name: "App",
      setup() {
        // 定义了一段数据
        let person = shallowReactive({    // 只将第一层数据做了响应式处理
          name: '张三',
          age: 18,
          likeFood: {
            fruits:{
              apple: '苹果'               // 深层次的数据将会是一个普通的对象
            }
          }
        })
        // 将数据返回出去
        return {
          ...toRefs(person)
        }
      }
    };
    </script>

        我们修改数据只有定义在对象第一层的属性 才是响应式的 深层次的数据将不在具有响应式的功能 因为深层次的数据将不在是一个响应式对象 而是一给普通对象

 数据变了 但是vue监测不到 无法触发页面的更新

shallowRef

        我们调用了shallowRef方法传递了基本数据类型 我们可以看到 当前属性是有响应式的

    ...
    <div>
        <h1>姓名:{{ sum}}</h1>
        <button @click="sum++">点击+</button>
    </div>
    ...
      setup() {
        // 定义了一段数据
        let sum = shallowRef(0);
        // 将数据返回出去
        return {
          sum,
        };
      },
    ...

        但我们点击修改数据 在页面中 可以看到是有响应式功能的

 

        但是我们现在传递一个对象进去 我们可以看到 传递的对象将变成一个普通对象 不在具有响应式功能了

    ...
      <div>
        <h1>姓名:{{ sum.n}}</h1>
        <button @click="sum.n++">点击+</button>
      </div>
    ...
    setup() {
        // 定义了一段数据
        let sum = shallowRef({      // sum将不在是一个响应式对象
          n: 0
        });
        // 将数据返回出去
        return {
          sum,
        };
      },
    ...

在页面中我们可以看到 修改数据后将不在触发页面的更新 因为vue监测不到了

 
————————————————
版权声明:本文为CSDN博主「李公子丶」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_54527592/article/details/119840044

标签:...,对象,shallowReactive,响应,Vue3,shallowRef,sum
From: https://www.cnblogs.com/changbaishan/p/17746298.html

相关文章

  • Vue3
    vue3.3.4+vite4.4.91.组件安装1.1ElementPlusnpminstallelement-plus--savemain.jsimportElementPlusfrom'element-plus'import'element-plus/dist/index.css'constapp=createApp(App);app.use(ElementPlus).mount('#app'......
  • Vue3 Div 与 v-for 的配合应用,超出自动带滚动条
    效果图 代码<li><ahref="javascript:;"class="IndReaflexCHuans"><i></i><p>当前会议[0]</p></a><divstyle="height:80%;overflow:auto;"><divv-for="......
  • vue3最基础入门,vue3 + element plus实战pc端后台管理,从零到一设计pc端项目
    教程地址 https://www.bilibili.com/video/BV1C3411s7bV 稳定、快速、免费的前端开源项目CDN加速服务,共收录了4387个前端开源项目https://www.bootcdn.cn/all/ Normalize.css使浏览器呈现所有HTML元素更加一致,并且符合现代web标准。Normalize.css只作用于需要......
  • vue3 使用 i18n
    安装官网:https://vue-i18n.intlify.dev/api/general.htmlpnpmaddvue-i18n@9使用//@/locale/index.tsimportappConfigfrom"@/configure/app.config.ts";import{nextTick}from'vue'importtype{Ref}from'vue'import{createI18n}......
  • 在 WebStorm 里调试 vue3 项目
    官方说明:https://blog.jetbrains.com/webstorm/2018/01/working-with-vue-js-in-webstorm/#:~:text=Wecandebugourapplication,andstartthedebugsession.打开WebStorm编辑器右上角的Configuration的Edit,在URL填入项目的地址并选择想要使用的Brower,点击调试之......
  • vue3 使用 pinia
    安装pinia官网:https://pinia.vuejs.org/pnpmaddpinia使用新建pinia实例//@/store/index.tsimport{createPinia}from"pinia";importuseUserStorefrom"@/store/user.ts";exportuseUserStore;constpinia=createPinia();exportdefault......
  • vue3 使用 vue-router
    安装vue-routerpnpmivue-router使用vue-router创建自己的router//@/route/index.tsimport{createRouter,createWebHashHistory}from'vue-router'importtype{RouteRecordRaw}from"vue-router"constroutes:RouteRecordRaw[]=[{......
  • vue3+vite+ elementplus项目部署到gitee pages并发布
    1.在gitee上新建仓库命名:demo-vite-vue32.把新建的仓库克隆到本地3.在本地的master分支编写代码并上传把分支定位在master分支上通过git工具把本地完成的代码上传到gitee的demo-vite-vue3仓库中去gitpullgitadd.gitcommit-m"提交代......
  • Vue3 appear 失效 如何使用 appear
    最近在学习vue3的动画时遇到appear 无法生效的问题问题的具体表现:看以下代码,按理应该来说,如果我们设置fuct-appear-from,fuct-appea-active后在元素初始出现时应该会有一个效果html<Transitionname="fuct"appear><divclass="doc"v-if="show"></div></Trans......
  • Uniapp学习笔记(vue3)
    https://uniapp.dcloud.net.cn/使用Vue.js开发所有前端应用的框架开发者编写一套代码,可发布到iOS、Android、Web(响应式)、以及各种小程序(微信/支付宝/百度/头条/飞书/QQ/快手/钉钉/淘宝)、快应用等多个平台。周边生态丰富发送请求 methods:{ getMsg(msg){ ......