Синхронное обновление текста ввода в разных вкладках браузера

Свяжите input со state, записывайте изменения в localStorage и слушайте storage в других вкладках того же origin. Вкладка-источник обновляет state сама: своё storage-событие она не получает.

Короткий ответ

Что ответить на собеседовании

Свяжите input со state, записывайте изменения в localStorage и слушайте storage в других вкладках того же origin. Вкладка-источник обновляет state сама: своё storage-событие она не получает.

Подробный разбор

Ответ с пояснениями

Условие

В приложении требуется реализовать механизм, который будет поддерживать одинаковое содержимое текстового поля во всех открытых вкладках браузера. При вводе или изменении текста в одном из инпутов, соответствующее значение должно автоматически появляться в аналогичных полях на остальных вкладках.

function App() {
  const [text, setText] = useState('');

  const handleChange = (value: string) => {
    setText(value);
  };

  return (
    <div className="app">
      <input onChange={(e) => handleChange(e.target.value)} />
    </div>
  );
}

Ответ

Свяжите input со state, записывайте изменения в localStorage и слушайте storage в других вкладках того же origin. Вкладка-источник обновляет state сама: своё storage-событие она не получает.

function App() {
  const [text, setText] = useState('');
  useEffect(() => {
    const sync = () => {
      try { setText(localStorage.getItem('shared-text') ?? ''); } catch {}
    };
    sync();
    const onStorage = event => { if (event.key === 'shared-text' || event.key === null) sync(); };
    window.addEventListener('storage', onStorage);
    return () => window.removeEventListener('storage', onStorage);
  }, []);
  const change = value => {
    setText(value);
    try { localStorage.setItem('shared-text', value); } catch {}
  };
  return <input value={text} onChange={event => change(event.target.value)} />;
}

Это асинхронная межвкладочная синхронизация, не мгновенная общая память. При конфликте используется последнее сохранённое значение; недоступное хранилище оставляет поле локальным. Для эфемерных сообщений можно использовать BroadcastChannel. Секреты и чувствительный ввод в localStorage сохранять не следует.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее