Lodash debounce не работает в React
было бы лучше сначала посмотрите на мой код:
import React, { Component } from 'react';
import _ from 'lodash';
import Services from 'Services'; // Webservice calls
export default class componentName extends Component {
constructor(props) {
super(props);
this.state = {
value: this.props.value || null
}
}
onChange(value) {
this.setState({ value });
// This doesn't call Services.setValue at all
_.debounce(() => Services.setValue(value), 1000);
}
render() {
return (
<div>
<input
onChange={(event, value) => this.onChange(value)}
value={this.state.value}
/>
</div>
)
}
}
просто простой вход. В контрукторе он захватывает value
из реквизита (если доступно) в устанавливает локальное состояние для компонента.
затем в на input
Я обновляю состояние, а затем пытаюсь вызвать конечную точку webservice, чтобы установить новое значение с Services.setValue()
.
что работает, если я установил debounce
непосредственно onChange
входной как Итак:
<input
value={this.state.value}
onChange={_.debounce((event, value) => this.onChange(value), 1000)}
/>
а то this.setState
вызывается только каждые 1000 миллисекунд и обновляет представление. Поэтому ввод текста в текстовое поле выглядит странно, так как то, что вы набрали, отображается только через секунду.
что мне делать в такой ситуации?
1 ответов
проблема возникает, потому что вы не вызываете функцию debounce, вы можете сделать следующим образом
export default class componentName extends Component {
constructor(props) {
super(props);
this.state = {
value: this.props.value || null
}
this.servicesValue = _.debounce(this.servicesValue, 1000);
}
onChange(value) {
this.setState({ value });
this.servicesValue(value);
}
servicesValue = (value) => {
Services.setValue(value)
}
render() {
return (
<div>
<input
onChange={(event, value) => this.onChange(value)}
value={this.state.value}
/>
</div>
)
}
}