1 // 触发更新视图
2 function updateView() {
3 console.log('视图更新')
4 }
5
6 // 重新定义数组原型
7 const oldArrayProperty = Array.prototype
8 // 创建新对象,原型指向 oldArrayProperty ,再扩展新的方法不会影响原型
9 const arrProto = Object.create(oldArrayProperty);
10 ['push', 'pop', 'shift', 'unshift', 'splice'].forEach(methodName => {
11 arrProto[methodName] = function () {
12 updateView() // 触发视图更新
13 oldArrayProperty[methodName].call(this, ...arguments)
14 // Array.prototype.push.call(this, ...arguments)
15 }
16 })
17
18 // 重新定义属性,监听起来
19 function defineReactive(target, key, value) {
20 // 深度监听
21 observer(value)
22
23 // 核心 API
24 Object.defineProperty(target, key, {
25 get() {
26 return value
27 },
28 set(newValue) {
29 if (newValue !== value) {
30 // 深度监听
31 observer(newValue)
32
33 // 设置新值
34 // 注意,value 一直在闭包中,此处设置完之后,再 get 时也是会获取最新的值
35 value = newValue
36
37 // 触发更新视图
38 updateView()
39 }
40 }
41 })
42 }
43
44 // 监听对象属性
45 function observer(target) {
46 if (typeof target !== 'object' || target === null) {
47 // 不是对象或数组
48 return target
49 }
50
51 // 污染全局的 Array 原型
52 // Array.prototype.push = function () {
53 // updateView()
54 // ...
55 // }
56
57 if (Array.isArray(target)) {
58 target.__proto__ = arrProto
59 }
60
61 // 重新定义各个属性(for in 也可以遍历数组)
62 for (let key in target) {
63 defineReactive(target, key, target[key])
64 }
65 }
66
67 // 准备数据
68 const data = {
69 name: 'zhangsan',
70 age: 20,
71 info: {
72 address: '北京' // 需要深度监听
73 },
74 nums: [10, 20, 30]
75 }
76
77 // 监听数据
78 observer(data)
79
80 // 测试
81 // data.name = 'lisi'
82 // data.age = 21
83 // // console.log('age', data.age)
84 // data.x = '100' // 新增属性,监听不到 —— 所以有 Vue.set
85 // delete data.name // 删除属性,监听不到 —— 所有已 Vue.delete
86 // data.info.address = '上海' // 深度监听
87 data.nums.push(4) // 监听数组

vue监听数组变化的更多相关文章

  1. AngularJS监听数组变化

    我们在使用angualr的监听时候,业务的需要我们会去监听一个数组的某一个值得变化,再写逻辑代码.然而我们在使用$scope.$watch("",function(){ })时候会 ...

  2. vue监听数组中某个属性,计算其他属性问题

    今天在项目开发中遇到一个根据数组中某个属性变化同时更新另一个属性变化的问题,刚开始代码如下 this.weekList1=r.data.roomProducts; this.weekList1.map ...

  3. vue 监听路由变化

    方法一:通过 watch // 监听,当路由发生变化的时候执行 watch:{ $route(to,from){ console.log(to.path); } }, 或 // 监听,当路由发生变化的 ...

  4. javascript监听数组变化

    , ]; ); , ]; ); , ]; ); ]; , ]; ); ); ); break; } if (inserted) { ob.observeArray(inserted); } // 通知 ...

  5. 用VUE监听数组和对象的变化

    看一下演示代码,先是增加数组和对象. <template> <div> <p>这是我定义的数组</p> <div>{{this.arr}}& ...

  6. vue监听路由变化

    使用 watch,观察路由,一旦发生变化便重新获取数据 watch: { // 如果路由有变化,会再次执行该方法 '$route': 'fetchData' }

  7. React和Vue中,是如何监听变量变化的

    React 中事件监听 本地调试React代码的方法 先将React代码下载到本地,进入项目文件夹后yarn build 利用create-react-app创建一个自己的项目 把react源码和自己 ...

  8. 关于 vue 不能 watch 数组变化 和 对象变化的解决方案

    原文地址:关于 vue 不能 watch 数组变化 和 对象变化的解决方案 vue 监听数组和对象的变化 vue 监听数组 vue 实际上可以监听数组变化,比如: data () { return { ...

  9. vue如何监听数组的变化

    export function def (obj: Object, key: string, val: any, enumerable?: boolean) { Object.defineProper ...

  10. vue.js之过滤器,自定义指令,自定义键盘信息以及监听数据变化

    一.监听数据变化 1.监听数据变化有两种,深度和浅度,形式如下: vm.$watch(name,fnCb); //浅度 vm.$watch(name,fnCb,{deep:true}); //深度监视 ...

随机推荐

  1. vertx的学习总结7之用kotlin 与vertx搞一个简单的http

    这里我就简单的聊几句,如何用vertx web来搞一个web项目的 1.首先先引入几个依赖,这里我就用maven了,这个是kotlin+vertx web <?xml version=" ...

  2. BigQuant*中金财富“启明星”创新量化交易大赛开启,月月都拿奖

    来量化比赛,赢万元大奖!! 比赛时间 2022年8月1日-2023年3月31日 比赛地址 启明星创新量化交易大赛 比赛简介 BigQuant与中金财富联合举办的创新量化交易大塞正式启动了! 本次大赛旨 ...

  3. 华企盾DSC忘记了数据库解锁密码

    解决方法:登录数据库控制台,找到DSE所使用数据库默认名字"DSEDB",打开表"FileEncryptKey_TABLE",如下图所示: ​ 第一行,自动生成 ...

  4. 当一名阿里P9是什么样的体验?

    今天斗胆来跟大家分享一下作为一位阿里的P9是什么样的体验? 首先还是简单给大家介绍一下阿里的p9是属于一个什么样的层级?阿里p9中文名称叫做资深技术专家,一般大概带的团队有从几十人到一两百号人不等,具 ...

  5. NC65二开经验总结

    公式相关 1.显示公式没执行 列表界面显示,卡片界面不显示: Handler的onBoCard执行: getBillCardPanel().execHeadLoadFormulas(); Contro ...

  6. 【并发编程特性】并发编程特性之五种特性的探讨-volatileandsynchronized

    title: [并发编程特性]并发编程特性之五种特性的探讨 date: 2021-11-18 10:16:05.492 updated: 2021-12-26 17:43:10.414 url: ht ...

  7. 隐匿自己的c2服务器(一)

    隐匿自己的c2服务器(一) 目录 隐匿自己的c2服务器(一) 服务器设置 安装java环境 启动设置 开启禁ping 微信机器人推送上线信息 ️‍端口特征修改 证书特征修改 流量特征修改 利用cdn加 ...

  8. 常见的Java中SQL注解的用法

    @Select:用于查询操作,标注在方法上,指定相应的SQL查询语句. @Select("SELECT * FROM table_name WHERE condition") Li ...

  9. maven系列:多环境配置与应用

    目录 一.多环境配置步骤 定义多环境 使用多环境(构建过程) 二.跳过测试(了解) 应用场景 跳过测试命令 2.3 细粒度控制跳过测试 多环境配置有什么好处? maven提供配置多种环境的设定,帮助开 ...

  10. 完美解决Python词云库wordcloud不显示中文问题

    你的Python词云库wordcloud显示的都是方框吗?别担心,我有一个妙招让你的中文词云变得美观又清晰! 背景: wordcloud是一个基于python的词云生成库,它可以让你用简单的代码创建出 ...