vue数据双向绑定原理解析(get & set)

发布时间 - 2026-01-11 00:03:13    点击率:

前端的数据双向绑定指的是view(视图)和model(数据)两者之间的关系;view层是页面上展示给用户看的信息,model层一般是指通过http请求从后台返回的数据。view到model的绑定都是通过事件回调函数操作的,model到view的绑定有多种方法。

angular,react,vue等mv*模式的框架都实现了数据双向绑定;angular是通过脏检查即新老数据的比较来确定哪些数据发生了变化,从而将它更新到view中;vue则是通过设置数据的get和set函数来实现的,这种方式在性能上是优于angular的。

下面代码是一个简单的定义数据get和set方法的例子,set和get方法分别在数据改变和访问的时候被调用,能够监听数据的变化:

// 数据绑定的构造函数
function Observer(data) {
 this.data = data;

 for(var key in data) {
  if(data.hasOwnProperty(key)) {
   var val = data[key];
   if(typeof data[key] === "object"){
    // 如果值不为原始类型,则继续递归
    new Observer(val);
   }else {
    this.convert(key, val);
   }
  }
 }
}
// 定义set 和 get函数
Observer.prototype.convert = function(key, val) {
 Object.defineProperty(this.data, key, {
  enumerable: true,
  confingurable: true,
  get: function() {
   console.log(key + "被访问了");
   return val;
  },
  set: function(newVal) {
   console.log(key + "被设置了新值" + newVal);
   val = newVal;
  }
 });
}
var app = new Observer({name: "xieshuai", age: 24, address: {city: "shenzheng"}});

app.data.name;  // name被访问了
app.data.age = 18; // age被设置了新值18

Object.defineProperty,这是ES6新增的方法,通过这个方法,可以自定义getter和setter函数。

上面的代码只是个简单的例子,并没有处理数组的情况;不过这是vue实现数据双向绑定的核心。

本文到此结束,文中若有不对之处,还望指正。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# vuejs数据双向绑定  # vue.js双向绑定  # vue数据绑定  # vue中的双向数据绑定原理与常见操作技巧详解  # Vue双向绑定实现原理与方法详解  # vue数组双向绑定问题及$set用法说明  # 绑定  # 这是  # 递归  # 都是  # 是一个  # 是个  # 之处  # 则是  # 是指  # 有多  # 自定义  # 不为  # 种方法  # 若有  # 将它  # 新老  # 到此  # 指的是  # 来实现  # 回调 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  网站制作大概多少钱一个,做一个平台网站大概多少钱?  详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点  如何在云主机上快速搭建网站?  Laravel如何使用Eloquent进行子查询  Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能  如何在建站主机中优化服务器配置?  Laravel路由怎么定义_Laravel核心路由系统完全入门指南  Android 常见的图片加载框架详细介绍  Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  Laravel模型事件有哪些_Laravel Model Event生命周期详解  Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】  Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】  Android中AutoCompleteTextView自动提示  标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南  如何在宝塔面板中修改默认建站目录?  php结合redis实现高并发下的抢购、秒杀功能的实例  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】  高防服务器租用指南:配置选择与快速部署攻略  网易LOFTER官网链接 老福特网页版登录地址  javascript中的数组方法有哪些_如何利用数组方法简化数据处理  Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】  如何利用DOS批处理实现定时关机操作详解  Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践  Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】  Python高阶函数应用_函数作为参数说明【指导】  html如何与html链接_实现多个HTML页面互相链接【互相】  制作企业网站建设方案,怎样建设一个公司网站?  详解Android图表 MPAndroidChart折线图  微信小程序 wx.uploadFile无法上传解决办法  linux写shell需要注意的问题(必看)  如何获取免费开源的自助建站系统源码?  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  IOS倒计时设置UIButton标题title的抖动问题  php 三元运算符实例详细介绍  Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理  Laravel如何创建自定义Artisan命令?(代码示例)  Linux系统命令中tree命令详解  如何用IIS7快速搭建并优化网站站点?  谷歌Google入口永久地址_Google搜索引擎官网首页永久入口  如何在IIS7中新建站点?详细步骤解析  Laravel模型关联查询教程_Laravel Eloquent一对多关联写法  HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】  独立制作一个网站多少钱,建立网站需要花多少钱?