Лодэшский дебют не работает в 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>
)
}
}
Просто простой ввод. В contructor он захватывает value
из реквизита (если доступно) при задании локального состояния для компонента.
Затем в функции onChange
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>
)
}
}