zoukankan      html  css  js  c++  java
  • Vue发布-订阅者模式

    1、vue响应原理:

    vue.js采用数据劫持结合发布-订阅者模式,通过Object.defineProperty()来劫持data中各个属性的setter、getter,在数据变动时,发布消息给订阅者,触发响应的监听回调。

    (setter和getter是对象的存储器属性,是一个函数,用来获取和设置值)

    2、发布-订阅者模式的作用:

    处理一对多的场景,应用于不同情况下的不同函数调用

    优点:低耦合性,易于代码维护;

    缺点:若订阅的消息未发生,需消耗一定的时间和内存。

    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
        <meta charset="UTF-8">
        <title>Vue发布-订阅模式</title>
    </head>
    <body>
        <div id="app">
            订阅试图-1:<span class="box-1">第一个值</span>
            订阅试图-2:<span class="box-2">第二个值</span>
        </div>
        <script>
            //订阅器模型
            var Dep = {
                list: {},
                listen: function (key, fn) {
                    (this.list[key] || (this.list[key] = [])).push(fn);
                },
                trigger: function () {
                    var key = Array.prototype.shift.call(arguments);
                    fns = this.list[key];
                    if (!fns || fns.length == 0) return;
                    for (var i = 0, fn; fn = fns[i++];) {
                        fn.apply(this, arguments);//发布消息附带的参数
                    }
                }
            };
    
            //劫持的方法 Object.defineProperty方法,给对象的属性赋值
            var dataHijack = function ({ data, tag, datakey, selector }) {
                debugger
                var value = '';
                el = document.querySelector(selector);
                Object.defineProperty(data, datakey, {
                    //拿到数据
                    get: function () {
                        console.log('我获取到值了');
                        return value;
                    },
                    //设置数据
                    set: function (newVal) {
                        console.log('我设置值了');
                        value = newVal;
                        Dep.trigger(tag, newVal); //发布消息,更新变化
                    }
                })
                //绑定观察者
                Dep.listen(tag, function (text) {
                    el.innerHTML = text;
                })
            };
    
            var dataObj = {}; //数据
            //数据劫持
            dataHijack({
                data: dataObj,
                tag: 'view-1',
                datakey: 'one',
                selector: '.box-1'
            });
            dataHijack({
                data: dataObj,
                tag: 'view-2',
                datakey: 'two',
                selector: '.box-2'
            });
        </script>
    </body>
    </html>
            // jquery中的发布-订阅者
            //创建一个事件池 $.Callback()
            let $pond= $.Callback();
            $('.submit').click(function(){
                //发布  点击的时候通知事件池中的方法执行,同时传递实参
                $pond.fire(100,200);
            });
            
            let fn1=function(){console.log(1)}
            let fn2=function(){console.log(2)}
            let fn3=function(n,m){console.log(3,n+m)}
    
            //把需要做的事情添加到事件池中
            //事件池相当于一个登记册,把所有订阅者收集到上面
            $pond.add(fn1);
            $pond.add(fn2);
            $pond.add(fn3);            
  • 相关阅读:
    【PHP】php重写session的存储机制
    【Javascript】原生js 全特效微博发布面板效果实现
    【Javascript】原生js百叶窗效果的实现及原理介绍
    【jQuery】jquery全屏滚动插件【fullPage.js】API 使用方法总结
    从百度音乐和酷狗音乐的分类想到的
    jQuer __Ajax DOM
    面向对象闭包 继承
    Git
    设计模式
    html5标签大全
  • 原文地址:https://www.cnblogs.com/annie211/p/12629539.html
Copyright © 2011-2022 走看看