naokikobashi
@naokikobashi (nao ki)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

useQueryを使っているページに別ページから遷移するとエラー

ReactQueryを使っている場合のみ、エラーが発生します。
解消方法がわからず、もし思い当たる内容などあればご教授いただけると幸いです。

利用バージョン、環境

・react 18.1.0
・typescript 4.7
・react query 3.39
・create react appでアプリ作成。SPAで、apiより非同期でaxiosを使いデータを取得している

概要

上記のバージョンで、react queryを利用してデータ取得関数を使い、
ページA(トップページ)でそのデータを表示させています。
ページAで画面読み込み時は通常は正常に表示され、ページB、Cなどに移動した後Aに戻っても正常に表示されています。

エラー発生条件

別のページBでサイトを「リロード」してサイトを再読み込した後に、
ページAに戻ると、本エラーが発生し、さらに画面が真っ白になります。
なおページBはテストで作った、ただ1行のdivタグを返すのみのページです。

エラー内容(コンソールに表記)

Uncaught Error: A component suspended while responding to synchronous input. 
This will cause the UI to be replaced with a loading indicator. 
To fix, updates that suspend should be wrapped with startTransition.

実際のコード

クエリの関数

export const GetTopics = async() => {
    try{
		const res = await axios.get(URL)
		return res.data;
    }catch(e){
		console.log('エラー')
        console.log(e.response)
    }
}

エラー発生ページ

Home.tsx

export const Home:FC = () => {
	const { isLoading:topic_loading, error:topic_error, data:topics} = useQuery(
		'topics',
		() => GetTopics(),
	);

	console.log('取得情報');
	console.log(topics);//このページで再読み込み時、この時点では正常にデータがある

	return (
		<div>
            {(() => {
					if (error) {
						return( <div>loading・・・</div> );
					} else {
						return ( 
						<ul className="topics_wrap">
							{
								filtedTopics.map((topic)=>(
									<li key={topic.id}>
										<Link to={"/topic/" + topic.id} state={topic}>
											<Topic
												id={topic.id}
												title={topic.title}
											/>
										</Link>
									</li>
								))
							}  
						</ul>                                
						 );
					}
					})()
				}

		</div>
	)

}

試したこと

エラーメッセージから行き着いた参考ページ
https://github.com/facebook/react/issues/25629

・suspenceでjsxタグを囲む→改善せず
・エラーで促されているように、startTransitionでjsxのタグを囲むなどを試してみましたが、同状況で同事象が発生します。
・最初はクエリの種類をreact queryを使う場合と使わない場合がページにより混合していたので、
エラー発生しているページAと、テストでdivタグのみを返すページBの
2ページのみにしてみましたが、事象は同様に発生しております。
・useQueryを使わず、useEffectのなかでGetTopicを使い、usestateでtopicsをセットすると、該当のエラーとなりません。。が、usequeryはシンプルに書けるコードなので、使えるならば使いたいと考えています。

0

1Answer

tanstack queryのバージョンをv5系に上げた状態で同様の記述をしても再発しなくなりました。
原因はわかりませんが、一旦クローズいたします。

0Like

Your answer might help someone💌