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);            
  • 相关阅读:
    虚函数和纯虚函数
    函数指针
    const成员函数
    随笔
    Myeclipse/eclipse的Web project改写成Maven项目
    Maven项目配置不接文件名
    Tomcat需要更改三个端口,才能在一台机器上搭载多个tomcat
    maven错误:Project configuration is not up-to-date with pom.xml
    Failed to execute goal on project MakeFriends: Could not resolve dependencie The POM for .chengpai.jtd:jtd-service-api:jar:1.0-SNAPSHOT is missing, no dependency information available
    编译器问题:运行maven,报错-Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME environment variable and mvn script match.
  • 原文地址:https://www.cnblogs.com/annie211/p/12629539.html
Copyright © 2011-2022 走看看