Реализация setTimeout для удаления нотифов

131
28 июня 2021, 06:50

Пытаюсь сделать простые нотифы. Жмем на кнопку, появляется уведомление. Если много раз нажимать, то они появятся стопочкой. Это худо-бедно реализовано:

class App extends React.Component {
        state = { messages: [] };
        addItem() {
            this.state.messages.push('Hello Snackbar!');
            this.setState({ messages: this.state.messages });
        }
        render() {
            let notify = this.state.messages.map((item, index) => {
                return <div className="notify" key={index}>{item}</div>;
            });
            return (
                <div>
                    <button className="notify-button" onClick={this.addItem.bind(this)}>Show Snackbar</button>
                    <div>{notify}</div>
                </div>
            );
        }
    }

Теперь ломаю голову над тем, чтобы каждый нотиф появлялся на несколько секунд, а потом исчезал. Знаю, что нужно использовать функцию с setTimeout, но пока не могу сообразить как. Заранее спасибо за любую помощь. В голове пока крутится только что-то такое:

showNotification = () =>
    this.setState({ show: true },
        function() {
        setTimeout(this.hideNotification, 2000);
    });
hideNotification = () => this.setState({ show: false });
Answer 1

Можно добавить метод удаления элемента из массива, и вызывать его в addItem через setTimeout.

class App extends React.Component {
  state = { messages: [] };
  addItem() {
      this.setState((prevState) => {
        return {
          messages: [
            ...prevState.messages,
            'Hello Snackbar!'
          ]
        }
      });
      setTimeout(() => {
        this.removeItem();
      }, 1000)
  }
  removeItem() {
    const { messages } = this.state;
    if (messages.length) {
      this.setState({
        messages: messages.slice(1)
      });
    }
  }
  render() {
    let notify = this.state.messages.map((item, index) => {
      return <div className="notify" key={index}>{item}</div>;
    });
    return (
      <div>
          <button className="notify-button" onClick={this.addItem.bind(this)}>Show Snackbar</button>
          <div>{notify}</div>
      </div>
    );
  }
}

Sandbox

READ ALSO
Не срабатывает нажатие радио кнопок

Не срабатывает нажатие радио кнопок

Не срабатывает скрыть / показать текст при выборе кнопок

104
Вызов пайтоновских скриптов из кода с++

Вызов пайтоновских скриптов из кода с++

Прочитал статью на хабре об использовании Python в многопоточном приложении с++ с использованием субинтерпретаторовПри этом, как заявляется...

130
Некорректно отображается рамка вокруг div

Некорректно отображается рамка вокруг div

Необходимо блок поместить в рамкуНо при border: solid 1px grey; отображается только верхняя часть рамки(не хватает нижней рамки, правой и левой)

107
Верстка письма под ms outlook

Верстка письма под ms outlook

Похоже, аутлук добавляет таблицам отступы слева и справа, так как есть таблицы 290рх + 20рх + 290рх и они не влазят в общую таблицу шириной 600рхМожет...

114