1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【React】nuqsを使ってstateをURLに保存してみる!

Posted at

nuqsとは

公式ドキュメントのスクショです

cap1.PNG

Type-safe search params state manager for React

とあります。
React用の、型安全なURLクエリパラメータを利用したstate管理ライブラリです。

URLクエリパラメータを利用したstate管理?

state管理と聞くと、useState() を利用した管理や、recoil(古い?)、reduxjotai を使用した管理などがパッと思いつくと思います。

nuqsでは、このstateをURLのクエリパラメータとして表現し、管理します。
公式ドキュメントのサンプルを触って、どういうことなのか見てみます。

sample.gif

なんとなく雰囲気が理解できたでしょうか?
inputに入力した値がURL上に現れること、
逆に、URL上のクエリパラメータが画面に反映されることが確認できました。

URLクエリパラメータを利用したstate管理の個人的推しポイント

1. ページの共有が簡単(URLに状態が含まれる)!!
stateがURLに含まれるため、ブックマークやURLを転送しての共有などが簡単に行えます。
filter条件やsort条件などをURL上で管理することで、filter/sort後のページを簡単に表示できます!

2. ブラウザの戻る/進む/リロードボタンでの状態管理が簡単!!
上とほぼ同じですが、URLでstateが管理されていれば、このように使えます。
個人的には、リロードしても大丈夫なのがかなり好きです。

なんとなく動作の雰囲気とメリットが把握できたと思うので、実際にはろーわーるどしてみます。

やってみる

プロジェクト準備

過去に投稿した記事を参考に、vite + React 環境を用意します。

毎回めんどくさいのでリポジトリを作りました

nuqsライブラリの追加

ドキュメントを参考にすすめていきます

npm install nuqs

アダプターの追加

vite + React用の項目を参考にアダプターを実装します

import { StrictMode } from 'react'
import { createRoot } from 'react-dom/client'
+ import { NuqsAdapter } from 'nuqs/adapters/react'
import './index.css'
import App from './App.tsx'

createRoot(document.getElementById('root')!).render(
  <StrictMode>
+   <NuqsAdapter>
      <App />
+   </NuqsAdapter>
  </StrictMode>,
)

使ってみる

ドキュメントのbasic-usageをまずはやってみます

ドキュメントを参考に、App.tsxを編集します

src/app.tsx
import { useQueryState } from 'nuqs'

export function App() {
  const [name, setName] = useQueryState('name')
  return (
    <>
      <input value={name || ''} onChange={e => setName(e.target.value)} />
      <button onClick={() => setName(null)}>Clear</button>
      <p>Hello, {name || 'anonymous visitor'}!</p>
    </>
  )
}

export default App

動作を確認してみます!!

npm run dev

cap2.PNG

表示はよさそうです

cap3.PNG

URLクエリパラメータでstate管理できてますね!!!

コードを見てわかる通り、nuqsはかなりuseState() によせて作られているため、簡単に移行または導入できそうです。

-   import { useState } from 'react';
-   const [name, setName] = useState('name')
/* ↓↓↓  */
+   import { useQueryState } from 'nuqs'
+   const [name, setName] = useQueryState('name')

ただ、注意が必要なのは、こういったstateをページ遷移先へ持っていきたい場合です。
react-router-dom でもやりようはありますが、微妙な感じもあります。

tanstack-router というライブラリを使用すると、URLでstateを扱いながら型安全にページ遷移まで行えます。

以前記事を書いているので、気になる方はぜひ見てみてください(なんかダイマみたいになったな)

おわりに

今回はsuinさんのポストに影響され、nuqsを触ってみました。

stateの永続化はローカルストレージに保存するのが一般的?な気がしているのですが、
こういった管理も良いなと感じました!!!!

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?