[React/Next.js]Recoilで状態管理する

広告Next.js
2024年1月13日

Next.jsでRecoilで状態管理する機会があったので使い方をまとめていきます。

インストール

npm install recoil

設定:RecoilRoot

ルートをRecoilRootで囲みます。

import { RecoilRoot } from "./recoil";
 
export default function RootLayout({ children }: { children: ReactNode }) {
 
return (
<html lang="ja">
	<body>
		<RecoilRoot>{children}</RecoilRoot>
	</body>
</html>
);

状態を定義:atom

import { atom } from "recoil";
 
const textState = atom({  
	key: 'textState', 
	default: '',
});

key: ユニークになるようにします。

状態の読み書き:useRecoilState

"use client";
import { useRecoilState } from "recoil";
import { textState } from "@/recoil/textState";
 
function TextInput(){
	const [text, setText] = useRecoilState(textState);
	const onChange = (event) => {  
		setText(event.target.value);  
	};
	return (  
		<div>  
			<input type="text" value={text} onChange={onChange} />  
			<br />  
			Echo: {text}  
		</div>  
		);
	}
 

状態を取得:useRecoilValue

"use client";
function TextStateComponent(){
  const text = useRecoilValue(textState);
}

更新関数を取得:useSetRecoilState

状態を更新する関数のみ取得します。 

"use client";
function TextSetComponent(){
  const setText = useSetRecoilState(textState);
}

state を宣言するとコンポーネントが再レンダリングされるため、useSetRecoilStateを利用して再レンダリングされないようにします。