您的位置:

Vue实现响应式动态数据绑定

一、Vue的响应式数据原理

Vue.js是一款构建用户界面的渐进式框架,Vue.js采用MVVM模式(Model-View-ViewModel),核心是实现了数据双向绑定。

Vue中是如何实现数据绑定的呢?当Vue实例中的数据发生改变时,Vue会自动触发某些操作来更新页面上的数据,这其中的核心原理是Vue利用了ES6中的Object.defineProperty()方法来实现数据观测(数据代理),从而实现了双向数据绑定。

在Vue中,每个Vue实例都会对应一个单独的Watcher实例,用于监听数据的变化;而每个Watcher实例都会对应一个单独的Dep实例,用于存储Watcher实例,同时当数据发生改变时会通知所有存储在Dep实例中的Watcher实例。以下是Vue的响应式数据原理的示意图:

    
    // 示例代码
    var data = {price: 100, quantity: 2}
    
    function defineReactive(obj, key, val) {
        var dep = new Dep()
        Object.defineProperty(obj, key, {
            enumerable: true,
            configurable: true,
            get: function() {
                if (Dep.target) {
                    dep.addSub(Dep.target)
                }
                return val
            },
            set: function(newVal) {
                if (val === newVal) {
                    return
                }
                val = newVal
                dep.notify()
            }
        })
    }
    
    function observe(data) {
        if (!data || typeof data !== 'object') {
            return
        }
        Object.keys(data).forEach((key) => {
            defineReactive(data, key, data[key])
        })
    }
    
    class Dep {
        constructor() {
            this.subs = []
        }
        addSub(sub) {
            this.subs.push(sub)
        }
        notify() {
            this.subs.forEach((sub) => {
                sub.update()
            })
        }
    }
    
    class Watcher {
        constructor(vm, exp, cb) {
            this.vm = vm
            this.exp = exp
            this.cb = cb
    
            Dep.target = this
            this.value = this.get()
            Dep.target = null
        }
        get() {
            var value = this.vm
            this.exp.split('.').forEach((key) => {
                value = value[key]
            })
            return value
        }
        update() {
            this.cb.call(this.vm, this.get())
        }
    }
    
    var vm = observe(data)
    
    new Watcher(vm, 'price', function() {
        console.log('price变化了')
    })
    
    data.price = 200 // price变化了
    

二、Vue的动态数据绑定

动态绑定是Vue中的重要功能之一,通过它,我们可以在页面上动态地改变数据,而不需要刷新整个页面。在Vue中使用动态数据绑定非常简单,只需要在数据引用的位置加上双花括号{{}}就可以了。

    
    // 示例代码
    
   
{{message}}
var vm = new Vue({ el: '#app', data: { message: 'Hello, world!' } })

上述代码中,我们将Vue实例中的message数据,绑定到了页面上的{{message}}中。当我们修改message的值时,页面中{{message}}的内容也会相应地更新,这就是Vue实现数据动态绑定的效果。

三、Vue的响应式数据绑定应用场景

Vue的响应式数据绑定可以应用于多种场景中,下面我们来介绍其中的两种常见场景。

1、表单验证

    
    // 示例代码
    
   
<input type="text" v-model="name" required> <input type="email" v-model="email" required>
var vm = new Vue({ el: '#app', data: { name: '', email: '', }, computed: { isValid: function() { return this.name.trim() !== '' && this.email.trim() !== '' } } })

在上述代码中,我们用到了Vue的计算属性computed,来实现表单验证功能。当我们在输入框中输入内容时,计算属性会根据输入框中的值来计算是否禁用提交按钮,如果输入框中的值为空,那么提交按钮就会被禁用。

2、动态样式

    
    // 示例代码
    
   
var vm = new Vue({ el: '#app', data: { isActive: true } })

在上述代码中,我们用到了Vue的动态绑定class属性的功能。当isActive的值为true时,div标签会自动添加active类,从而实现样式的动态切换。

Vue实现响应式动态数据绑定

2023-05-18
Vue事件绑定原理

2023-05-21
Vue动态绑定style详解

2023-05-20
Vue数据绑定

2023-05-20
Vue数据绑定详解

2023-05-24
使用Vue动态绑定数据来实现下拉框 - 一个简易教程

2023-05-16
和js双向绑定实例相关的问题,vuejs双向绑定原理

本文目录一览: 1、AngularJS双向绑定的选择,解决方法? 2、实现双向数据绑定 3、AngularJS的数据双向绑定是怎么实现的 4、js中的双向数据绑定是什么意思 5、Vue.js入门教程(

2023-12-08
数据绑定(Databinding)

2023-05-19
js简单双向绑定案例代码(js如何实现双向绑定)

本文目录一览: 1、实现双向数据绑定 2、js实现数据双向绑定 3、vuejs怎样实现列表中checkbox的双向绑定及初始化渲 4、Vue.js入门教程(三)双向绑定和数据渲染 5、vuejs怎样实

2023-12-08
vuejs源码学习笔记一(看懂vue源码)

本文目录一览: 1、深入浅出Vue.js--变化侦测 2、Vue学习系列一 —— MVVM响应式系统的基本实现原理 3、.vue文件怎么写js代码 4、认识Vue.js+Vue.js的优缺点+和与其他

2023-12-08
Vue笔记详解

2023-05-24
双向数据绑定原理详解

2023-05-18
Vue3响应式原理详解

2023-05-16
Vue.js实现数据绑定 - 让你的网站更强大

2023-05-18
Vue 响应式框架入门指南

2023-05-16
Vue绑定样式指南

2023-05-17
Vue Click事件绑定实例及使用方法

2023-05-17
Vue动态添加样式

2023-05-18
js双向绑定实例是什么,js如何实现双向绑定

2022-11-23
Vue动态样式详解

2023-05-19