原生js实现响应式,数据驱动

响应式编程与数据驱动概览

什么是响应式编程:

响应式编程:(Reactive Programming 或称反应式编程)是一种流行的编程方法,编写代码是基于对变化的反应。

响应式编程的优点:

执行的代码和执行的线程是分开的。这种方式在服务端的架构里面有很大的意义,只保留一个线程处理程序进程层面的代码,跟Node.js很相似。如果这个线程被阻塞的话,那整个服务器就不会再处理其他请求了。因此,在JavaScript中,每个调用在一开始的时候就是异步执行,在任何情况下都可以通过响应式的API或者其他有用的抽象方式,来解决回调地狱的问题。

数据驱动

数据驱动:是指视图是由数据驱动生成的,对视图的修改,不会直接操作 DOM,而是通过修改数据。相比较传统的前端开发,如 jQuery 前端库直接修改 DOM,大大简化了代码量。特别是当交互复杂的时候,只关心数据的修改会让代码的逻辑变的非常清晰,因为 DOM 变成了数据的映射,所有的逻辑都是对数据的修改,而不用触碰 DOM,这样代码也利于维护。

原生js实现响应式,数据驱动

实现原理及思路

利用发布订阅模式,建立一个订阅器模型,写一个劫持方法,加上观察者模式,利用 js 的Object.defineProperty方法,劫持当前数据,观察到数据发生了变化之后,使用set去改变数据,被订阅的视图相对应的去改变。

第一步:建立订阅器模型

// 订阅器模型
var Dep = {
    clientList: {},
    listen: function (key, fn) {
        if (!this.clientList[key]) {
            this.clientList[key] = [];
        }
        this.clientList[key].push(fn);
    },
    trigger: function () {
        var key = Array.prototype.shift.call(arguments),
            fns = this.clientList[key];
        if (!fns || fns.length === 0) {
            return false;
        }
        for (var i = 0, fn; fn = fns[i++];) {
            fn.apply(this, arguments);
        }
    }
};

建立劫持方法

// 劫持方法
var dataHijack = function ({ data, tag, datakey, selector }) {
    var value = '',
        el = document.querySelector(selector);
    // 数据劫持
    Object.defineProperty(data, datakey, {
        get: function () {
            console.log('我获取到值了');
            return value;
        },
        set: function (newValue) {
            console.log('我设置值了');
            value = newValue;
            Dep.trigger(tag, newValue);
        }
    });
    // 绑定观察者
    Dep.listen(tag, function (text) {
        el.innerHTML = text;
    });
}

调用

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>demo</title>
</head>

<body>
    <div id="app">
        订阅视图-1<span class="box-1"></span>
        订阅视图-2<span class="box-2"></span>
    </div>
    <script src="index.js"></script>
    <script>
        // 数据
        var dataObj = {};
        // 数据劫持
        dataHijack({
            data: dataObj,
            tag: 'view-1',
            datakey: 'one',
            selector: '.box-1'
        });
        dataHijack({
            data: dataObj,
            tag: 'view-2',
            datakey: 'two',
            selector: '.box-2'
        });
        // 初始化赋值
        dataObj.one = 'one';
        dataObj.two = 'two';
    </script>
</body>

</html>

响应式效果展示

操作说明

蓝色框是取值,红色框是设置值。
直接在控制台修改,html里面的视图会得到响应发生变化
这就是响应式与数据驱动的魅力。

最后效果

在这里插入图片描述

欢迎大家评论转发,转发请注明出处。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章