reactjs 如何避免发送一堆更新数据库中数据的请求

fslejnso  于 2023-02-15  发布在  React
关注(0)|答案(1)|浏览(110)

bounty将在7天后过期。回答此问题可获得+50的声望奖励。JohnPix正在寻找规范答案

我有一个未注册的用户使用我的应用程序,取得了一些进展。我把这个进展保存在本地存储器中。然后,当用户决定注册时,我发送一个PUT请求,以使他的进展与DB同步。
为此,我跟踪它的status,当它变成authenticated并且progress参数为空时,我发送一个PUT请求,但问题是它发送几十个PUT请求来更新进度,而不是一个。

'use client'
import { useSession, signIn, signOut, useUser } from 'next-auth/react'
import { use, useContext, useEffect, useState } from 'react'
import AppContext from '../../utils/AppContext'

const updateProfile = async (email, prog) => {
  await fetch(`http://localhost:3000/api/users/${email}`, {
    method: 'PUT',
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      progress: prog,
    }),
  })
}

export default function Component() {
  const { progressArr, setProgressArr } = useContext(AppContext)
  const { data: session, status } = useSession()

  function updateUser() {
    use(updateProfile(session.user.email, progressArr))
  }

  if (status === 'authenticated') {
    if (!session.user.progress) {
      updateUser()
    }
  }

  if (session) {
    return (
      <>
        Signed in as {session.user.email} <br />
        <button onClick={() => signOut()}>Sign out</button>
      </>
    )
  }
  return (
    <>
      Not signed in <br />
      <button onClick={() => signIn()}>Sign in</button>
    </>
  )
}
zdwk9cvp

zdwk9cvp1#

您的updateUser在“组件呈现”时调用,因此每当您的应用程序更改状态或任何父组件更改状态时,都会调用updateUser
由于此代码会给组件带来副作用,您可以尝试将此代码放入useEffect挂钩中,如下所示:

useEffect(() => {
  if (status === 'authenticated') {
    if (!session.user.progress) {
      updateUser()
    }
  }
}, status);

但是,我不建议让组件负责维护应用程序状态和处理副作用。
我的建议是在你的应用中加入应用状态管理框架,比如redux,并将数据提交逻辑转移到middleware,这样你的数据流看起来就像这样:
1.用户取得进展-〉组件调度有关取得进展的事件
1.中间件拾取事件,并根据身份验证状态将其保存到本地存储或发送到后端。

相关问题