代码之家  ›  专栏  ›  技术社区  ›  Armeen Moon

如何将内部setState函数重构为静态类方法?

  •  0
  • Armeen Moon  · 技术社区  · 6 年前

    我想重构内部 fn 属于 this.setState(fn) Utils 班级, Utils.createTargetDict . 我不知道怎么弄到那辆车 target 参数的参数来自 register 进入我新创建的 . 我想这是一个FP技术需要咖喱,但我就是不明白。

    import React from 'react';
    
    class MyComponent extends React.Component {
      constructor(props) {
        super(props);
        this.state = {targets: {}}
      }
    
      get engine() {
        return {
          state: this.state,
          register: target => {
            this.setState(ps => {
              return {
                targets: {
                  ...ps.targets,
                  ...Utils.createElement(target),
                },
              };
            });
          },
        }
      }
    }
    
    const myComp = new MyComponent();
    const engi = myComp.engine;
    engi.register({current: {foo: '1', bar: 'a'}}); 
    

    register: target => {
      this.setState(ps => {
        return {
          targets: {
            ...ps.targets,
            ...Utils.createElement(target),
          },
        };
      });
    },
    

    收件人:

    register: target => {
      this.setState(Utils.createTargetDict);
    },
    

    公用事业

    class Utils {
      static createTargetDict(ps) {
        return {
          targets: {
            ...ps.targets,
            ...Utils.createElement(target), // this will fail bc target doesn't exist
          },
        };
      }
      static key() {
        let d, r;
        return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {
          r = (new Date().getTime() + Math.random() * 16) % 16 | 0;
          d = Math.floor(d / 16);
          return (c === 'x' ? r : (r & 0x3) | 0x8).toString(16);
        });
      }
    
      static createElement(target) {
        const key = Utils.key();
        return {
          [key]: {
            ...target,
            current: {
              ...target.current,
              key: key,
              visibility: false,
            },
          },
        };
      }
    }
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Matthew Herbst    6 年前

    您可以将函数包装为闭包来完成此操作(请注意,我稍微更改了方法名称,以显示我们正在生成一个函数):

    MyComponent公司

    register: target => {
      this.setState(Utils.getCreateTargetDict(target));
    },
    

    公用事业

    class Utils {
      static getCreateTargetDict(target) {
        return (ps) => {
          return {
            targets: {
              ...ps.targets,
              ...Utils.createElement(target),
            },
          };
        };
      }
    }