我的编程空间,编程开发者的网络收藏夹
学习永远不晚

vue中数据劫持以及操作数组的坑有哪些

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

vue中数据劫持以及操作数组的坑有哪些

这篇文章将为大家详细讲解有关vue中数据劫持以及操作数组的坑有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

TL;DR

给data添加新属性的时候vm.$set(vm.info,'newKey','newValue')
data上面属性值是数组的时候,需要用数组的方法操作数组,而不能通过index或者length属性去操作数组,因为监听不到属性操作的动作。

安装和初使用vue

vue是构建用户界面的渐进式框架。所谓的渐进式:vue + components + vue-router + vuex + vue-cli可以根据需要选择相应的功能。
来串命令mkdir vue-apply;cd vue-apply;npm init -y;npm i vue。
来一个html文件如下,浏览器瞄下~,浏览器控制台vm.msg=0再看下

 <div id="app">{{msg}}</div>
  <script class="lazy" data-src="node_modules/vue/dist/vue.js"></script>
  <script>
  let vm = new Vue({
    el:'#app',
    // template加上之后会替换掉#app这个标签
    // template:'<h2>en</h2>',
    data:{msg:'msg'}
  })
  vm.msg = 'msg'
  </script>

说说mvvm mvc

mvc其实是model view Model传统所有逻辑在controller,难以维护。用户输入 => 控制器 => 数据改变,如果数据变了需要获取dom,操作属性,再渲染到视图上。

mvvm其实是model view viewModel数据变化驱动视图。数据变了,不需要你获取dom,然后改变dom的内容。这边数据变了,vm负责监听,视图那边自动发生变化。最明显的是不需要document.querySelector之类的了。

vm的实质

上面说了vm负责让数据变了,视图能自动发生变化。这么神奇魔术背后的原理是Object.defineProperty。其实就是属性的读取和设置操作都进行了监听,当有这样的操作的时候,进行某种动作。来一个demo玩下。

// 对obj上面的属性进行读取和设置监听
let obj = {
    name:'huahua',
    age:18
  }
  function observer(obj){
    if(typeof obj === 'object'){
      for (const key in obj) {
        defineReactive(obj,key,obj[key])
      }
    }
  }
  // get的return的值才是最终你读取到的值。所以设的值是为读取准备的。
  // set传的参数是设置的值,注意这里不要有obj.name = newVal 这样又触发set监听,会死循环的。
  function defineReactive(obj,key,value){
    Object.defineProperty(obj,key,{
      get:function(){
        console.log('你在读取')
        // happy的话这边可以value++,这样你发现读取的值始终比设置的大一个,因为return就是读取到的值
        return value
      },
      set:function(newVal){
        console.log('数据更新了')
        value = newVal
      }

    })
  }
  observer(obj)
  obj.age = 2
  console.log(obj.age)

在浏览器执行的时候,控制台随手也可以obj.name="hua1"类似的操作,发现都监听到了。但是如果更深一步,obj.name={firstname:'hua',lastname:'piaoliang'};obj.name.lastname='o'就不能监听到属性修改了。因为并没有将新的赋值对象监听其属性。所以函数需要改进。

需要在defineReactive的第一行加上observer(value)。设置值的时候如果是对象的话,也需要将这个对象数据劫持。同理,set那边也需要加这行。

 function defineReactive(obj,key,value){
    // 注意这里!!!!!!!
    observer(value)
    Object.defineProperty(obj,key,{
      get:function(){
        return value
      },
      set:function(newVal){
        // 注意这里!!!!!!!
        observer(newVal)
        console.log('数据更新了')
        value = newVal
      }

    })
  }

继续,如果obj.name=[1,2,3];obj.name.push(4)发现又没有通知了,这是因为Object.defineProperty不支持监听数组变化。所以需要重写数组上面的方法。话说,最近看了个文章,理论上也可以监听数组,但是性能消耗和收益不成正比,所以,vue就没去实现了。

// 把数组上大部分方法重写了,这里不一一列举。但是如果你 [1,2].length--,这是捕捉不到的
  let arr = ['push','slice','split']
  arr.forEach(method=>{
    let oldPush = Array.property[method]
    Array.property[method] = function(value){
      console.log('数据更新')
      oldPush.call(this,value)
    }
  })

vue使用的时候注意的坑

正如上面的解释,vue2.0的底层约莫是这个逻辑,所以使用需要注意的点:

因为是一开始就数据劫持了。所以后来如果新绑定属性,是没有数据劫持的。如果需要调用 vm.$set(vm.info,'newKey','newValue'),vm是vue的实例。

当属性值是数组,数组变化的时候,跟踪不到变化。因为数组虽然是对象,但是Object.defineProperty不支持数组,所以vue改写了数组的所有方法,当调用数组方法的时候,就调动变动事件。但是不能通过属性或者索引控制数组,比如length,index。

总结:data上,绑定所有属性避免后期加新属性。如果是数组,只能通过数组方法修改数组。如下例子,控制台vm.arr--发现视图并不会变化,vm.arr.push(4)就能变化

 <div id="app">{{msg}}{{arr}}</div>
  <script class="lazy" data-src="node_modules/vue/dist/vue.js"></script>
  <script>
  let vm = new Vue({
    el:'#app',
    // template加上之后会替换掉#app这个标签
    // template:'<h2>en</h2>',
    data:{msg:'msg',arr:[1,2,3]}
  })
  vm.msg = 'msg'
  </script>

关于“vue中数据劫持以及操作数组的坑有哪些”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

vue中数据劫持以及操作数组的坑有哪些

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MySQL数据库中库的操作及数据类型有哪些

这篇文章主要介绍了MySQL数据库中库的操作及数据类型有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1. 数据库的操作注意:SQL 语句不区分大小写,以下将以小写的语句
2023-06-21

在php中数组指针的操作函数有哪些

这篇文章主要介绍“在php中数组指针的操作函数有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“在php中数组指针的操作函数有哪些”文章能帮助大家解决问题。有8种数组指针操作函数:1、curren
2023-06-30

VBScript 中的字节数据操作函数有哪些

这篇文章主要讲解了“VBScript 中的字节数据操作函数有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“VBScript 中的字节数据操作函数有哪些”吧!Asc 和 AscB、AscW
2023-06-09

MySQL数据库中数据表的基本操作有哪些

这篇文章主要讲解了“MySQL数据库中数据表的基本操作有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL数据库中数据表的基本操作有哪些”吧!前言:库名、表名、列名等等不能和关键字
2023-06-21

Redis支持的数据结构对应的操作命令有哪些

Redis支持的数据结构及对应的操作命令如下:字符串(String):SET key value:设置指定键的值GET key:获取指定键的值APPEND key value:追加值到指定键的值INCR key:将指定键的值增加1D
Redis支持的数据结构对应的操作命令有哪些
2024-04-09

编程热搜

目录