Дросселирование реакции / редукса

Я пытаюсь отменить компонент в моем веб-приложении. На самом деле это фильтр для maxPrice, и если пользователь начинает печатать, фильтр начинает работать, и все результаты исчезают, пока за ним не появится разумное число.

Что я пробовал до сих пор:

import _ from 'lodash'

class MaxPrice extends Component {
  onSet = ({ target: { value }}) => {
    if (isNaN(Number(value))) return;

    this.setState({ value }, () => {
        this.props.updateMaxPrice(value.trim());
    });
  };

  render() {
    const updateMaxPrice = _.debounce(e => {
      this.onSet(e);
    }, 1000);

    return (
      <div>
        <ControlLabel>Preis bis</ControlLabel><br />
        <FormControl type="text" className={utilStyles.fullWidth} placeholder="egal"
          onChange={updateMaxPrice} value={this.props.maxPrice}
        />
      </div>
    );
  }
}

Я получаю ошибку

MaxPrice.js:11 Uncaught TypeError: Cannot read property 'value' of null
at MaxPrice._this.onSet (MaxPrice.js:11)
at MaxPrice.js:21
at invokeFunc (lodash.js:10350)
at trailingEdge (lodash.js:10397)
at timerExpired (lodash.js:10385)

В моей старой версии я имел onChange={this.onSet} и это сработало.

Есть идеи, что может быть не так?

2 ответа

Решение

Как вы упомянули в комментариях, необходимо использовать event.persist() использовать объект события асинхронно:

https://facebook.github.io/react/docs/events.html

Если вы хотите получить доступ к свойствам события асинхронным способом, вы должны вызвать event.persist() для события, которое удалит синтетическое событие из пула и позволит ссылкам на событие быть сохраненными кодом пользователя.

Это означает такой код, например:

onChange={e => {
  e.persist();
  updateMaxPrice(e);
}}

Вот мое окончательное решение. Спасибо Луночкину!

Мне пришлось ввести вторую избыточную переменную, чтобы пользователь видел значения, которые он вводит. Вторая переменная объявлена ​​так, что WepApp немного ждет обновления.

class MaxPrice extends Component {

  updateMaxPriceRedux = _.debounce((value) => { // this can also dispatch a redux action
      this.props.updateMaxPrice(value);
  }, 500);

  onSet = ({ target: { value }}) => {
    console.log(value);
    if (isNaN(Number(value))) return;
    this.props.updateInternalMaxPrice(value.trim());
    this.updateMaxPriceRedux(value.trim());
  };

    render() {
        return (
            <div>
                <ControlLabel>Preis bis</ControlLabel><br />
                <FormControl type="text" className={utilStyles.fullWidth} placeholder="egal"
                             onChange={e => {
                                 e.persist();
                                 this.onSet(e);
                             }} value={this.props.internalMaxPrice}
                />
            </div>
        );
    }
}

function mapStateToProps(state) {
    return {
        maxPrice: state.maxPrice,
        internalMaxPrice: state.internalMaxPrice
    };
}
function mapDispatchToProps(dispatch) {
    return bindActionCreators({updateMaxPrice:updateMaxPrice,
        updateInternalMaxPrice:updateInternalMaxPrice}, dispatch);
}
export default connect(mapStateToProps, mapDispatchToProps)(MaxPrice);
Другие вопросы по тегам