简单了解Vue2.0+的数据双向绑定

简单了解Vue2.0+的数据双向绑定

首先,我们提到MVVM双向数据绑定时,想到的先是:数据改变导致视图改变,视图改变同时数据发生改变。然后,我们紧接着就能说出Vue2的数据双向绑定是通过Object.defineProperty()方法对data中的数据进行数据劫持,转化为getter/setter,当数据变化时通知视图更新。下面我们来一步步的实现一下这个绑定过程。

回顾一下Object.defineProperty()

直接先上一个例子,了解一下Object.defineProperty()可以做些什么。

		let testName = "李四"
        let person = {
            name: testName,
            age: 23
        }

当我们输出person时,我们当然知道结果如下:
在这里插入图片描述

可是,当我们修改testName时,再次输出person时,是不是想当然的以为应该输出修改后的值?我们看一下。
在这里插入图片描述
可是,事实上却不是,我们看到的效果好像只有在初始化的时候对person.name进行了赋值。接下来我们使用Object.defineProperty()来实现一下我们认为的效果。

		let testName = "李四"
        let person = {
            name: testName,
            age: 23
        }
        Object.defineProperty(person, 'name', {
            get: function () {
                console.log("name属性被读取了");
                return testName
            },
            set: function (newVal) {
                console.log("name属性被修改了");
                val = newVal
            }
        })

person.name被访问的时候会调用get方法,被赋值时会调用set方法,我们修改输出一下:
在这里插入图片描述
很明显实现了预期的效果。而在Vue的数据双向绑定时,我们也是通过Object.defineProperty()get/set方法知道什么时候被访问,什么时候被赋值,然后通过发布-订阅的方式完成视图更新。

实现一个数据监听器(Observer)

根据上面的例子,我们首先实现一个数据监听器,用来监听数据的所有属性的变化,如有变化则通知视图更新。

		let person = {
            name: "李四",
            age: 23
        }
        let p = Observer(person)

        function Observer(obj) {
            if (!obj || typeof obj !== 'object') {
                return;
            }
            Object.keys(obj).forEach(key => {
                defineReactive(obj, key, obj[key])
            })
            return obj

        }
        function defineReactive(obj, key, val) {
            Object.defineProperty(obj, key, {
                get() {
                    console.log(`${key}属性被读取了`);
                    return val;
                },
                set(newVal) {
                    val = newVal;
                    console.log(`${key}属性被修改了`);
                }
            })
        }

在这里插入图片描述
到这里,我们这个对象的所有属性都进行了监听。

实现一个订阅器(依赖收集)

上一步,完成了对所有属性的监听,知道数据什么时候发生变化,那我们就可以在数据发生改变的时候通知依赖该数据的视图进行更新,这就是上面提到的发布订阅者模式我们需要实现一个订阅者容器,用来存放所有的订阅者,当数据发生变化时,通知对应的订阅者,执行它的更新函数。

        function defineReactive(obj, key, val) {
            let dep = new Dep()
            Object.defineProperty(obj, key, {
                get() {
                    dep.depend();
                    console.log(`${key}属性被读取了`);
                    return val;
                },
                set(newVal) {
                    val = newVal;
                    console.log(`${key}属性被修改了`);
                    dep.notify()
                }
            })
        }
        class Dep {
            constructor() {
                this.subs = []
            }
            //增加订阅者
            addSub(sub) {
                this.subs.push(sub)
            }
            //判断是否增加订阅者
            depend() {
                if (Dep.target) {
                    this.addSub(Dep.target)
                }
            }
            //通知订阅者更新
            notify() {
                this.subs.forEach(sub => {
                    sub.update()
                })
            }
        }
        Dep.target = null

实现订阅者

	class Watcher {
	    constructor(vm, exp, cb) {
	        this.vm = vm;
	        this.exp = exp;
	        this.cb = cb;
	        this.value = this.get(); // 将自己添加到订阅器的操作
	    }
	    get() {
	        Dep.target = this; // 缓存自己
	        let value = this.vm.data[this.exp] // 强制执行监听器里的get函数
	        Dep.target = null; // 释放自己
	        return value;
	    }
	    update() {
	        let value = this.vm.data[this.exp];
	        let oldVal = this.value;
	        if (value !== oldVal) {
	            this.value = value;
	            this.cb.call(this.vm, value, oldVal);
	        }
	    }
	}

vm是Vue的实例,
exp是node节点的属性值,
cb是更新函数

一个简单的订阅者完成,我们来测试一下:
在这里插入图片描述

但是在Vue2.0+中,当对对象属性进行删除或者新增或者根据索引修改数组内容时,双向绑定和响应式还是有些问题的:

let person = {
	name:"张三",
	age:15,
	hobbies:["抽烟","喝酒","烫头"]
}
delete person.name
person.sex = "男"
person.hobbies[0] = "学习"

但是可以通过Vue提供的API进行操作:Vue.set(),Vue.delete

细节正在补充中。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Vue2.0和Three.js是两个非常流行的前端技术,分别用于构建交互式的Web应用和创建动态的3D场景。结合使用Vue2.0和Three.js,可以开发出一个功能强大的3D粮仓管理系统。 这个系统源码使用Vue2.0作为前端框架,通过Vue的组件化开发模式,将界面划分为多个可复用的组件,方便管理和维护。同时,借助Vue的响应式数据绑定机制,实现了与后端数据的实时同步。 Three.js作为渲染引擎,实现了3D环境的粮仓模型的创建、渲染和交互功能。通过Three.js的API,可以创建粮仓模型的几何形状、表面材质和光影效果,并在场景展示粮仓的实时状态。 该系统源码具有以下功能: 1. 用户登录和权限管理:使用Vue的路由和组件间通信机制,实现了用户登录和权限验证的功能,确保只有具备管理权限的用户可以访问系统。 2. 粮仓管理:通过Three.js的渲染引擎,将粮仓模型以3D图形的形式展示给用户,并实现了对粮仓的实时监控和管理功能。用户可以查看粮仓的存储容量、温度、湿度等指标,并可以进行添加、删除和修改粮仓的操作。 3. 数据统计与分析:系统支持对粮仓数据进行统计和分析,包括存储容量趋势、温湿度变化等。通过可视化的图表展示,用户可以直观地了解粮仓的运营状态,并进行粮食管理的决策。 4. 报警与通知:系统实时监测粮仓的状态,如果出现异常情况(如温度过高、湿度过低等),系统将自动生成报警信息,并通过邮件或消息通知管理员,以便及时处理问题。 总之,该3D粮仓管理系统源码结合了Vue2.0和Three.js的优势,旨在提供一个直观、便捷的粮食管理工具,提高粮仓管理的效率和准确性。它不仅可以在Web端浏览器使用,还可以借助Vue的移动端适配能力,在移动设备上进行访问和管理。 ### 回答2: Vue2.0 和 Three.js 是两个非常流行的前端技术库,Vue2.0 是一个用于构建用户界面的前端框架,而 Three.js 是一个用于创建和渲染3D图形的JavaScript库。一个3D粮仓管理系统的源码,结合了这两个技术,将会非常强大和吸引人。 这个系统的主要功能是管理和监控一个3D的粮仓。它使用 Three.js 来创建和渲染3D模型,可以展示粮仓的实际布局、粮食的存储情况以及其他相关的信息。用户可以通过这个系统来了解粮仓的容量、存储的粮食种类和数量等。同时,系统还可以提供一些管理功能,比如添加、删除和修改粮食的信息。 该系统的前端界面使用 Vue2.0 构建,利用 Vue 的组件化开发方式,将系统的不同模块拆分成独立的组件,提高了代码的可维护性和可复用性。利用 Vue数据双向绑定特性,可以方便地更新和显示粮仓的实时状态和数据。 在这个系统的后端,通常会使用一个服务器来处理前端发送的请求,并与数据库进行交互,用于存储和获取粮食的相关信息。服务器端可以选择合适的后端技术,比如 Node.js、Python、PHP等,根据实际需求来选择。 综上所述,基于 Vue2.0 和 Three.js,编写一个3D粮仓管理系统的源码能够有效地展示粮仓的实际情况和管理粮食的相关信息。这个系统不仅功能实用,而且还具有良好的用户体验和可扩展性。对于粮仓管理人员来说,这个系统将大大提高工作效率和粮食管理的准确性。 ### 回答3: Vue 2.0是一种用于构建用户界面的JavaScript框架,而Three.js是一个用于创建各种3D图形的JavaScript库。通过使用Vue 2.0和Three.js,可以开发出一个功能丰富的3D粮仓管理系统。 这个系统的源码包括以下几个方面的内容: 1. 页面结构:通过Vue 2.0的组件化开发,可以将系统拆分为多个可重用的组件,例如粮仓列表、粮仓详情等。使用Vue Router实现路由管理,以实现不同页面间的切换。 2. 数据交互:通过Vue数据绑定功能,可以将前端数据与后端API进行交互。使用axios库来发送HTTP请求,从后端获取粮仓数据,并将其显示在前端页面上。同时,可以将用户对粮仓的操作(如增加、删除或更新)发送给后端。 3. Three.js集成:通过在Vue组件使用Three.js库,可以实现3D视图的渲染和交互。可以使用Three.js创建一个粮仓的3D模型,并在前端页面展示出来。可以通过鼠标或手势交互来旋转、缩放或平移视图。 4. 功能实现:通过Vue的事件机制,可以实现系统的各种功能,如搜索粮仓、排序粮仓列表、添加新的粮仓等。可以在前端页面上提供用户友好的界面,让用户方便地管理粮仓。 总结来说,这个源码是一个综合运用了Vue 2.0和Three.js的3D粮仓管理系统。它实现前端与后端的数据交互,并通过Three.js库在前端展示了3D粮仓模型。同时,它还具备了一系列功能,如搜索、排序和添加粮仓等,提供了用户友好的交互界面。通过研究源码,可以学习到Vue 2.0和Three.js的使用技巧,为开发其他类似的系统提供参考。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值