如何将内部 setState 函数重构为静态 class 方法?
How to refactor an inner setState function into a static class method?
我想将 this.setState(fn)
的内部 fn
重构为位于 Utils
class、Utils.createTargetDict
中的静态方法。我想不通如何将 register
中的 target
参数的参数获取到我新创建的 Utils.createTargetDict
中。我这是一个 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);
},
Utils
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,
},
},
};
}
}
您可以将函数包装在闭包中来执行此操作(注意我稍微更改了方法名称以表明我们正在生成一个函数):
我的组件
register: target => {
this.setState(Utils.getCreateTargetDict(target));
},
工具
class Utils {
static getCreateTargetDict(target) {
return (ps) => {
return {
targets: {
...ps.targets,
...Utils.createElement(target),
},
};
};
}
}
我想将 this.setState(fn)
的内部 fn
重构为位于 Utils
class、Utils.createTargetDict
中的静态方法。我想不通如何将 register
中的 target
参数的参数获取到我新创建的 Utils.createTargetDict
中。我这是一个 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);
},
Utils
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,
},
},
};
}
}
您可以将函数包装在闭包中来执行此操作(注意我稍微更改了方法名称以表明我们正在生成一个函数):
我的组件
register: target => {
this.setState(Utils.getCreateTargetDict(target));
},
工具
class Utils {
static getCreateTargetDict(target) {
return (ps) => {
return {
targets: {
...ps.targets,
...Utils.createElement(target),
},
};
};
}
}