vue2.x双向数据绑定原理解析

vue2.x双向数据绑定原理解析

什么是双向数据绑定

双向数据绑定是指视图层和数据层之间的数据同步。当数据层中的数据发生变化时,视图层会自动更新;反之,当视图层中用户操作修改了数据时,数据层的数据也会自动更新。

通常而言,双向数据绑定有两种方式,一种是脏值检测(angular.js),另一种则是数据劫持(vue.js)。

本文将介绍 vue2.x 中的数据劫持实现双向数据绑定的原理。

vue2.x 数据劫持实现原理

vue2.x 使用了 Object.defineProperty() 方法来对数据层进行劫持。

下面是一个简单的例子(仅用于说明原理,实际使用中不建议这样写):

let obj = {};
let value;
Object.defineProperty(obj, 'name', {
    get() {
        console.log('get')
        return value;
    },
    set(newValue) {
        console.log('set');
        console.log(`old value:${value}`)
        value = newValue;
        console.log(`new value:${value}`)
    }
})
obj.name = 'vue';
console.log(obj.name);

上述代码中,我们通过 Object.defineProperty() 方法来对 obj 对象的 name 属性进行劫持,当我们执行 obj.name = 'vue' 时,会触发 set 方法,当我们获取 obj.name 的值时,会触发 get 方法。

基于以上例子,我们可以看到,我们通过 Object.defineProperty() 方法来监听了数据的变化,那么我们要如何实现视图层的自动更新呢?

实现视图的自动更新

实现视图层的自动更新是本原理的关键。vue2.x 使用了发布-订阅模式来实现数据发生变化时视图的自动更新。

我们来看一个例子:

class Dep {// 订阅器
    constructor() {
        this.subs = [];
    }
    // 添加订阅
    addSub(sub) {
        if (sub && sub.update) {
            this.subs.push(sub);
        }
    }
    // 发布消息
    notify() {
        this.subs.forEach(sub => {
            sub.update()
        })
    }
}
class Watcher {// 观察者
    constructor() {
        Dep.target = this;
    }
    // 更新视图
    update() {
        console.log("update view");
    }
}
Dep.target = null;
let obj = {};
let value;
let dep = new Dep();
Object.defineProperty(obj, 'name', {
    get() {
        console.log('get')
        // 添加订阅者
        if (Dep.target) {
            dep.addSub(Dep.target)
        }
        return value;
    },
    set(newValue) {
        console.log('set');
        console.log(`old value:${value}`)
        value = newValue;
        console.log(`new value:${value}`)
        // 发布通知
        dep.notify();
    }
})
new Watcher();
obj.name = 'vue';

在上述代码中,我们首先创建了订阅器 Dep 和观察者 Watcher。

当我们获取 obj 对象的 name 属性值时,会触发 get 方法,我们通过 Dep.target = this 来在获取时将观察者 Watcher 添加到了订阅器 Dep 中。当值发生变化时,则会触发 set 方法,通过 dep.notify() 来发布通知,订阅器 Dep 中的每一个观察者 Watcher 就会收到通知并更新视图。

示例

我们来看两个实际的示例来进一步理解。

示例一

html 代码:

<div id="app">
    <input type="text" v-model="name">
    <p>{{name}}</p>
</div>

js 代码:

var app = new Vue({
    el: "#app",
    data() {
        return {
            name: ""
        }
    }
})

在上述示例中,我们通过 v-model="name" 来绑定输入框与 data 中的 name 属性。当我们在输入框中输入值时,输入框中显示的值和 p 标签中显示的值会自动同步更新。

示例二

html 代码:

<div id="app">
    <p>{{name}} </p>
    <button v-on:click="updateName"> 更新值 </button>
</div>

js 代码:

var app = new Vue({
    el: "#app",
    data() {
        return {
            name: "vue"
        }
    },
    methods: {
        updateName() {
            this.name = "vue2.x"
        }
    }
})

在上述示例中,我们通过 v-on:click="updateName" 来绑定按钮的 click 事件与 updateName 方法。当我们点击按钮时,会自动触发 updateName 方法,将 data 中的 name 属性的值更新为 "vue2.x",视图页面中与 name 属性绑定的 p 标签也会自动更新。

至此,本文介绍了 vue2.x 实现双向数据绑定的原理和实现方式,并通过两个示例来展现了实际应用中的具体使用方法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue2.x双向数据绑定原理解析 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • 组件库中使用 vue-i18n 国际化的案例详解

    使用Vue-i18n实现国际化的过程大体可以分为以下几个步骤: 安装并配置Vue-i18n 首先需要安装Vue-i18n,可使用npm命令进行安装: npm install vue-i18n –save 然后在项目中创建一个i18n.js文件,用于Vue-i18n的配置: import Vue from ‘vue’ import VueI18n from …

    Vue 2023年5月28日
    00
  • Vue 框架之键盘事件、健值修饰符、双向数据绑定

    Vue 框架之键盘事件、健值修饰符、双向数据绑定 键盘事件 Vue 中可以通过 v-on 指令来绑定 DOM 事件,在处理键盘事件时也不例外。我们可以使用 Vue 提供的 @keydown 和 @keyup 来绑定键盘事件,比如: <template> <div> <p>按下的键盘键是:{{key}}</p> …

    Vue 2023年5月27日
    00
  • webpack4打包vue前端多页面项目

    关于“webpack4打包vue前端多页面项目”的攻略,我会从以下几个方面进行详细讲解: 安装webpack及相关依赖 配置webpack 多页面配置 示例说明 下面我们将一步一步进行讲解。 1. 安装webpack及相关依赖 首先,我们需要全局安装webpack和webpack-cli,这里我使用的是webpack4版本: npm install webp…

    Vue 2023年5月28日
    00
  • vue-cli中的:visible.sync是什么意思

    在Vue-cli中,:visible.sync 是一个指令,用于实现父组件与子组件之间的双向绑定。通过这个指令,可以实现在父组件中改变子组件的状态,并且子组件中的状态改变也能反映到父组件中。 下面是这个指令的应用示例: <!– 父组件 –> <template> <div> <child-component :v…

    Vue 2023年5月27日
    00
  • Vue中函数防抖节流的理解及应用实现

    Vue中函数防抖节流的理解及应用实现 在Vue中,函数防抖(debounce)和函数节流(throttle)是常用的一些技巧。 函数防抖(Debounce) 基本概念 在前端开发中,有些事件会频繁地触发,如窗口大小的改变、搜索框的输入等等。如果我们在这类事件的回调函数中添加一些比较耗时的操作,就会影响页面的性能和用户体验。 函数防抖的原理是,在事件被触发n秒…

    Vue 2023年5月28日
    00
  • vue静态配置文件不进行编译的处理过程(在public中引入js)

    那么首先我们来介绍一下什么是Vue静态配置文件。Vue.js是一个用于构建用户界面的JavaScript框架,它允许我们在单个页面应用程序中创建可重用的组件。在Vue中,我们有一个叫做Vue CLI的工具,可以用它来配置我们的Vue项目,包括路由、Webpack等,其中就包括了Vue的静态配置文件。 Vue的静态配置文件是指在项目的根目录下的vue.conf…

    Vue 2023年5月28日
    00
  • 基于vue如何发布一个npm包的方法步骤

    发布一个基于 vue 的 npm 包的步骤,可以分为以下几个步骤: 1. 初始化 npm 包 npm init 按照提示依次输入各个信息,最后生成 package.json 文件。 2. 创建 vue 组件 这里以一个 Button 组件为例: <template> <button :class="classObject&quot…

    Vue 2023年5月28日
    00
  • vue中定时器setInterval的使用及说明

    关于“vue中定时器setInterval的使用及说明”的完整攻略,具体内容如下: 概述 JavaScript中的setInterval函数可以用来设置定时器,定时执行一些操作。在Vue.js中,我们也可以使用setInterval函数来实现类似的定时操作。本篇攻略主要介绍如何在Vue.js中使用setInterval函数。 使用方法 在Vue.js中,我们…

    Vue 2023年5月29日
    00
合作推广
合作推广
分享本页
返回顶部