原生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裏面的視圖會得到響應發生變化
這就是響應式與數據驅動的魅力。

最後效果

在這裏插入圖片描述

歡迎大家評論轉發,轉發請註明出處。

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