• 使用 Proxy | Reflect 做数据劫持 | 全局数据监听


    使用 Proxy | Reflect 做数据劫持 | 全局数据监听

    >  使用demo

    import globalData from './globalData'
    
    const {userInfo} = globalData
    userInfo.watch('name', str =>{
        console.log('My name is:',str)
    })
    userInfo.name = 'xxxxxxx'

    > globalData.js

    import _event from "./event";
    
    const validator = {
      set: function (target, prop, value) {
        target.emit(prop, value);
        return Reflect.set(...arguments);
      },
      get: function () {
        return Reflect.get(...arguments);
      },
    };
    const creat = (defaultData = {}) => {
      return new Proxy(
        Object.assign(Object.create(_event), defaultData),
        validator
      );
    };
    
    const globalData = {
      userInfo: creat({}),
    };
    
    export default globalData;

    > event.js

    function Events() {
        // 放置所有添加的 监听事件
        this._events = {};
    }
    Events.prototype = {
        on: function (name, fn, ...argOrg) {
            // 必传参数验证
            if (!name || !fn) {
                throw new Error(`[Events TypeError] Failed to execute 'Events' on '${name}' : 2 arguments required`);
            }
            // 阻止重复添加相同的监听
            let fns = this._events[name] || [];
            if (fns.find((item) => item.fnOrg === fn)) {
                return;
            }
            this._events[name] = fns.concat({
                fn: (arg) => fn.apply(null, [...argOrg, ...arg]),
                fnOrg: fn
            });
        },
        watch() {
            this.on(...arguments);
        },
        once: function (name, fn, ...argOrg) {
            const onFn = (...arg) => {
                fn.apply(null, arg);
                this.off(name, onFn);
            };
            this.on(name, onFn, ...argOrg);
        },
        emit: function (name, ...arg) {
            (this._events[name] || []).forEach((item) => {
                item.fn(arg);
            });
        },
        off: function (name, fn) {
            // 无参数 : 清掉所有监听
            if (!arguments.length) {
                this._events = Object.create(null);
            }
            // 一个参数 : 清掉该事件名下所有监听
            if (arguments.length == 1) {
                delete this._events[name];
            }
            let fns = this._events[name];
            if (!fns || !fns.length) return;
            this._events[name] = (fns || []).filter((item) => {
                return item.fnOrg !== fn;
            });
        }
    };
    export default new Events();
  • 相关阅读:
    tomcat8.5配置redis实现session共享(tomcat-redis-session-manager-master)
    HDU4292(KB11-H 最大流)
    HDU4280(KB11-G 最大流)
    POJ1149(最大流)
    POJ3281(KB11-B 最大流)
    POJ3436(KB11-A 最大流)
    Codeforces841B
    Codeforces841A
    HDU2255(KB10-K 二分图最大权匹配)
    HDU1281(KB10-D 二分图最大匹配)
  • 原文地址:https://www.cnblogs.com/tommymarc/p/12915026.html
Copyright © 2020-2023  润新知