vue中数据双向绑定的原理是什么?

2021-01-28 17:12发布

10条回答

、实现一个数据监听器Observer,能够对数据对象的所有属性进行监听,如有变动可拿到最新值并通知订阅者2、实现一个指令解析器Compile,对每个元素节点的指令进行扫描和解析,根据指令模板替换数据,以及绑定相应的更新函数3、实现一个Watcher,作为连接Observer和Compile的桥梁,能够订阅并收到每个属性变动的通知,执行指令绑定的相应回调函数,从而更新视图4、mvvm入口函数,整合以上三者

一共分四步, 每一步都有大堆解释和一大堆的代码, 然而我真的只是一个 名副其实的理工科生,看到了文中的发布者-订阅者模式, 于是乎我去网上各种百度, 个人理解就是getter函数里面执行的任务就是watcher订阅者, 而setter函数执行的任务就是发布者; 相信很多人看过了这个也是一知半解, 下面我来解释一波:

ECMAScript中有两种属性:数据属性和访问器属性,数据属性一般用于存储数据数值, 访问器属性对应的是set/get操作, 不能直接存储数据值, 每种属性下面又都含有四个特性.下面介绍一下:

数据属性

1.[[Configurable]]: 表示能否通过delete将属性删除,能否把属性修改为访问器属性, 默认为false。当把属性Configurable设置为false后,该属性不能通过delete删除,并且也无法再将该属性的Configurable设置回true

2.[[Enumerable]]: 表示属性可否被枚举(即是否可以通过for in循环返回),默认false3.[[Writable]]: 表示属性是否可写(即是否可以修改属性的值),默认false4.[[Value]]: 该属性的数据值, 默认是undefined访问器属性

1.[[Configurable]]: 表示能否通过delete将属性删除,能否把属性修改为数据属性, 默认为false。当把属性Configurable设置为false后,该属性不能通过delete删除,并且也无法再将该属性的Configurable设置回true

2.[[Enumerable]]: 表示属性可否被枚举(即是否可以通过for in循环返回),默认false3.[[Get]]: 读取属性时调用的函数, 默认为undefined4.[[Set]]: 写入属性时调用的函数, 默认是undefined

在修改属性的特性或者定义访问器属性的时候, 需要借助ECMAScript 5中的一个方法: Object.defineProperty(), 这个方法接收三个参数: 属性所在对象, 属性的名字, 描述符对象; 为对象定义多个属性的话, 就用函数的复数写法:Object.defineProperties();


大冬瓜
3楼 · 2021-01-28 18:17

目前几种主流的mvc(vm)框架都实现了单向数据绑定,而我所理解的双向数据绑定无非就是在单向绑定的基础上给可输入元素(input、textare等)添加了change(input)事件,来动态修改model和 view,并没有多高深。所以无需太过介怀是实现的单向或双向绑定。

实现数据绑定的做法有大致如下几种:

发布者-订阅者模式(backbone.js)

脏值检查(angular.js)

数据劫持(vue.js)



不学还会不
4楼 · 2021-01-29 09:26

1、实现一个数据监听器Observer,能够对数据对象的所有属性进行监听,如有变动可拿到最新值并通知订阅者
2、实现一个指令解析器Compile,对每个元素节点的指令进行扫描和解析,根据指令模板替换数据,以及绑定相应的更新函数
3、实现一个Watcher,作为连接Observer和Compile的桥梁,能够订阅并收到每个属性变动的通知,执行指令绑定的相应回调函数,从而更新视图
4、mvvm入口函数,整合以上三者


灰机带翅膀
5楼 · 2021-01-29 10:17

vue实现双向数据绑定的原理就是利用了 Object.defineProperty() 这个方法重新定义了对象获取属性值(get)和设置属性值(set)的操作来实现的。

在MDN上对该方法的说明是:Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。

它接收三个参数,要操作的对象,要定义或修改的对象属性名,属性描述符。重点就是最后的属性描述符。

属性描述符是一个对象,主要有两种形式:数据描述符和存取描述符。这两种对象只能选择一种使用,不能混合两种描述符的属性同时使用。上面说的get和set就是属于存取描述符对象的属性。

然后我们可以通过在存取描述符中的get和set方法内写入自定义的逻辑来实现对象获取属性和设置属性时的行为。


希希
6楼 · 2021-01-29 10:27

目前几种主流的mvc(vm)框架都实现了单向数据绑定,而我所理解的双向数据绑定无非就是在单向绑定的基础上给可输入元素(input、textare等)添加了change(input)事件,来动态修改model和 view,并没有多高深。所以无需太过介怀是实现的单向或双向绑定。

实现数据绑定的做法有大致如下几种:

发布者-订阅者模式(backbone.js)

脏值检查(angular.js)

数据劫持(vue.js)


duans
7楼 · 2021-01-29 10:42

vue实现双向数据绑定的原理主要是通过数据劫持结合观察者模式来实现的.

1. 数据劫持

数据劫持主要是使用Object.defineProperty()这个API对所有数据进行代理(劫持). 你可以任务Object.defineProperty()是另外一种定义数据的方式, 通过这种方式定义的数据, 数据的操作可以被监视到. Object.defineProperty()的基本语法格式如下:

Object.defineProperty(变量所属对象,变量名,{
  get(){
      // 当读取变量的时候,get方法会被自动触发,并且变量的值是由get方法的返回值来决定的
            
  },
  set(newValue){
    // 当对变量进行赋值的时候,set方法会被自动触发,并且系统会将变量的最新赋值通过形参传入set方法内部
   }
});

接下来演示一下如何实现批量劫持数据:

    const data={
        msg:'hello',
        title:'数据劫持'
    }

    Object.keys(data).forEach(key=>{
        // 将对象属性值保存到局部变量value中,方便操作
        let value=data[key];
        Object.defineProperty(data,key,{
            get(){
                return value;
            },
            set(newValue){
                value=newValue;
            }
        });
    });

2. 观察者模式

观察者模式的核心就在将某个操作收集起来, 一般会议对象的方式存储, 然后在某个特定的时间点通过循环遍历的方式一次执行这些操作对象. 这个过程就和订阅报纸的过程非常相似, 所以有些时候也称为发布者订阅者模式. 接下来演示一下通过JS实现观察者模式:

// 发布者订阅者模式
class PubSub {
    constructor() {
        // 存放订阅者的对象
        // this.subs={msg:[callback],msg2:[callback2]}
        this.subs = {};
    }
    /**
     * 订阅方法
     * @param {*} key 订阅对象名称
     * @param {*} callback 回调函数   
     */
    subscribe(message, callback) {
        // 如果对象元素存在, 则为其创建一个空数组
        this.subs[message] = this.subs[message] ? this.subs[message] : [];
        this.subs[message].push(callback);
    }

    /**
     * 发布消息(通知订阅对象)
     * key: 订阅对象名称
     * data: 额外参数
     */
    publish(key, data) {
        if (this.subs[key]) {
            this.subs[key].forEach(callback => {
                // 执行订阅者的处理函数
                callback && callback(data);
            });
        }
    }
}
// 创建一个实例对象
const pubsub = new PubSub();

// 订阅消息message
pubsub.subscribe('message', function (data) {
 console.log('收到新短消息:', data);
});

// 发布消息, 通知订阅者
pubsub.publish('message', {
    title: '新闻标题'
});



小猴子
8楼 · 2021-01-29 13:39

vue是一个mvvm框架,即数据双向绑定,即当数据发生变化的时候,视图也就发生变化,当视图发生变化的时候,数据也会跟着同步变化。这也是算是vue的精髓之处了。值得注意的是,我们所说的数据双向绑定,一定是对于UI控件来说的,非UI控件不会涉及到数据双向绑定。单向数据绑定是使用状态管理工具的前提,如果我们使用vuex,那么数据流也是单向的,这时就会和双向数据绑定有冲突,我们可以这么解决

三岁奶猫
9楼 · 2021-01-29 13:47

在数据渲染时使用prop渲染数据
将prop绑定到子组件自身的数据上,修改数据时修改自身数据来替代prop
watch子组件自身数据的改变,触发事件通知父组件更改绑定到prop的数据
这样做的好处是:父组件数据改变时,不会修改存储prop的子组件数据,只是以子组件数据为媒介,完成对prop的双向修改。

相关问题推荐

  • 回答 120

    相对前几年来说,要高上不少了,毕竟入行的人也是越来越多了,基础的工作对应想要参与的人群基数越来越大,但是对于高端人才的需求还是很多,人才还是相对稀缺性的。所以,想要学web或者其他技术也一样,别等,别观望。web前端就业方向特别多包括web前端开发...

  • 回答 25

    相对定位和绝对定位是定位的两种表现形式,区别如下:一、主体不同1、相对定位:是设置为相对定位的元素框会偏移某个距离。2、绝对定位:absolute 脱离文档流,通过 top,bottom,left,right 定位。二、特点不同1、相对定位:在使用相对定位时,无论是否进行移...

  • 抓包是什么意思?2020-04-01 17:36
    回答 7
    已采纳

    抓包(packet capture)就是将网络传输发送与接收的数据包进行截获、重发、编辑、转存等操作,也用来检查网络安全。抓包也经常被用来进行数据截取等。抓包可以通过抓包工具来查看网络数据包内容。通过对抓获的数据包进行分析,可以得到有用的信息。目前流行的...

  • 回答 89

    常用的前端框架有Bootstrap框架、React框架、Vue框架、Angular框架、Foundation框架等等

  • 回答 65
    已采纳

    前端是目的就业前景非常不错的一个计算机技术,但是自学的话还是有一定难度的,网络上自学是碎片化的,同时互联网技术跟新换代快,自己的话比较吃力也学习不到最新的技术。

  • SSR 是什么意思?2020-03-20 18:56
    回答 6

    SSR就是一台服务器,可以利用 SSR 在远程的服务器上配置 SSR,使其能够成为 SSR 节点,这样本地电脑或者其它设备利用 SSR 节点实现 VPN 或者远程上网及游戏加速等方面。ShadowsocksR(简称 SSR)是 Shadowsocks 分支,在 Shadowsocks 的基础上增加了一些数据...

  • 回答 52
    已采纳

    计算机培训方向比较多,建议找适合自己的方向选择培训编程类:JAVA、WEB、Python、C/C++、C#等测试类:软件测试运维类:云计算、网络安全设计类:UI设计、3D建模等

  • 回答 11

    1、代码判断xAxis: {type: 'time',splitLine: {show: false},interval: 3600, // 设置x轴时间间隔axisLabel: {formatter: function(value, index) {return liangTools.unix2hm(value)}}},首先要把xAxis 显示类型设置成time,然后设置对应X轴......

  • 回答 8

    HTML5 + CSS + JavaScript 开发 跨平台重用代码 

  • 回答 4

    采用rem单位自动响应,并提供独有栅格化系统快速定义宽高、边距节省css代码量,同时总结各大型移动端网页,提供一套ui颜色搭配规范,尺寸规范,字体规范等。

  • 回答 10

    iView UI、ioni、SUI

  • 回答 6

     jQTouch 

  • 回答 4

    如果只是普通的移动端用vue react 或者dva 如果是要编译成小程序什么的或者混生 就用uni-app(对应vue语法)taro(对应react) 或者纯原生 这个没有限制的,自己怎么舒服怎么来

  • 回答 4

    因为可以运用在网页和小程序的开饭中,而且开源,用着便宜,企业都很喜欢

  • 回答 10

    一、Visual Studio Code下载地址:https://code.visualstudio.com/微软在2015年4月30日Build 开发者大会上正式宣布了 Visual Studio Code 项目:一个运行于 Mac OS X、Windows和 Linux 之上的,针对于编写现代 Web 和云应用的跨平台源代码编辑器。Visual Stud...

  • 回答 9

    jQuery自带淡入淡出效果 https://www.w3school.com.cn/jquery/jquery_fade.asp 看看这个 

没有解决我的问题,去提问