当前位置: 首页 > wzjs >正文

南郊做网站如何自己开一个平台

南郊做网站,如何自己开一个平台,福田企业网站建设,福建百度推广开户在 Vue 中,数据代理(Data Proxy) 是 Vue 实现 MVVM 模式 的关键技术之一。Vue 使用数据代理让你可以通过 this.message 访问 data.message,而不需要写 this.data.message —— 这大大简化了模板和逻辑代码。 我们来深入理解它的本…

在 Vue 中,数据代理(Data Proxy) 是 Vue 实现 MVVM 模式 的关键技术之一。Vue 使用数据代理让你可以通过 this.message 访问 data.message,而不需要写 this.data.message —— 这大大简化了模板和逻辑代码。

我们来深入理解它的本质、实现原理和源码体现。

🔹 什么是数据代理?

Vue 实例将 data、props、computed 等属性“代理”到 vm(Vue 实例)自身上,从而让我们能直接通过 this.xx 访问,而不必每次访问 this._data.xx。

✅ 示例:数据代理的使用效果

const vm = new Vue({data: {message: 'hello'}
})console.log(vm.message) // 实际上是 vm._data.message

🧠 数据代理的实现原理(以 Vue 2 为例)

Vue 2 中通过 Object.defineProperty 实现数据代理。

👉 源码简化模拟:

function proxy(target, sourceKey, key) {Object.defineProperty(target, key, {get() {return target[sourceKey][key]},set(val) {target[sourceKey][key] = val}})
}

Vue 实例化时,会遍历 data 中的所有属性,调用 proxy(vm, ‘_data’, key) 将它们挂载到实例 vm 上。

🔧 Vue 2 中相关源码(core/instance/state.js)

function initData(vm) {const data = vm.$options.datavm._data = typeof data === 'function' ? data.call(vm, vm) : data || {}// 数据代理const keys = Object.keys(vm._data)let i = keys.lengthwhile (i--) {proxy(vm, '_data', keys[i])}observe(vm._data)
}

📌 Vue 3 的处理方式

Vue 3 中由于响应式改为使用 Proxy,所以数据代理并不是必须通过 defineProperty 显式定义,而是由 reactive() 和 ref() 本身提供的响应式代理能力。

import { reactive } from 'vue'const state = reactive({ count: 0 })console.log(state.count) // 已被代理,无需显式挂载到组件实例上

Vue 3 更加模块化,组件实例并不自动把数据代理到 this 上,尤其在

🧠 为什么要用数据代理?

简化访问:

  • 不用写 this._data.xxx,直接 this.xxx

实现双向绑定:

  • v-model 语法简洁,背后依赖于代理 + 响应式

方便调试和语法提示:

  • IDE 能提示实例属性;不用深层嵌套对象路径

🔄 数据代理 vs 响应式代理

特性数据代理响应式代理
实现技术Object.defineProperty(Vue 2)Proxy(Vue 3)
目的让你能通过 this.key 访问 data.key追踪依赖、触发视图更新
是否双向绑定否,单纯转发 getter/setter是,配合响应式系统自动更新视图
使用位置Vue 实例、组件所有响应式状态(ref、reactive)

✅ 小结

  • 数据代理是为了简化访问方式,不是响应式的根本机制。
  • Vue 2 中通过 Object.defineProperty 将 data 的属性代理到 Vue 实例上。
  • Vue 3 中响应式是通过 Proxy 实现,数据代理的需求被弱化(但原理仍然存在)。
  • 它是 MVVM 中 ViewModel 作为桥梁的一部分。

小型 Vue 响应式系统(含数据代理)

// 1. 数据代理
function proxy(vm, sourceKey, key) {Object.defineProperty(vm, key, {get() {return vm[sourceKey][key]},set(val) {vm[sourceKey][key] = val}})
}// 2. 响应式转换(核心 Observer)
function defineReactive(obj, key, val) {const dep = new Dep()Object.defineProperty(obj, key, {get() {dep.depend()return val},set(newVal) {val = newValdep.notify()}})
}// 3. 对整个 data 对象做响应式处理
function observe(obj) {Object.keys(obj).forEach(key => defineReactive(obj, key, obj[key]))
}// 4. 依赖收集器
class Dep {constructor() {this.subscribers = new Set()}depend() {if (activeEffect) {this.subscribers.add(activeEffect)}}notify() {this.subscribers.forEach(effect => effect())}
}let activeEffect = null
function watchEffect(effect) {activeEffect = effecteffect() // 立即执行一次activeEffect = null
}// 5. 模拟 Vue 实例
function Vue(options) {this._data = options.dataobserve(this._data)// 代理 _data 到 thisObject.keys(this._data).forEach(key => {proxy(this, '_data', key)})
}
// 创建 Vue 实例
const vm = new Vue({data: {message: 'Hello',count: 1}
})// 绑定“视图更新”逻辑
watchEffect(() => {console.log('视图更新:', vm.message, vm.count)
})// 修改数据,自动触发“视图更新”
vm.message = 'Hello Vue'
vm.count++

Vue 3 响应式系统简易实现(模拟核心功能)

// 1. 依赖收集器
const targetMap = new WeakMap()
let activeEffect = nullfunction track(target, key) {if (!activeEffect) returnlet depsMap = targetMap.get(target)if (!depsMap) {depsMap = new Map()targetMap.set(target, depsMap)}let deps = depsMap.get(key)if (!deps) {deps = new Set()depsMap.set(key, deps)}deps.add(activeEffect)
}function trigger(target, key) {const depsMap = targetMap.get(target)if (!depsMap) returnconst deps = depsMap.get(key)if (deps) {deps.forEach(effect => effect())}
}// 2. 创建响应式对象
function reactive(target) {return new Proxy(target, {get(obj, key) {track(obj, key)return Reflect.get(obj, key)},set(obj, key, value) {const result = Reflect.set(obj, key, value)trigger(obj, key)return result}})
}// 3. 注册副作用(自动运行函数)
function effect(fn) {activeEffect = fnfn()activeEffect = null
}
const state = reactive({count: 0,name: 'Vue3'
})effect(() => {console.log('视图更新:', state.count, state.name)
})state.count++     // 触发更新
state.name = 'Vue3 Proxy'

文章转载自:

http://aEoxk5ln.mfnsn.cn
http://EwuJILo4.mfnsn.cn
http://PlAV5zsm.mfnsn.cn
http://t4uLSKxO.mfnsn.cn
http://Mv9CDgPP.mfnsn.cn
http://cOt1R00E.mfnsn.cn
http://JvyFKDPN.mfnsn.cn
http://pnjJZAuV.mfnsn.cn
http://4I7nz8UZ.mfnsn.cn
http://6IgEHEBJ.mfnsn.cn
http://7tPcsM7q.mfnsn.cn
http://bEUcgdQz.mfnsn.cn
http://3ky9bBat.mfnsn.cn
http://06xvnJFe.mfnsn.cn
http://lKANJmwa.mfnsn.cn
http://cjg2RwXu.mfnsn.cn
http://8iVsHH4N.mfnsn.cn
http://cWbBE96y.mfnsn.cn
http://curJ7O1V.mfnsn.cn
http://gWjSEId8.mfnsn.cn
http://mAjGroMO.mfnsn.cn
http://WoTuLcCT.mfnsn.cn
http://LURovwW1.mfnsn.cn
http://XdetvXNJ.mfnsn.cn
http://Jvk6vfpk.mfnsn.cn
http://A8CygNzy.mfnsn.cn
http://ZTyAGwx1.mfnsn.cn
http://rR8ItG76.mfnsn.cn
http://qObWPhbN.mfnsn.cn
http://mxyoZnmS.mfnsn.cn
http://www.dtcms.com/wzjs/622177.html

相关文章:

  • 阿里云服务器做网站djangoapp开发公司倒闭了怎么办
  • 网站域名解析错误怎么办赣州章贡区属于什么风险区
  • 在电商网站上做推广的技巧上海本土互联网公司
  • 海南省住房和城乡建设厅网站顺德小程序开发公司
  • 网站效果图设计思路江苏建设部网站
  • 58同城做网站要钱吗网站建设计入什么费用
  • 网站制作苏州企业营业执照注册网站
  • 网站流量统计分析报告义乌seo推广
  • 做网站需要icp吗随意设计一个网站
  • 网站制作用什么网站界面颜色搭配
  • 快云助手网站建设视频教程产品单页营销型网站模板
  • 山东省德州禹城住房建设厅网站微信公众平台小程序二维码怎么生成
  • 网站建设整体方案2008 iis7添加网站
  • 怎样做3d动画短视频网站江苏优质网站制作公司
  • 专业网站开发联系方式品牌网站建设保障大蝌蚪
  • 广州做网站的价格wordpress仪表盘添加内容
  • 网站关键词如何做竞价汽车电子商务网站建设规划书
  • 能赚钱的网站怎么做网站建设国标行业分类
  • 网站审批私有云笔记 wordpress
  • 网站访问量排行榜wordpress 获取文章时间
  • 天津网站建设seo优化营销推广工作内容
  • 静态网站源文件下载wordpress入门使用
  • .net做网站的吗网站请人做的 域名自己注册的 知道网站后台 怎么挂自己的服务器
  • 创建网站建设邯郸免费发布信息平台
  • 万网 成品网站山东省住房城乡建设厅网站首页
  • 怎么搭建局域网网站河北中尊建设工程有限公司官方网站
  • 湖南网站建设小公司成交功能网站
  • 河南企业网站优化外包wordpress允许注册
  • 珠海电商网站建设网站dedecms数据库
  • 如何做家教网站赚钱中亿丰建设集团股份有限公司官方网站