javascript - reactjs中使用firebase身份验证的登录功能
问题描述
我正在尝试创建一个登录功能良好且工作正常的项目,但是当我登录并刷新屏幕时,注销按钮消失并且登录链接会出现,然后再次注销按钮会出现。完全了解观看视频https ://drive.google.com/file/d/1UvTPXPvHf4EhcrifxDEfPuPN0ojUV_mN/view?usp=sharing,这是因为
const AuthContext = React.createContext()
//useauth will return the AuthContext
export const useAuth = () => {
return useContext(AuthContext)
}
export const Authprovider = ({ children }) => {
var name
auth.onAuthStateChanged((user) => {
name = user
})
const [currentuser, setcurrentuser] = useState(name)
const [load, setload] = useState(true)
function signup(email, password) {
return auth.createUserWithEmailAndPassword(email, password)
}
function login(email, password) {
return auth.signInWithEmailAndPassword(email, password)
}
useEffect(() => {
const unsubscribe = auth.onAuthStateChanged((user) => {
setcurrentuser(user)
setload(false)
})
return unsubscribe
}, [])
const value = {
currentuser,
signup,
login,
load,
}
return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>
}
我将 AuthProvider 组件包裹在 app 组件周围,以便我可以使用诸如 current user 之类的值。在登录链接的标题组件中,有注销按钮
const { currentuser, load } = useAuth()
const logout = () => {
try {
auth.signOut().then(() => {
console.log('logged out')
})
} catch {
alert('logout is not possible')
}
}
//some code
{currentuser ? (
<button onClick={logout}>Logout</button>
) : (
<Link to='/login'>Login</Link>
)}
如果有当前用户,则会出现注销按钮,否则会出现登录链接但是刷新时出现一些问题我尝试了很多方法现在我没有想法。“即使我在登录时刷新页面,注销按钮也不应该消失”你能告诉我该怎么做吗?了解观看链接中的视频
解决方案
那是因为你没有使用load state
试试这个:
//some code
{ load ? <div>loading</div>
: currentuser ? (
<button onClick={logout}>Logout</button>
) : (
<Link to='/login'>Login</Link>
)}
推荐阅读
- html - 如何对齐表格中的两列 | HTML 电子邮件签名
- amazon-dynamodb - 我可以在二级索引中查询 DynamoDB 中的值列表吗?
- mysql - 如何使用 Powershell 从主机到运行 MySQL 服务器的容器执行文件中的 MySQL 命令?
- java - 使用未弃用的模块修改 AsyncTask 方法
- sql - 计算两个节点之间的边网方向
- php - 如何在 wordpress 中以编程方式显示自定义帖子类型的图像缩略图。?
- sql - 即使没有 INSERT 发生,序列也会递增
- excel - 如何按部分名称获取 ColumnNames 列表?
- javascript - 如何纠正 ObjectUnsubscribedError
- firebase - 用户扫描二维码以读取和写入特定数据库节点后如何在 Firebase 中设置安全规则