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. 使用 Kubernetes 为 CI/CD 流水线打造高效可靠的临时环境

    介绍 在不断发展的科技世界中,快速构建高质量的软件至关重要.在真实环境中测试应用程序是及早发现和修复错误的关键.但是,在真实环境中设置 CI/CD 流水线进行测试可能既棘手又昂贵. Kubernete ...

  2. ORCAD BOM制作

    1.导出BOM增加/TPCB Footpint和/tOptionnal 选项 2.器件选焊的optionnal设置/X符号, 3.导出BOM后选择/X的,删除,不出现加工的BOM中

  3. [ABC263D] Left Right Operation

    Problem Statement You are given an integer sequence of length $N$: $A=(A_1,A_2,\ldots,A_N)$. You wil ...

  4. Excel对比两张表的某一列,匹配上则进行数据copy

    VLOOKUP(参数1,参数2,参数3,参数4) 参数1: 查找值 参数2:指定查找数据源的范围 参数3:返回查找区域的第几列数据 参数4:精确查找输入参数"0"or"f ...

  5. 记录一个异常 Gradle打包项目Lombok不生效 No serializer found for class com.qbb.User and no properties discovered to create BeanSerializer......

    完整的错误: 03-Dec-2022 16:57:22.941 涓ラ噸 [http-nio-8080-exec-5] org.apache.catalina.core.StandardWrapperV ...

  6. 不用手动创建数据库,直接导入sql文件,就能生成数据库和数据表

  7. Python——第一章:注释、变量、常量

    python中的注释有2种: 1.单行注释 单行注释用# #这是一个单行注释 快捷键用Ctrl+/全选多个内容可以多行快速注释,也可以快速去掉注释符# 比如快速将全选的所有行注释掉--加# 2.多行注 ...

  8. Github 星标 8K+ 这款国人开源的 Redis 可视化管理工具,真香...

    做程序员就少不了与一些工具打交道,比如:监控工具.管理工具等,有些工具是命令行界面,有些工具是可视化界面,反正都是可以能够满足日常使用的功能需求. 对于redis管理工具来说,也有不少可能的产品,比如 ...

  9. 【开源】EDUCN网站

    EDUCN https://scrc.rth1.link/ <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN&q ...

  10. 如何保证XML正确性

    如何保证XML正确性 XML是个盒子,什么都能装,但是装进去的东西正确与否恐怕无法得知.往往我们都人工审核.双人复核保证,但是次数多了难免会出错.那么我们如何保证和避免这种问题出现呢? 那就是XSD, ...