【发布时间】:2018-02-02 23:26:35
【问题描述】:
我想使用withPropsOnChange根据传入的props创建一个新的debounced函数。如果props改变了,它应该创建一个新函数。 withPropsOnChange 似乎非常适合这个,除了我需要在 createProps 回调中访问 this.state,而 recompose 不提供。
有哪些选择?即我如何创建一个属性(React 或 vanilla),它取决于/依赖于其他一些属性,并在这些属性更新时自动更新?
这是我现在所掌握的要点:
class MyClass extends React.PureComponent {
constructor(props) {
super(props);
this.state = {
isOpen: false,
isLoading: 0,
isWaiting: false,
searchQuery: '',
options: [],
value: undefined,
highlightedValue: undefined,
scrollPos: 0,
};
if(props.options) {
this.loadOptions = Lo.debounce(searchQuery => {
this.setState(state => ({
isLoading: state.isLoading + 1,
}));
props.options(searchQuery).then(result => {
this.setState(state => ({
isLoading: state.isLoading - 1,
options: result.options,
}));
});
}, props.delay);
}
}
}
如您所见,我定义了一个名为this.loadOptions 的属性,它只是props.options 的去抖动副本,并带有一些状态处理。
目前这可以正常工作,但如果上游修改了props.options 或props.delay,那么this.loadOptions 不会更新,因为我只在构造函数中执行此操作。
现在我可以在componentWillUpdate 中再次执行所有这些操作,但实际上我只想在更新props.options 或props.delay 时执行此操作,因为这是它仅有的两个依赖项。
我只是在寻找一种更简洁的设计模式来处理这类事情。现在我考虑它基本上只是“计算属性”(但我不能根据需要“重新计算”它——除非修改了这些属性,否则我每次都需要返回相同的实例)。
【问题讨论】:
-
100k 声望和这么低质量的标题?
-
@slick ¯\_(ツ)_/¯ 它包含所有重要的关键字。我已经更新了标题。
-
不要担心,不要冒犯马克,一切都好! :)
-
你能不能写一些伪代码来进一步解释程序的流程/逻辑应该是怎样的?或者关于用例的更多细节。我看不出问题出在哪里。但这很可能只是我的大脑迟钝。
-
@jonahe 我用更具体的例子更新了这个问题。