TGViewer
Заметки про React Заметки про React @ru_react_notes · 3.43K subscribers
Post #489 3.39K
Контроль компонентов через URL

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

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


export default function Home() {
let searchParams = useSearchParams();
let search = searchParams.get('search') ?? '';

/* ... */

return (
<>
{/* ... */}

<Input
value={search}
onChange={(e) => {
let search = e.target.value;

if (search) {
router.push(`${pathname}?search=${search}`);
} else {
router.push(pathname);
}
}}
placeholder="Find someone..."
/>
</>
);
}


https://buildui.com/posts/how-to-control-a-react-component-with-the-url
Build UI How to control a React component with the URL
  • 👍 22
  • 👎 3
More from @ru_react_notes
  1. Jun 24, 2025Реактивность – это легко Стандартный useContext заставляет обновляться все компоненты-потр…
  2. Jun 17, 2025Остерегайтесь скрытых проблем при работе с search params Типо-безопасность — это только ве…
  3. Jun 4, 2025Почему Error Boundary, а не просто try/catch для компонентов В React нельзя использовать t…
  4. May 29, 2025Анонс TypeScript Native Вышла превью версия TypeScript написанная на Go. Ее можно установи…
  5. May 27, 2025Управление фокусом в React с помощью flushSync Установить фокус на инпуте сразу в React мо…
  6. May 15, 2025TanStack DB TanStack представила новую библиотеку – TanStack DB – реактивный клиентский ст…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →