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. 【笔记整理】request模块基本使用

    基本使用 发送get请求.获取响应各种请求.响应信息 def fun1(): url = "http://www.baidu.com" resp = requests.get(ur ...

  2. 强!推荐一款自动化神器Autolt:不再重复工作

    随着互联网不断发展,它给我们带来便利的同时,也带来了枯燥.重复.机械的重复工作.今天,我要和大家分享一款老牌实用的自动化工具:AutoIt,它能够让你告别繁琐的重复性工作,提高工作效率. 这里透露一下 ...

  3. ElasticSearch之Merge

    Elasticsearch的shard,即对应Lucene的index. Lucene的index由多个segment组成. segment是index保存数据的最小单位,不支持修改. Elastic ...

  4. 在CentOS安装BIND,把所有DNS请求日志转发到syslog服务器去

    在CentOS安装BIND,把所有DNS请求日志转发到syslog服务器去 在vim /etc/named.conf里配置的内容 logging { channel default_debug { f ...

  5. DVWA File Upload(文件上传)全等级

    File Upload(文件上传) 目录: File Upload(文件上传) 一句话木马的构成 1. Low 1.上传一句话木马1.php 2.中国蚁剑 2.Medium 3. High 4.Imp ...

  6. Java 集合(二) Map

    Map 定义的是键值对的映射关系,一般情况下,都会选择 HashMap 作为具体的实现,除了 HashMap 之外,另一个使用到的比较多的 Map 实现是 TreeMap HashMap 构造函数 H ...

  7. 2023-09-13:用go语言,给定一个整数数组 nums 和一个正整数 k, 找出是否有可能把这个数组分成 k 个非空子集,其总和都相等。 输入: nums = [4, 3, 2, 3, 5,

    2023-09-13:用go语言,给定一个整数数组 nums 和一个正整数 k, 找出是否有可能把这个数组分成 k 个非空子集,其总和都相等. 输入: nums = [4, 3, 2, 3, 5, 2 ...

  8. 平衡树——AVL算法

    平衡树--AVL算法 平衡树建立在二叉搜索树的基础上,加入了两侧子树大小相对平衡的特性而避免了很多情况下的算法退化.这里AVL算法实现的AVL树就是平衡树的一种. 1.二叉搜索树 在说平衡树之前我们得 ...

  9. .NET Core Swagger Actions require a unique method/path combination for Swagger/OpenAPI 3.0. Use ConflictingActionsResolver as a workaround

    遇到的问题 因为新增了一个控制器方法,从而导致在运行Swagger的时候直接报错,异常如下: SwaggerGeneratorException: Conflicting method/path co ...

  10. CUDA C编程权威指南:1.1-CUDA基础知识点梳理

      主要整理了N多年前(2013年)学习CUDA的时候开始总结的知识点,好长时间不写CUDA代码了,现在LLM推理需要重新学习CUDA编程,看来出来混迟早要还的. 1.CUDA 解析:2007年,NV ...