夜猫子的知识栈 夜猫子的知识栈
首页
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript教程》
    • 《Web Api》
    • 《ES6教程》
    • 《Vue》
    • 《React》
    • 《TypeScript》
    • 《Git》
    • 《Uniapp》
    • 小程序笔记
    • 《Electron》
    • JS设计模式总结
  • 《前端架构》

    • 《微前端》
    • 《权限控制》
    • monorepo
  • 全栈项目

    • 任务管理日历
    • 无代码平台
    • 图书管理系统
  • HTML
  • CSS
  • Nodejs
  • Midway
  • Nest
  • MySql
  • 其他
  • 技术文档
  • GitHub技巧
  • 博客搭建
  • Ajax
  • Vite
  • Vitest
  • Nuxt
  • UI库文章
  • Docker
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

夜猫子

前端练习生
首页
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript教程》
    • 《Web Api》
    • 《ES6教程》
    • 《Vue》
    • 《React》
    • 《TypeScript》
    • 《Git》
    • 《Uniapp》
    • 小程序笔记
    • 《Electron》
    • JS设计模式总结
  • 《前端架构》

    • 《微前端》
    • 《权限控制》
    • monorepo
  • 全栈项目

    • 任务管理日历
    • 无代码平台
    • 图书管理系统
  • HTML
  • CSS
  • Nodejs
  • Midway
  • Nest
  • MySql
  • 其他
  • 技术文档
  • GitHub技巧
  • 博客搭建
  • Ajax
  • Vite
  • Vitest
  • Nuxt
  • UI库文章
  • Docker
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 基础

    • MVVM模式
    • 生命周期
    • 修饰符
    • script setup(Vue3)
    • 片段(Vue3多根节点的概念)
    • Vue监测属性的原理
      • 实现:双向绑定的代理功能
        • 例一:
        • 例二:
    • 计算属性 vs 方法 vs 侦听属性
    • v-if vs v-show
    • 列表渲染之数组、对象更新检测
    • style特性
    • style中的v-bind
    • 渲染机制
  • 响应式

  • 组件

  • 过渡&动画

  • 可复用性

  • 工具

  • 规模化

  • 路由(核心)

  • 组合式

  • Vuex

  • Pinia

  • 其他

  • Vue3 源码学习记录

  • 《Vue》笔记
  • 基础
夜猫子
2022-04-13
目录

Vue监测属性的原理

# vue 监测数据改变的原理

# 实现:双向绑定的代理功能

以 vue 中的 data 属性为例,vue 中定义了 data 属性后做了三件事 1.直接拿到 data 中的数据并加到自身当中,如 vue 实例赋值给 vm,它就有了 vm.name 等 data 中的值 2.在 vm 中又加入了_data 属性,与 data 属性一模一样,只是前缀加了下划线 3.将_data 中的各属性值与 vm 相对应的值进行代理,即监视或双向绑定

# 例一:

 <script>
 Vue.config.productionTip = false//阻止vue在启动时产生生产提示,可以忽略

 let data = {
    name: "周杰伦",
    age: 18
    }
 Object.defineProperty(data, 'name', {
    get() {
        return data.name
    },
    set(val) {
        data.name = val
    }
})
 </script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

貌似好像实现了双向绑定,但是出现逻辑错误,即绑定了自身,无限递归,所以 vue 创建了一个 _data 属性用来代理

# 例二:

 <script>
 Vue.config.productionTip = false//阻止vue在启动时产生生产提示,可以忽略

 let data = {
    name: "周杰伦",
    age: 18
 };
 let obs = new Observer(data);
 function Observer(obj) {
    const keys = Object.keys(obj);
    keys.forEach(k => {
        Object.defineProperty(this, k, {//这里this指向 Observer的实例对象
            get() {//因为这里k是用于遍历的变量,所以获取属性值不能是obj.k只能是obj[k]的形式
            return obj[k]
            },
            set(val) {
                 obj[k] = val
            }
                })
            })
        }

 </script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

实现了 obs 与 data 的监视

编辑 (opens new window)
上次更新: 2023/7/11 18:57:41
片段(Vue3多根节点的概念)
计算属性 vs 方法 vs 侦听属性

← 片段(Vue3多根节点的概念) 计算属性 vs 方法 vs 侦听属性→

最近更新
01
IoC 解决了什么痛点问题?
03-10
02
如何调试 Nest 项目
03-10
03
Provider注入对象
03-10
更多文章>
Copyright © 2019-2025 Study | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式