Производное состояние дроссельной заслонки в React

Вот мой вариант использования, простой компонент React с вводом текста, который фильтрует элементы списка:

const myArray = [...];

// Inside React component:

handleChangeEvent = ({target: {value}}) => this.setState({value});

render() {
  return (
    <div>
      <input onChange = {this.handleChangeEvent} value = {this.state.value} />
      <ul>
        {myArray.filter(v => v.includes(this.state.value)).map(v => <li>{v}</li>)}
      </ul>
    </div>
  );
}

С помощью этого кода каждый раз, когда я меняю текст внутри ввода, элементы внутри списка немедленно меняются.

Чего я хочу добиться: пользователь вводит текст фильтра, этот текст немедленно обновляется при вводе текста (обычно), но я хочу, чтобы элементы внутри списка нет обновлялись немедленно, но скажем, через 500 мс после того, как пользователь закончил вводить текст.

Итак, в основном:

  • типы пользователей, текстовые обновления внутри <input>, элементы списка не
  • пользователь перестает печатать через 500 мсек, элементы списка обновляются

Редактировать:

Что я пробовал:

import throttle from 'lodash/throttle';
const myArray = [...];

// Inside React component:

handleChangeEvent = ({target: {value}}) => this.setState({value});

calculateMatches = throttle(() => {
  const matches = myArray.filter(v => v.includes(this.state.value))
  return matches;
}, 500);

render() {
  return (
    <div>
      <input onChange = {this.handleChangeEvent} value = {this.state.value} />
      <ul>
        {this.calculateMatches().map(v => <li>{v}</li>)}
      </ul>
    </div>
  );
}

Но это дросселируется каждые 500 мс, поэтому, если пользователь продолжит печатать в течение 1600 мс, он обновит список 3 раза.

Пожалуйста, покажите минимальный воспроизводимый пример того, что вы пробовали при попытке решить эту проблему.

zzzzBov 18.05.2018 00:10

Не могли бы вы использовать lodash?

Oblosys 18.05.2018 00:30

Вы можете использовать debounce из lodash именно для этой цели.

SrThompson 18.05.2018 00:31

@zzzzBov Добавлено. Oblosys и SrTHompson См. Комментарий под моим редактированием, почему я не использовал бы throttle / debounce напрямую.

jeanpaul62 18.05.2018 00:34

@SrThompson Мой плохой, debounce работает отлично.

jeanpaul62 18.05.2018 00:44

Ознакомьтесь с этой статьей, чтобы получить хорошее описание этих двух: css-tricks.com/debouncing-throttling-explained-examples

Oblosys 18.05.2018 00:46
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
6
249
0

Другие вопросы по теме