这将是Refract 的一个很好的用例!
第一步是将输入拉出到一个单独的组件中:
const Input = ({ onChange, value }) => (
<input type="text" value={value} onChange={onChange} />
)
下一步是用 Refract 的withEffects
高阶组件包装这个组件,用 ahandler
和 anaperture
来处理这样的副作用:
import { withEffects } from 'refract-rxjs'
import { debounceTime } from 'rxjs/operators'
const Input = ({ onChange, value }) => (
<input type="text" value={value} onChange={onChange} />
)
const aperture = () => component =>
component.observe('value').pipe(debounceTime(300))
const handler = ({ onUpdate }) => value => onUpdate(value)
const DebouncedInput = withEffects(handler)(aperture)(Input)
Anaperture
可让您观察组件的props。在这种情况下,观察value
props是有意义的- 每次value
更改时,component.observe('value')
流都会获得一个新值。
这handler
是一个函数,每个值都由光圈的流输出。在这种情况下,去抖动的值会直接传递给名为 的新propsonUpdate
。
文档中详细解释了孔径和处理程序 -观察 React介绍了孔径,处理效果解释了处理程序。
作为您将如何使用它的示例:
class Search extends React.Component {
state = { debounced: '', search: '' }
onSearch = e => this.setState({ search: e.target.value })
onUpdate = debounced => this.setState({ debounced })
render() {
return (
<div>
<DebouncedInput
type="text"
value={this.state.search}
onChange={this.onSearch}
onUpdate={this.onUpdate}
/>
<div>debounced value: {debounced}</div>
</div>
)
}
}
使用此代码,文本DebouncedInput
将立即显示用户的输入(这是 UX 的理想选择),同时消除调用onUpdate
回调的副作用。然后将其暴露onUpdate
给使用该Search
组件的组件将是微不足道的!