首页 > 其他分享 >Vue 检测数据

Vue 检测数据

时间:2022-08-15 15:56:37浏览次数:45  
标签:set 检测 vm data Vue 数组 数据 属性

主要逻辑类似:

<script>
    let data = {
        name: 'name',
        address: 'address',
    };

    // 创建了一个监视对象,监视data属性的变化
    const obs = new Observer(data);

    let vm = {};
    vm._data = data = obs;

    function Observer(obj) {
        // 汇总对象所有的属性形成一个数组
        const keys = Object.keys(data);
        // 遍历
        keys.forEach((k) => {
            Object.defineProperty(this, k, {
                get(){
                    return obj[k];
                },
                set(val) {
                    obj[k] = val;
                    console.log(`数据${k}被修改,接下来解析模板,生成虚拟DOM,执行diff算法。。。`);
                },
            })
        })
    }
</script>

但是vue实现的更加强大复杂

  1. 通过数据代理实现 vm.name='xxx' 而不必 vm._data.name='xxx'
  2. 通过递归使得对于对象的属性也有 get set 方法

Vue.set()

代码运行时试图向对象中添加属性,vm._data.student.age=18添加的数据没有 get set 函数。

运行时添加对象属性应当使用 Vue.set(target, key, val)  例如 Vue.set(vm._data.persons, 'num',  3)简化方式 vm.$set(vm.persons, 'num', 3)

但是这个函数只能为 data 中的对象实例添加属性,不能为 vm._data 添加属性,即不能新增变量。

 

Vue 检测数据的数组处理

js中修改数组成员的函数:

  1. push
  2. pop
  3. shift
  4. unshift
  5. splice
  6. sort
  7. reverse

通过以上7个函数操作数组就有响应式结果。在vue中数组的 prototype 上有一个push等方法,它调用了原生Array的方法并进行了一些其他操作。这称为包装。

 


总结

  1. vue 会监测data中所有层次的数据
  2. 如何监测数据?
    1. 通过setter 实现监视,且要在 new Vue 时传入要监测的数据
    2. 对象中后追加属性,Vue默认不做响应式处理
    3. 如需添加属性做响应式,使用以下 API
      Vue.set(target, propertyName/index, value)
      vm.$set(target, propertyName/index, value)
  3. 如何监测数组中数据
    1. 通过包裹数组更新元素的方法实现,本质就是做两件事
    2. 调用原生对应的方法对数组更新
    3. 重新解析模板,进而更新页面
  4. 在Vue修改数组中某个元素一定要使用以下方法
    1. 7个修改数组的api方法
    2. Vue.set() 或 vm.$set()

不能给 vm 或 vm 的根数据对象添加属性

标签:set,检测,vm,data,Vue,数组,数据,属性
From: https://www.cnblogs.com/zhh567/p/16588534.html

相关文章

  • U盘、FTP等传统数据摆渡方式的7大弊端 你入坑了吗?
    随着网络技术的高速发展,网络安全保障机制也受到了巨大的挑战。为了有效地保护内部的核心数据资产,比较普遍的防护手段会采用内外网隔离的策略。隔离之后,很多企业一开始都会......
  • 数据模型的建模方法
    数据模型的建模方法什么是数据模型对现实世界业务对象及关系的抽象为什么需要数据模型数据模型不是必需的,建模的目的是为了改进业务流程、消灭信息孤岛和数据差异及......
  • 取两个List<Object>的差集数据和交集数据 java
    List<ProjectSimpleInfoVO>projectSimpleInfoVOList=newArrayList<>();ProjectSimpleInfoVOprojectSimpleInfoVO=newProjectSimpleInfoVO();pr......
  • 2022-08-15 第六组 Myy 学习笔记_Mysql数据库
    Mysql数据库数据库数据库【按照数据结构来组织、存储和管理数据的仓库】,是一个长期存储载计算机内的、有组织的、可共享的、统一管理的大量数据的集合。数据对于公......
  • 加载远程vue文件 vue3-sfc-loader
    需求项目在写一些需求的时候,现场可能会有些变动,但是不想从新打包,这种情况可以考虑单独不打包的vue文件注意vue2import{loadModule}from'vue3-sfc-loader/dist/vue2......
  • Ubuntu 18.04离线安装数据库
    Ubuntu离线安装MySQL8.0.26数据库 Ubuntu18.04离线安装Mysql8.0.26Ubuntu18.04离线安装Mysql8.0.26一、准备mysql下载mysql官网-->download-->社区版,选择对应操......
  • VUE+Django前后端分离-第二部分
    四、前端layout及页面跳转1、在src/components目录下创建HeaderAsideMainHeader.vue:<template><header><div><h1style="margin-to......
  • 数据库注入提权总结(四)
    OracleOracle权限分类权限是用户对一项功能的执行权力。在Oracle中,根据系统的管理方式不同,将Oracle权限分为系统权限与实体权限两类。系统权限是指是否被授权用户可以......
  • QGIS上传图层到PostgreSQL数据库
    1.打开QGIS,加载需要上传的图层数据2.右击PostGIS新建连接3.数据连接信息首次连接还需要输入数据库账号密码4.上传图层这个非常简单,只需要把图层拖拽过去,等待一会,即......
  • Geoserver+Postgres+Postgis发布数据库中的图层
    Geoserver借助Postgis插件发布Postgres中的空间数据库和Geoserver直接发布本地图层的区别Geoserver直接发布本地图层如果需要修改图层属性字段的话需要打开Arcmap或者Qgis......