• Vue3中readonly 和 shallowReadonly和toRaw


    1.readonly 深度只读

    被readonly包裹的数据只能够读取。
    是一个深度只读,不能够修改。
    我们看一下面的代码。
    我们想修改值,但是修改后视图无响应。
    并且控制台警告目标为只读
    readonly深度只读的应用场景:
    比如我们登录后用户信息不会发生改变了。
    
    <template>
     <div>
        <div>
           <div>{{viewSate}}</div>
           <button @click="func1">按钮</button>
        </div>
     </div>
    </template>
    <script>
    import {  reactive,readonly} from 'vue'
    export default {
      name: 'App',
      setup(){
          let state=reactive({
              name:"张三",
              age:20,
              sex:"男"
          })
          // viewSate这个数据只能够读取
          // 是一个深度只读,不能够修改
          let viewSate=readonly(state)
          function func1(){
            viewSate.name="李四"
          }
          return {viewSate,func1}
      },
    }
    </script>
    

    02.gif

    01.png

    2. shallowReadonly 浅只读

    shallowReadonly中放了一个对象,
    对象中直接属性是不可以修改的;
    
    如果对象下的属性下还有对象,
    那么这个对象下的属性就可以修改的.
    
    <template>
     <div>
        <div>
           <div>{{viewSate}}</div>
           <button @click="func1">按钮</button>
        </div>
     </div>
    </template>
    <script>
    import {  reactive,shallowReadonly} from 'vue'
    export default {
      name: 'App',
      setup(){
          let state=reactive({
              name:"张三",
              age:20,
              info:{
                h:1.90,
                w:'64kg'
              }
          })
          // shallowReadonly 浅只读
          // shallowReadonly中放了一个对象,对象中的直接属性是不可以修改的;
          // 如果对象下的属性下还有对象。那么这个对象下的属性就可以修改的
          let viewSate=shallowReadonly(state)
          function func1(){
            // 修改失败
            // viewSate.name="李四"
    
            // 修改成功
            viewSate.info.w="128斤"
          }
          return {viewSate,func1}
      },
    }
    </script>
    
    

    03.gif

    3 toRaw将代理对象变成普通对象

    toRaw将代理对象变成普通对象。
    这个时候我们的数据已经不再是响应式的数据了。
    所以修改普通对象的时候,
    虽然数据发生变化了,
    但是视图将不会更新。
    
    <template>
     <div>
        <div>
           <div>{{state}}</div>
           <button @click="func1">按钮</button>
        </div>
     </div>
    </template>
    <script>
    import {  reactive,toRaw} from 'vue'
    export default {
      name: 'App',
      setup(){
          let state=reactive({
              name:"张三",
              age:20,
          })
          // toRaw将代理对象变成普通对象
          let viewSate=toRaw(state)
          function func1(){
            viewSate.age=40;
            console.log(state);// Proxy {name: "张三", age: 40}
            console.log(viewSate);//{name: "张三", age: 40}
          }
          return {state,func1}
      },
    }
    </script>
    

    04.gif

    作者:明月人倚楼
    出处:https://www.cnblogs.com/IwishIcould/

    想问问题,打赏了卑微的博主,求求你备注一下的扣扣或者微信;这样我好联系你;(っ•̀ω•́)っ✎⁾⁾!

    如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,或者关注博主,在此感谢!

    万水千山总是情,打赏5毛买辣条行不行,所以如果你心情还比较高兴,也是可以扫码打赏博主(っ•̀ω•́)っ✎⁾⁾!

    想问问题,打赏了卑微的博主,求求你备注一下的扣扣或者微信;这样我好联系你;(っ•̀ω•́)っ✎⁾⁾!

    支付宝
    微信
    本文版权归作者所有,欢迎转载,未经作者同意须保留此段声明,在文章页面明显位置给出原文连接
    如果文中有什么错误,欢迎指出。以免更多的人被误导。
  • 相关阅读:
    转:ASP.NET中的SESSION实现与操作方法
    SQLHelper
    【Shell】使用Shell脚本发布项目
    【JFinal】关于Model的继承
    【Chrome】离线版下载
    【IDEA 2016.3.4】License Server
    【Windows】修改C盘下用户名
    【MySql】查询数据库中所有表及列的信息
    maven 聚合工程 用spring boot 搭建 spring cloud 微服务 模块式开发项目
    rabbitMQ
  • 原文地址:https://www.cnblogs.com/IwishIcould/p/15034308.html
Copyright © 2020-2023  润新知