当前位置: 首页 > news >正文

响应式数据

概念

如果内存中的数据变化了 页面UI也会动态跟着刷新  这种数据就是响应式数据

响应式数据设计原理:

vue2.0 采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter(原型上的属性决定属性的值),在数据变动时发布消息给订阅者,触发相应监听回调。当把一个普通 Javascript 对象传给 Vue 实例来作为它的 data 选项时,Vue 将遍历它的属性,用 Object.defineProperty 将它们转为 getter/setter。用户看不到 getter/setter,但是在内部它们让 Vue 追踪依赖,在属性被访问和修改时通知变化。

vue3.0 --使用es6 proxy 代理了data对象

响应式数据实现的基础得益于ES6新出的语法Object.defineProperty()创建对象。

Object.defineProperty()的完整写法:

Object.defineProperty(obj,name,{
        set(){}
        get(){}
    })

 参数解析:

obj为我们自己创建的对象,在这里就是用这个对象来劫持传入对象数据源中的各个属性;

name为我们设置的属性名;

set(){} 将于自己给属性设置值时触发;
get(){}  将于访问属性时触发,它的返回值就是我们访问属性得到的值。

当然我们也可以用其它方法劫持传入对象的属性,但是其它方法只能劫持不能实现响应式数据,即改变数据时不能实现页面同时刷新。

用代码简单实现这个功能:

  <div id="box">
        <h1 id="title"></h1> 
        <p id="msg"></p>
    </div>
    <script>
        //封装函数
        function myVue(obj){
            let myvue={}
            //得到传入对象data的全部属性
            let arr=Object.keys(obj.data)
            console.log(arr);
            for (let i = 0; i < arr.length; i++) {
                Object.defineProperty(myvue,arr[i],{
                    set(v){
                        obj.data[arr[i]]=v
                        //响应
                            let title=document.querySelector(obj.el+" #title")
							 let msg=document.querySelector(obj.el+" #msg")
							 title.innerHTML=myvue["title"]
							 msg.innerHTML=myvue["msg"]
                    },
                    get(){
                        return  obj.data[arr[i]]
                    }
                })
                //赋值时调用set方法
                myvue[arr[i]]=obj.data[arr[i]]
            }
           return myvue
        }


        //我们传入的对象,传入myVue后各个属性将会被我们的vue对象劫持
        let obj={
            el:"#box",
            data:{
                title:"mytitle",
                msg:"mymsg"
            }
        }
       var myvue= new myVue(obj)
    </script>

补充一点:

Vue框架劫持对象的属性的值是数组时,数组的下标时不能被劫持的,但是可以劫持数组的方法。所以通过方法修改值。如:

 this.arr[2]="hello"//没有劫持数组的下标(不能刷新页面)
 this.arr.splice(2,1,"hello")//劫持了数组的方法(可以刷新页面)

 此外Vue框架还给我们提供了一个方法:Vue.set(this.arr对象,下标,修改的值)

也可以通过原型上的方法:this.$set(this.arr对象,下标,修改的值)

双向数据绑定

1、如果数据容器中的数据变了也会让页面刷新(dom操作让页面改变);

2、如果用户操作dom,改变了页面,反之也会让数据容器中的数据的值改变。

1是响应式数据原理我们已经实现了,在基础上加上2,我们就形成了双向数据绑定。

1基础上 将MVVM作为数据绑定的入口,整合Observer,Compile和Watcher三者,通过Observer来监听自己的model的数据变化,通过Compile来解析编译模板指令(vue中是用来解析 {{}}),最终利用watcher搭起observer和Compile之间的通信桥梁,达到数据变化 —>视图更新;视图交互变化(input)—>数据model变更双向绑定效果。

Vue中通过v-model指令实现了双向数据绑定

写一个例子:

<div id="box">
        {{msg}}
        <input type="text"  v-model="msg">
    </div>
    <script>
        new Vue({
            el:"#box",
            data:{
                msg:"mymsg"
            }
        })
    </script>

当我们在标签中修改值时,会动态修改数据源中的数据同步渲染到页面上。
 

相关文章:

  • Ubuntu 上 Mediapipe 运行Hello World! on Android例子
  • OpenGL ES 版本介绍
  • 猿创征文|中国移动 OneOS 万耦启物开发板支持包(BSP)
  • PyMol作图:同时显示“Cartoon“ + “Surface“
  • SpringBoot整合Flowable工作流引擎框架
  • 七大排序之快速排序
  • vi vim 笔记心得2209010344
  • 忘记电脑密码的解决方法——使用pe工具重置电脑密码
  • 如何避免死锁呢?
  • Fedora36启用root,并且root直接通过ssh远程连接 2209010539
  • Slipped Conditions
  • 嵌套管程锁死
  • 图解LeetCode——1475. 商品折扣后的最终价格(难度:简单)
  • Java中的锁详解说明
  • GPIO相关介绍
  • 2017-08-04 前端日报
  • Angular 响应式表单之下拉框
  • AngularJS指令开发(1)——参数详解
  • Angular数据绑定机制
  • js
  • MySQL数据库运维之数据恢复
  • select2 取值 遍历 设置默认值
  • spring boot 整合mybatis 无法输出sql的问题
  • webgl (原生)基础入门指南【一】
  • 测试如何在敏捷团队中工作?
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 我的面试准备过程--容器(更新中)
  • 终端用户监控:真实用户监控还是模拟监控?
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • PostgreSQL之连接数修改
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (分布式缓存)Redis持久化
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (一)Thymeleaf用法——Thymeleaf简介
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • .Net 6.0 处理跨域的方式
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .NET Core 中的路径问题
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .net反编译的九款神器
  • .NET中的十进制浮点类型,徐汇区网站设计
  • [2023年]-hadoop面试真题(一)
  • [22]. 括号生成
  • [AIGC] MySQL存储引擎详解
  • [Android]使用Retrofit进行网络请求