ホームページ  >  に質問  >  本文

React Query の競合状態

<p>リアクティブ クエリを使用して Todo アプリを作成しようとしていますが、競合状態の問題に直面しています。 ユーザーが新しい To Do を更新/作成し、[保存] をクリックする To Do ページがあります。 ユーザーのインターネット接続によっては、保存プロセスに約 3 秒かかる場合があります。 To Do アイテムを編集した後、ユーザーは To Do ページに残ります。 新しい To Do アイテムを作成した後、ユーザーは To Do アイテムのページに移動します。 </p> <p>問題は、 ユーザーが todo を作成/更新し、[todo モーダルの表示] をクリックすると (これは外部コンポーネントなので編集できません) モードでは編集前の To Do が表示されます。新しい To Do の場合は空になります</p> <p>問題をデバッグすると、モーダルがオンになった後に反応クエリが ToDo アイテムを取得していることがわかります。 モーダルを閉じて再度開くと、更新された To Do 項目が表示されます。 </p> <pre class="brush:php;toolbar:false;">const {todo} = useTodoQuery() const openModal = () => modal.open(todo) 戻る ( <TodoModalButton onClick={openModal}>Todo プレビュー モーダルを開く</TodoModalButton> )</pre> <pre class="brush:php;toolbar:false;">const useTodoQuery = () => { const {data, ...rest} = useQuery(['todo', todoId], async () => { if (todoId) { return await getTodo(todoId) } null を返します。 }) {データ、...残り}を返す }</pre> <pre class="brush:php;toolbar:false;">const queryClient = new QueryClient({ デフォルトオプション: { サスペンス: 偽、 keepPreviousData: true、 } })</pre> <p>keepPreviousData を削除すると、todo が未定義になります。 </p> <pre class="brush:php;toolbar:false;">const todoMutation = useMutation( [「todo」]、 getUpdatedTodo、 {onSuccess: () => queryClient.invalidateQueries(['todo', todoId])} );</pre> <p>使ってみた <code>{onSuccess: (todo) => queryClient.setQueryData(['todo', todoId], todo)}</code> しかし、その効果は理想的なものではありません。 </p>
P粉364642019P粉364642019433日前647

全員に返信(1)返信します

  • P粉775723722

    P粉7757237222023-09-04 00:45:44

    onSuccess コールバックを待ってモデルを開きます:) 解決策: D

    不可能な場合は、さらに詳細を入力してください

    返事
    0
  • キャンセル返事