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. C++ Qt开发:使用关联容器类

    当我们谈论编程中的数据结构时,顺序容器是不可忽视的一个重要概念.顺序容器是一种能够按照元素添加的顺序来存储和检索数据的数据结构.它们提供了简单而直观的方式来组织和管理数据,为程序员提供了灵活性和性能的 ...

  2. Java并发(二十)----synchronized原理进阶

    1.小故事 故事角色 老王 - JVM 小南 - 线程 小女 - 线程 房间 - 对象 房间门上 - 防盗锁 - Monitor-重量级锁 房间门上 - 小南书包 - 轻量级锁 房间门上 - 刻上小南 ...

  3. Asp.net core Webapi 如何执行定时任务?

    前言 在计算机系统中,定时执行一些后台任务是很常见的场景,比如定时发送邮件.备份数据等等. 那么,.NET 技术如何通过编程灵活地实现项目里复杂的自定义任务呢? 如果是 Windows 生态,通常来说 ...

  4. 【Python】【OpenCV】【NumPy】图像数据的访问

    接上一随笔,这次学习针对图像数据的访问(Numpy.array) 在OpenCV中,使用 imread() 方法可以访问图像,其返回值是一个数组,而根据传入的不同图像,将会返回不同维度的数组. 针对返 ...

  5. Ubuntu 20.04 安装Odoo17

    1.升级系统 sudo apt-get update 2.更新系统 sudo apt-get upgrade 3.查看系统Python3版本 python3 -V 4.更新Python3.8到3.10 ...

  6. postman——预处理和断言

    一.预处理 Pre-request Scrip 1.Pre-request Script是集合中请求发送之前需要执行的代码片段 2.请求参数中包含一个随机数或者请求header中包括一个时间戳,或者你 ...

  7. 【笔记】负载均衡Robbin之不同服务使用不同的策略

    裂开裂开,搞这么久忘记导入依赖 妈卖批 又不报错 还能让我玩 我以为全部导入了. 话不多说,开始演示. 介绍 给不同的服务 配置 不同的 负载均衡策略 这里使用 用户模块 进行访问其它两个模块的con ...

  8. Ubuntu 20.04 设置时区、配置NTP同步 timesyncd 代替 ntpd

    本文的服务器环境为 Ubuntu 20.04 系统,一个拥有 sudo 权限的非 root用户,并开启了防火墙. 基本时间命令 要在 Ubuntu 20.04 系统上查看服务器时间,可以使用 date ...

  9. 斯坦福 UE4 C++ ActionRoguelike游戏实例教程 13.使用GameplayTag实现使用钥匙卡打开箱子

    斯坦福课程 UE4 C++ ActionRoguelike游戏实例教程 0.绪论 概述 本篇文章将会展示Gameplay另一个用法,也就是我们最常见的使用特定道具交互特定的机关.例如本文要实现的,获得 ...

  10. 在线编辑Word——插入内容控件

    内容控件是可添加和自定义的以在模板.窗体和文档中使用的单个控件.Word中支持添加多种类型的控件用于不同文档的设计需求.本文,将通过在线编辑的方式展示如何在Word中插入内容控件,这里使用的在线编辑器 ...