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>
</>
)
}
1条答案
按热度按时间zdwk9cvp1#
您的
updateUser
在“组件呈现”时调用,因此每当您的应用程序更改状态或任何父组件更改状态时,都会调用updateUser
。由于此代码会给组件带来副作用,您可以尝试将此代码放入
useEffect
挂钩中,如下所示:但是,我不建议让组件负责维护应用程序状态和处理副作用。
我的建议是在你的应用中加入应用状态管理框架,比如redux,并将数据提交逻辑转移到middleware,这样你的数据流看起来就像这样:
1.用户取得进展-〉组件调度有关取得进展的事件
1.中间件拾取事件,并根据身份验证状态将其保存到本地存储或发送到后端。