全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

vue实现动态数据绑定

实现的步骤:

1.监听对象属性的读取与变化

Object.defineProperty() 方法会直接在对象上定义一个新的的属性,或者已经存在的属性并且返回这个属性

语法是 Object.defineProperty(obj, prop, descript)

obj: 目标对象

prop: 需要定义或修改的属性的名字

descript: 将被定义或修改的属性的描述符

描述:

这个方法精确添加或修改对象的属性,我们添加的属性是可以枚举的属性(Object.keys()/ for...in)

对象里面存在是属性描述存在的形式是:

数据描述符:拥有可写入或不可以写入的属性(相当于口令密码)

存取描述符:由一对getter-setter 函数功能来描述的属性(方法)

注意:**描述符**必须是两种形式之一,不能同时是两者。

数据描述符和存取描述符均具有以下可选键值:

1.configurable:当且仅当该属性的 configurable 为 true 时,该属性描述符才能够被改变,也能够被删除。默认为 false

2.enumerable:当且仅当该属性的 enumerable 为 true 时,该属性才能够出现在对象的枚举属性中。默认为 false

数据描述符:

1.value:该属性对应的值。可以是任何有效的 JavaScript 值(数值,对象,函数等)。默认为 undefined。

2.writable:当且仅当该属性的 writable 为 true 时,该属性才能被赋值运算符改变。默认为 false。

存取描述符同时具有以下可选键值:

1.get:一个给属性提供 getter 的方法,如果没有 getter 则为 undefined。该方法返回值被用作属性值。默认为 undefined。

2.set:一个给属性提供 setter 的方法,如果没有 setter 则为 undefined。该方法将接受唯一参数,并将该参数的新值分配给该属性。默认为 undefined。

示例:

创建属性

var o = {};
Object.defineProperty(o, "a", {value : 37,
                writable : true,
                enumerable : true,
                configurable : true});

console.log(o.a);
Object.defineProperty(o, "b", {get : function(){ /*console.log( bValue)*/ return value },
                set : function(newValue){ bValue = newValue; },
                enumerable : true,
                configurable : true});
o.b = 38;

修改属性

当属性特性(property attribute) writable 设置为false时,表示 non-writable,属性不能被修改。

var o = {}; // 创建一个新对象

Object.defineProperty(o, "a", { value : 37,
                writable : false });

console.log(o.a); // 打印 37
o.a = 25; // 没有错误抛出(在严格模式下会抛出,即使之前已经有相同的值)
console.log(o.a); // 打印 37, 赋值不起作用。

一般的setter 和 getters

var pattern = {
  get: function () {
    return 'I alway return this string,whatever you have assigned';
  },
  set: function () {
    this.myname = 'this is my name string';
  }
};
function TestDefineSetAndGet() {
  Object.defineProperty(this, 'myproperty', pattern);
}
var instance = new TestDefineSetAndGet();
instance.myproperty = 'test';

// 'I alway return this string,whatever you have assigned'
console.log(instance.myproperty);
// 'this is my name string'
console.log(instance.myname);

解题

function Observer(property) {
  this.data = {};
  this.recursion(data);
}

Observer.prototype.recursion = function(obj) {
  var val = null;
  for (key in obj) {
    if(obj.hasOwnProperty(key)) {
      val = obj[val];
      if(typeof val === 'object' && !!val) {
        new Observer(val);
      }
      this.access(key, val);
    }
  }
}

Observer.prototype.access = function(key, val) {
  Object.defineProperty(this.data, key, {
    enumerable: true,
    configurable: true,
    get: function () {
      console.log('你访问了' + key);
      return val
    },
    set: function (newVal) {
      console.log('你设置了' + key);
      console.log('新的' + key + ' = ' + newVal)
      if (newVal === val) return;
      val = newVal
    }
  })
}


let app1 = new Observer({
 name: 'youngwind',
 age: 25
});
let app2 = new Observer({
 university: 'bupt',
 major: 'computer'
});

// 要实现的结果如下:
app1.data.name // 你访问了 name
app1.data.age = 100; // 你设置了 age,新的值为100
app2.data.university // 你访问了 university
app2.data.major = 'science' // 你设置了 major,新的值为 science

多层级对象

当传入的对象是

let app1 = new Observer({
  user: {
    name: "liangshaofeng",
    age: "24"
  },
  address: {
    city: "beijing"
  }
});

递归解决问题!!

function Observer(data) {
  this.data = data;
  this.recursion(this.data);
}

Observer.prototype.recursion = function(obj) {
  var val = null;
  for (key in obj) {
    if(obj.hasOwnProperty(key)) {
      val = obj[key];
      if(typeof val === 'object' && !!val) {
        new Observer(val);
      }
      this.access(key, val);
    }
  }
}

Observer.prototype.access = function(key, val) {
  Object.defineProperty(this.data, key, {
    enumerable: true,
    configurable: true,
    get: function () {
      console.log('你访问了' + key);
      return val
    },
    set: function (newVal) {
      console.log('你设置了' + key);
      console.log('新的' + key + ' = ' + newVal)
      if (newVal === val) return;
      val = newVal
    }
  })
}

let app1 = new Observer({
  user: {
    name: "liangshaofeng",
    age: "24"
  },
   address: {
    city: "beijing"
  }
});


app1.data.user.name // 你访问了 name
app1.data.user.age = 100; // 你设置了 age,新的值为100

增加事件系统

// 事件系统
function Event() {
  this.events = {};
}

Event.prototype.emit = function(attr, val, newVal) {
  this.events[attr] && this.events[attr].forEach(function(item){
    item(val, newVal)
  })
}

Event.prototype.on = function(attr, callback){
 if(this.events[attr]){
  this.events[attr].push(callback);
 }else{
  this.events[attr] = [callback];
 }
}



function Observer(data) {
  this.data = data;
  this.recursion(this.data);
  this.eventsBus = new Event();
}

Observer.prototype.recursion = function(obj) {
  var val = null;
  for (key in obj) {
    if(obj.hasOwnProperty(key)) {
      val = obj[key];
      if(typeof val === 'object' && !!val) {
        new Observer(val);
      }
      this.access(key, val);
    }
  }
}

Observer.prototype.access = function(key, val) {
  var self = this;
  Object.defineProperty(this.data, key, {
    enumerable: true,
    configurable: true,
    get: function () {
      console.log('你访问了' + key);
      return val
    },
    set: function (newVal) {
      if (typeof newVal === 'object' && !!newVal) {
        new Observer(newVal);
      }
      console.log('你设置了' + key);
      console.log('新的' + key + ' = ' + newVal)
      self.eventsBus.emit(key, val, newVal);
      if (newVal === val) return;
      val = newVal
    }
  })
}
Observer.prototype.$watch = function(attr, callback){
 this.eventsBus.on(attr, callback);
}

let app1 = new Observer({
  user: {
    name: "liangshaofeng",
    age: "24"
  },
   address: {
    city: "beijing"
  }
});


app1.data.user.name // 你访问了 name
app1.data.user.age = 100; // 你设置了 age,新的值为100

app1.data.user.name = {
  lastName: 'liang',
  firstName: 'shaofeng'
 };
 app1.data.user.name.lastName;
 // 这里还需要输出 '你访问了 lastName '
 app1.data.user.name.firstName = 'lalala';
 // 这里还需要输出 '你设置了firstName, 新的值为 lalala'
 var app1 = new Observer({
  name: 'liujianhuan',
  age: 25,
  company: 'Qihoo 360',
  address: 'Chaoyang, Beijing'
})

app1.$watch('age', function(oldVal, newVal){
  console.log(`我的年龄变了,原来是: ${oldVal}岁,现在是:${newVal}岁了`)
})

app1.$watch('age', function(oldVal, newVal){
  console.log(`我的年龄真的变了诶,竟然年轻了${oldVal - newVal}岁`)
})

app1.data.age = 20;

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


# vue动态数据绑定  # vue.js  # 动态绑定数据  # vue2.0  # vue.js数据绑定的方法(单向、双向和一次性绑定)  # 浅谈vue中关于checkbox数据绑定v-model指令的个人理解  # Vue.js实现双向数据绑定方法(表单自动赋值、表单自动取值)  # 简单谈谈Vue 模板各类数据绑定  # Angular和Vue双向数据绑定的实现原理(重点是vue的双向绑定)  # vue.js使用v-model实现表单元素(input) 双向数据绑定功能示例  # vue.js数据绑定操作详解  # vue 标签属性数据绑定和拼接的实现方法  # Vue.js数据绑定之data属性  # vue实现双向数据绑定  # 默认为  # 值为  # 如果没有  # 还需要  # 可选  # 递归  # 才能够  # 则为  # 抛出  # 键值  # 出现在  # 两种  # 将被  # 解决问题  # 设置为  # 将该  # 创建一个  # 大家多多  # 或不  # 返回值 


相关文章: 宝塔建站无法访问?如何排查配置与端口问题?  焦点电影公司作品,电影焦点结局是什么?  如何通过虚拟主机快速搭建个人网站?  教程网站设计制作软件,怎么创建自己的一个网站?  教学网站制作软件,学习*后期制作的网站有哪些?  如何用西部建站助手快速创建专业网站?  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  C#怎么创建控制台应用 C# Console App项目创建方法  如何设置并定期更换建站之星安全管理员密码?  如何选择高效便捷的WAP商城建站系统?  香港服务器WordPress建站指南:SEO优化与高效部署策略  javascript中的try catch异常捕获机制用法分析  建站主机默认首页配置指南:核心功能与访问路径优化  如何确保西部建站助手FTP传输的安全性?  IOS倒计时设置UIButton标题title的抖动问题  如何用搬瓦工VPS快速搭建个人网站?  岳西云建站教程与模板下载_一站式快速建站系统操作指南  建站之星手机一键生成:多端自适应+小程序开发快速建站指南  利用JavaScript实现拖拽改变元素大小  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  如何在香港免费服务器上快速搭建网站?  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  香港服务器租用费用高吗?如何避免常见误区?  图册素材网站设计制作软件,图册的导出方式有几种?  在线制作视频网站免费,都有哪些好的动漫网站?  微网站制作教程,我微信里的网站怎么才能复制到浏览器里?  c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】  整人网站在线制作软件,整蛊网站退不出去必须要打我是白痴才能出去?  建站之星安装步骤有哪些常见问题?  制作公司内部网站有哪些,内网如何建网站?  如何在Golang中引入测试模块_Golang测试包导入与使用实践  济南网站制作的价格,历城一职专官方网站?  建站之星安装后界面空白如何解决?  如何快速搭建高效服务器建站系统?  个人摄影网站制作流程,摄影爱好者都去什么网站?  建站之星如何一键生成手机站?  如何在万网主机上快速搭建网站?  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  昆明高端网站制作公司,昆明公租房申请网上登录入口?  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  建站之星免费版是否永久可用?  如何快速查询域名建站关键信息?  用v-html解决Vue.js渲染中html标签不被解析的问题  如何在阿里云虚拟主机上快速搭建个人网站?  制作企业网站建设方案,怎样建设一个公司网站?  建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析  黑客入侵网站服务器的常见手法有哪些?  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。