• [TypeScript] @OnChange for ngOnChanges


    Take away from NGCONF talk.

    It is a good show case to how to use decorator.

    export interface SimpleChange<T> {
      firstChange: boolean;
      previousValue: T;
      currentValue: T;
      isFirstChange: () => boolean;
    }
    
    function OnChange<T = any>(
      callback: (value: T, simpleChange?: SimpleChange<T>) => void
    ) {
      console.log("callback", callback);
    
      const cachedValueKey = Symbol();
      const isFirstChangeKey = Symbol();
    
      return (target, key) => {
    
        Object.defineProperty(target, key, {
          set: function(value) {
            if (this[isFirstChangeKey] === undefined) {
              this[isFirstChangeKey] = true;
            } else {
              this[isFirstChangeKey] = false;
            }
            // No operation if new value is same as old value
            if (!this[isFirstChangeKey] && this[cachedValueKey] === value) {
              return;
            }
    
            console.log("set value", value);
    
            const oldValue = this[cachedValueKey];
            this[cachedValueKey] = value;
            const simpleChange: SimpleChange<T> = {
              firstChange: this[isFirstChangeKey],
              previousValue: oldValue,
              currentValue: this[cachedValueKey],
              isFirstChange: () => this[isFirstChangeKey]
            };
            callback.call(this, this[cachedValueKey], simpleChange);
          },
          get: function() {
            return this[cachedValueKey];
          }
        });
      };
    }
    
    class Person {
      @OnChange<string>(function(newVal, sc) {
        this.trigger(newVal, sc)
      })
      private name: string = "wan";
    
      trigger (newVal, simpleChange) {
        console.log('newVal', newVal);
        console.log('simpleChange', simpleChange);
      }
    }
    
    const p = new Person();
    p.name = "aa"; // first time, trigger changes
    p.name = "aa"; // second time, no trigger
    p.name = "bb"; // Trogger changes

    One take away is that we can use 'symbol' to uqine key.

    const cachedValueKey = Symbol();
    
    this[cachedValueKey]
  • 相关阅读:
    HTML
    PHP正则表达式实例汇总
    PHP环境配置解释
    8.25study
    vue 封装手机验证登录组件
    vue 项目 vuetify 中 table item 按钮展示
    vue项目局部引入ant-design-vue库
    vue 组件Table组件鼠标显示效果
    vue 封装登录组件
    vue项目---编辑与新增页
  • 原文地址:https://www.cnblogs.com/Answer1215/p/10846496.html
Copyright © 2020-2023  润新知