angular和vue双向数据绑定

angular和vue双向数据绑定的原理(重点是vue的双向绑定)

我在整理javascript高级程序设计的笔记的时候看到面向对象设计那章,讲到对象属性分为数据属性和访问器属性,我们平时用的js对象90%以上都只是用到数据属性;我们向来讲解下数据属性和访问器属性到底是什么?

  • 数据属性:数据属性包含一个数据值的位置,在这个位置可以读取和写入值.
  • 访问器属性:访问器属性不包含数据值;他们包含一对getter和setter函数在读取访问器属性时,会调用getter函数,这个函数负责返回有效的值,在写入访问器属性时,会调用setter函数并传入新值.

这里介绍的重点是访问器属性,设置对象的访问器属性只能用es5的Object.defineProrerty()方法,如下例子:

  var book={
          _year:2004,
          edition:1
      };
      Object.defineProperty(book,"year",{
          get:function () {
              return this._year
          },
          set:function (newValue) {
              if(newValue>2004){
                  this._year=newValue;
                  this.edition+=newValue-2004;
              }
          }
      });
        book.year=2005;
        alert(book.edition);//2
        console.log(book.year);//2005

也就是当执行book.year=2005的时候其实是执行了year中的set方法,当执行book.year的时候执行了year的get方法;

   var book={
          _year:2004,
          edition:1
      };
      Object.defineProperty(book,"year",{
          get:function () {
              console.log("year get")
              return this._year
          },
          set:function (newValue) {
              console.log("year set")
              if(newValue>2004){
                  this._year=newValue;
                  this.edition+=newValue-2004;
              }
          }
      });
        book.year=2005;
        alert(book.year);

控制台的提示是:

这个原理就是vue双向数据绑定的原理,我们在vue组件中的data声明属性数据的时候其实在对象中的已经将这个属性封装成了访问器属性.

每个属性都有get和set方法,在做双向的数据的控制都在get和set方法中,因为无论你是在ready(2.0是mounted了)或是在view中改变值都会触发set方法,将新值复制进去,在重新在view中匹配值,当然你们有更复杂的控制操作,get方法着是让ready中获取的这个属性值一直保存最新值.

angular1的双向数据绑定是脏数据监测,简单点说就是监测新值和旧值有没有变化,这种方式就要定时监测了咯.两种性能的消耗感觉不在一个层次上的啊.

就好比用html5 Sockets做后台主动消息推送前端和用js定时器每个5秒发送请求到后台捕获消息的性能差距一样.

还有之前写的js面向对象分层的思想其实也可以用在vue项目中,以前我一直以为vue的data层其实就是个摆设,但在api发现computed属性之后data层完全可以实现发送ajax取数功能,没必要在全都放到ready(2.0是mounted了)里面,这个ready(2.0是mounted了)可以只负责数据格式出来,或者控制页面的动态效果而已.这js的结构就像后台MVC那样层次功能分明清晰.这也只是我突然想到的思路还没真正应用到实际项目中,只是给在用vue的朋友提供个思路.

 import data  from ‘../assets/js/data‘
    export default{
        data(){
            return{
              menu:data.menu,
              inde:"",
              row:"",
              clomu:""
            }
        },
      computed:{
        isfull:function () {
          alert(111);
          return 11;
        }
      },
      mounted(){

      },
      methods:{
          domclick:function (i) {
            if(this.inde===i){
              this.inde="";
            }else {
              this.inde = i;
            }
          },
        subclick:function (i,o) {
         this.row=i;
          this.clomu=o;
        }
      }
    }

时间: 2024-08-09 02:06:34

angular和vue双向数据绑定的相关文章

vue 双向数据绑定的实现学习(二)- 监听器的实现

废话:上一篇https://www.cnblogs.com/adouwt/p/9928278.html 提到了vue实现的基本实现原理:Object.defineProperty() -数据劫持 和 发布订阅者模式(观察者),下面讲的就是数据劫持在代码中的具体实现. 1.先看如何调用 new一个对象,传入我们的参数,这个Myvue ,做了啥? 上面看到了在实例化一个Myvue 对象的时候,会执行init方法, init 方法做了两个事,调用了observer 方法,和 实例化调用了 compil

React 事件对象、键盘事件、表单事件、ref获取dom节点、react实现类似Vue双向数据绑定

1.案例实现代码 import React, { Component } from 'react'; /** * 事件对象.键盘事件.表单事件.ref获取dom节点.react实现类似Vue双向数据绑定 * 事件对象: 在触发DOM上的某个事件时,会产生一个事件对象event,这个对象包含着所有与事件有关的信息 * 表单事件: 获取表单的值 * 1.监听表单的改变事件 ---onChange * 2.在改变的事件里面获取表单输入的值 ---event * 3.把表单输入的值赋值给username

vue双向数据绑定原理探究(附demo)

昨天被导师叫去研究了一下vue的双向数据绑定原理...本来以为原理的东西都非常高深,没想到vue的双向绑定真的很好理解啊...自己动手写了一个. 传送门 双向绑定的思想 双向数据绑定的思想就是数据层与UI层的同步,数据再两者之间的任一者发生变化时都会同步更新到另一者. 双向绑定的一些方法 目前,前端实现数据双向数据绑定的方法大致有以下三种: 1.发布者-订阅者模式(backbone.js) 思路:使用自定义的data属性在HTML代码中指明绑定.所有绑定起来的JavaScript对象以及DOM元

Angular 1.63 双向数据绑定 通过 $http 发送数据

html 部分 <body ng-app="app"> <form action="" method="">账号 <div ng-controller="login"> <label for=""><input type="text" ng-model="data.name" name="name&quo

Vue双向数据绑定简易实现

一.vue中的双向数据绑定主要使用到了Object.defineProperty(新版的使用Proxy实现的)对Model层的数据进行getter和setter进行劫持,修改Model层数据的时候,在setter中可以知道对那个属性进行修改了,然后修改View的数据. 二.简易版双向数据绑定 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> &

vue双向数据绑定简易demo

1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8" /> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 6 <meta http-equiv="X-UA-Comp

Vue双向数据绑定的手动实现

class Asarua { // 传入一个对象,也就是实例化的时候的参数 constructor(options) { this.$data = options.data; // 获取挂载的dom this.$el = document.querySelector(options.el); this.$methods = options.methods; this.$options = options; // 定义一个容器,来存放所有的订阅者 this.observable = {}; thi

关于angular和vue双向绑定失效问题的解决

相信很多人都有这样的一个习惯,就是喜欢把输入限制的表单验证写在html中的input框里面 angular vue 就像上面一样(限制只能输入数字),这种写法一般你在开发过程中很难发现的,就算是测试也很难发现,我们的知道angular2.0和vue2.0都是通过Object.definePropety()的getter.和setter的数据劫持来实现的,如果将正则写在html中标签里面,当你切换成中文输入法时,就会造成双向绑定失效,就是输入英文字符及其他的字符时,输入框里面是空的,但是绑定的却是

vue双向数据绑定

父组件引用子组件时,可以使用 v-model="params"  绑定一个变量, 在子组件中,需要使用props去接收一个value变量,即父组件绑定到的params的值 在子组件中,使用this.$emit("input" , someData); 可以触发父组件的input事件,someData是参数,它的值会赋给父组件的params的变量. 这种写法是一种简化的写法,是vue的语法糖.他也可以写成 <v-children v-bind:value=&qu