关于vue的计算属性以及双向绑定的原理理解(vue2.x)以及vue3.0

vue的计算属性:

1.什么是计算属性?

计算属性的目的是用于对数据进行简单运算的,若在模板中放过多的计算逻辑会导致模板难以维护。

计算属性是基于它们的依赖进行缓存的。计算属性只有在它的相关依赖发生改变时才会重新求值。

2.计算属性如何使用?

1.在一个计算属性里可以完成各种复杂的逻辑,包括运算、函数调用等,只要最终返回一个结果就可以。

 computed: {
        reverseText: function(){
            return app1.text.split(‘‘).reverse().join(‘‘);  //对数据进行计算,将reverseText放进模板中,只要依赖的数据发生变化就会改变
        }
    }

2.计算属性还可以依赖多个Vue 实例的数据,只要其中任一数据变化,计算属性就会重新执行,视图也会更新。

两个小方面是计算属性可以依赖其他计算属性;  是计算属性不仅可以依赖当前Vue 实例的数据,还可以依赖其他实例的数据。

    <div id="app1"></div>
    <div id="app2">{{ reverseText}}</div>
var app1 = new Vue({
   el: ‘#app1‘,
 data: {
      text: ‘computed‘
    }
});

var app2 = new Vue({
    el: ‘#app2‘,
    computed: {
        reverseText: function(){
            return app1.text.split(‘‘).reverse().join(‘‘);  //使用app1的数据进行计算
        }
    }
});

每一个计算属性都包含一个getter 和一个setter ,计算属性会默认使用getter,相关用法如下:

var vm = new Vue({
    el: ‘#demo‘,
    data: {
        firstName: ‘Foo‘,
        lastName: ‘Bar‘
    },
    computed: {
        fullName: {
            // getter
            get: function () {
                return this.firstName + ‘ ‘ + this.lastName
            },
            // setter
            set: function (newValue) {
                var names = newValue.split(‘ ‘);
                this.firstName = names[0];
                this.lastName = names[names.length - 1];
            }
        }
    }
});

在我们日常使用中,通常不用特意声明setter,当手动修改计算属性的值就像修改一个普通数据那样时,就会触发setter 函数,执行一些自定义的操作

var vm = new Vue({
    el: ‘#demo‘,
    data: {
        firstName: ‘Foo‘,
        lastName: ‘Bar‘
    },
    computed: {
        fullName: {
            // getter
            get: function () {
                return this.firstName + ‘ ‘ + this.lastName
            },
            // setter
            set: function (newValue) {
                var names = newValue.split(‘ ‘);
                this.firstName = names[0];
                this.lastName = names[names.length - 1];
            }
        }
    }
});
//现在再运行 vm.fullName = ‘John Doe‘ 时,setter 会被调用,vm.firstName 和 vm.lastName 也会相应地被更新。

绝大多数情况下,我们只会用默认的getter 方法来读取一个计算属性,在业务中很少用到setter,所以在声明一个计算属性时,可以直接使用默认的写法,不必将getter 和setter 都声明。

总结:当一个属性data需要进行逻辑性的运算和判断时,便出现了计算属性(computed),计算属性一个最大的特点就是会判断依赖的数据是否改变来判断,若未改变便会利用之前储存的数据,不用再获取,虽然方法也可以实现逻辑的运算,但不会监听数据是否发生了变化,会进行重复性的请求,所以计算属性更加优化和智能。

computed vs methods

  -计算属性是基于它们的依赖进行缓存的。

  -计算属性只有在它的相关依赖发生改变时才会重新求值

相关函数的案例转自:https://www.cnblogs.com/chaixiaozhi/p/8688820.html



双向绑定的原理:

一个普通的 JavaScript 对象传入 Vue 实例作为 data 选项,Vue 将遍历此对象所有的属性,并使用 defineProperty 把这些属性全部转为 getter/setter

Object.defineProperty 是 ES5 中一个无法 shim 的特性,这也就是 Vue 不支持 IE8 以及更低版本浏览器的原因

 // 给对象添加属性的语法
        var data = {}

        // IE8和之前浏览器不支持
        // 一种给对象添加属性的方式
        // 给obj添加name属性
        // 这样加属性的好处是,可以监听属性的赋值和取值
        // 当对象给这个属性赋值时,就会调用set方法
        // 取值时就会调用get方法
        Object.defineProperty(data,‘name‘,{

            get(){
                // console.log(‘取值了‘);
                //必须在get最后写return _属性名
                return _name;
            },

            // value是你赋值时是什么值,就传过来什么
            set(value){
                // console.log(‘set‘);

                // 必须写_属性名 = value
                _name = value
                // console.log(data.name);
                var list = document.querySelectorAll(‘[v-bind]‘)
                for(var i = 0; i < list.length; i++){
                    list[i].innerHTML = value;
                }
            }
        })

这样就可以通过get和set来监听数据的获取和传值

上面就是目前Vue2.x的双向绑定原理,但即将发布的Vue3.0的双向绑定原理则采用了新的技术,就是proxy

proxy

let data = {}

  // new proxy对象
  let proxyData = new Proxy(data,{
    get(obj,prop){
      console.log(‘get‘)
      console.log(obj)
      console.log(prop)
      return obj[prop]
    },
    set(obj,prop,value){    //obj:绑定的对象   //prop:赋的属性   //value:属性值
      obj[prop]= value
      console.log(‘set‘)
      console.log(obj)
      console.log(prop)
      console.log(value)
    }
  })
//obj:绑定的对象   //prop:赋的属性   //value:属性值new的proxy对象绑定的数据data,只要是data任何属性发生改变都会调用不管是这个对象的什么属性都会调用set或者get

有关proxy与defineProperty的区别:

1.Proxy有多达13种拦截方法,不限于apply、ownKeys、deleteProperty、has等等是Object.defineProperty不具备的。

2.Proxy返回的是一个新对象,我们可以只操作新的对象达到目的,而Object.defineProperty只能遍历对象属性直接修改。

3.Proxy作为新标准将受到浏览器厂商重点持续的性能优化,也就是传说中的新标准的性能红利。

4.Proxy的劣势就是兼容性问题,而且无法用polyfill磨平,因此Vue的作者才声明需要等到下个大版本(3.0)才能用Proxy重写。

相关详细资料参考:https://www.jianshu.com/p/2df6dcddb0d7

原文地址:https://www.cnblogs.com/BR-Tao/p/11408306.html

时间: 2024-12-14 01:28:27

关于vue的计算属性以及双向绑定的原理理解(vue2.x)以及vue3.0的相关文章

VUE JS 使用组件实现双向绑定

1.VUE 前端简单介绍  VUE JS是一个简洁的双向数据绑定框架,他的性能超过ANGULARJS,原因是实现的机制和ANGULARJS 不同,他在初始化时对数据增加了get和set方法,在数据set时,在数据属性上添加监控,这样数据发生改变时,就会触发他上面的watcher,而ANGULARJS 是使用脏数据检查来实现的. 另外VUEJS 入门比ANGULARJS 简单,中文文档也很齐全. 2.组件实现    在使用vue开发过程中,我们会需要扩展一些组件,在表单中使用,比如一个用户选择器.

vue的计算属性

在模板中写入过多的逻辑使模板过重且难以维护.因此有了计算属性(computed)的产生. 你可以像绑定普通属性一样在模板中绑定计算属性,vue知道计算属性中的函数依赖data中的数据.所以当data中的数据发生变化时.所有依赖计算属性中的函数也会更新.而且最妙的是,我们已经以声明的方式创建了这种依赖关系:计算属性的getter是没有副作用的,这使得它易于推理和测试. 1,计算属性与methods 我们将同一函数定义为method,而不是一个计算属性,得到的结果都是一样的.然而两者的不同:计算属性

Vue实现数据双向绑定的原理

Vue实现数据双向绑定的原理:Object.defineProperty() vue实现数据双向绑定主要是:采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应监听回调.当把一个普通 Javascript 对象传给 Vue 实例来作为它的 data 选项时,Vue 将遍历它的属性,用 Object.defineProperty 将它们转为 getter/setter.用户看不

Vue中计算属性

一般情况下属性都是放在data中的,但是有些属性可能是需要经过一些计算才能得出,那么,我们可以把这类属性变成计算属性.此时,需要将这些计算属性写到computed中,和将属性写在data中是一样的.表面上看,计算属性和methods一样,实际上,计算属性更加智能,他是基于它们的响应式依赖进行缓存的.也就是说,只要相关依赖(比如下面的例子中的“area”)没有发生变化,那么这个计算属性的函数就不会重新执行,而是直接返回之前的值.这个缓存功能使计算属性访问起来更高效. 计算属性set: set方法是

Vue.js 计算属性

Vue.js 计算属性 使用计算属性的实例: <!DOCTYPE html> <html> <head> <meta cahrset="utf-8"> <title>computed</title> <script src="vue.min.js"></script> </head> <body> <div id="app"

vue中计算属性,方法,侦听器

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>vue中计算属性,方法,侦听器</title> <script src="./vue.js"></script> </head> <body> <div id="app&qu

谈谈对vue的认识2:双向绑定 v-model

1:v-model指令 数据的双向绑定 双向绑定是说我们不仅仅可以通过数据(M)的改变去影响视图(V),还是当视图的内容改变(V)去影响模型中的数据(M) 通常来说双绑定应用在表单中比较多 指令: vue对html元素拓展是一些属性名称(自定义属性名称) Vue指令有个特点,都是以v-开头的 V-model,它提供了一个js环境,在他的属性之中我们可以使用js(vue实例化对象)中的变量,将表单元素的值与vue实例化对象中是数据属性同步,实现视图到模型中的数据的一个绑定,因此在表单元素上添加了v

VUE:计算属性和监视

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <!-- 1.计算属性: 在computed属性对象中定义计算属性的方法 在页面中使用{{方法名}}来显示计算结果 2.监视属性: 通过vm对象的$watch()或watch配置来监视指定的属性 当属性变化时,回调函数自

vue中v-model的数据双向绑定(重要)

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="app"> <input type="text" v-model="msg"&g