React Context API在Next.js中更改路由时获取默认数据

lsmepo6l  于 2023-08-04  发布在  React
关注(0)|答案(1)|浏览(147)

_app.tsx:

  1. 'use client';
  2. import type { AppProps } from 'next/app'
  3. import NavBar from '@/Components/NavBar/NavBar';
  4. import { NextUIProvider } from '@nextui-org/react'
  5. import BlogState from '@/Context/blogState';
  6. export default function App({ Component, pageProps }: AppProps) {
  7. return<BlogState>
  8. <NextUIProvider>
  9. <div style={{
  10. display:"flex",
  11. alignItems:"center",
  12. justifyContent:"center",
  13. fontSize:"50px",
  14. marginBottom:"30px"
  15. }}>Blog</div>
  16. <NavBar/>
  17. <Component {...pageProps} />
  18. </NextUIProvider>
  19. </BlogState>
  20. }

字符串

blogState.tsx:

  1. import BlogContext from "./blogContext";
  2. import { useState, useEffect } from 'react';
  3. const BlogState:any=(props:any)=>{
  4. const [Login,SetLogin]=useState(false)
  5. const [userDetail,setUserDetail]=useState({})
  6. function setLogin(val:boolean){
  7. SetLogin(()=>val)
  8. }
  9. function setUserDetails(val:any){
  10. setUserDetail((prev)=>prev=val)
  11. }
  12. useEffect(()=>{
  13. console.log(Login)
  14. console.log(userDetail)
  15. },[Login,userDetail])
  16. return (
  17. <BlogContext.Provider value={{setUserDetails,setLogin,Login,userDetail}}>
  18. {props.children}
  19. </BlogContext.Provider>
  20. )
  21. }
  22. export default BlogState

登录

  1. const [visible, setVisible] = useState(false)
  2. const [message,setMessage]=useState("")
  3. const {setUserDetails,setLogin}=useContext(blogContext)
  4. const[loading,setLoding]=useState(false)
  5. const[email,setEmail]=useState("")
  6. const[password,setPassword]=useState("")
  7. function LoginUser(){
  8. if(email==""||email==undefined||password==""||password==undefined){
  9. setMessage(()=>"Please fill all feilds")
  10. setVisible(()=>true)
  11. return;
  12. }
  13. setLoding(()=>true)
  14. axios.post("/api/Users/Login",
  15. {
  16. email:email,
  17. password:password
  18. }
  19. ).then((res:any)=>{
  20. if(res.data.details=="No User Found"){
  21. setMessage(()=>"Email is not connected with any account")
  22. setVisible(()=>true)
  23. setLoding(()=>false)
  24. return;
  25. }
  26. if(res.data.details=="Password Incorrect"){
  27. setMessage(()=>"Email or password incorrect")
  28. setVisible(()=>true)
  29. setLoding(()=>false)
  30. return;
  31. }
  32. setLoding(()=>false)
  33. setLogin(true)
  34. setUserDetails(res.data)
  35. }).catch(e=>console.log(e))
  36. }

首页:

  1. export default function Home() {
  2. const{Login}=useContext(blogContext)
  3. console.log(Login)
  4. return <div style={{display:"flex",alignItems:"center",justifyContent:"center",flexDirection:"column"}}>
  5. <Quote title1='Conversation is king.' title2='Content is just something to talk about.'/>
  6. <div className={classes.blogs}>
  7. <CardB/>
  8. <CardB/>
  9. <CardB/>
  10. <CardB/>
  11. <CardB/>
  12. </div>
  13. </div>
  14. }

NavBAr

  1. import { Navbar, Link, Text, Avatar, Dropdown, Input } from "@nextui-org/react";
  2. import { Layout } from "./Layout";
  3. export default function App() {
  4. const collapseItems = [
  5. "Home",
  6. "Create",
  7. "Favourite",
  8. "About",
  9. ];
  10. return (
  11. <Layout>
  12. <Navbar isBordered variant="sticky">
  13. <Navbar.Toggle showIn="xs" />
  14. <Text b>Bloging Made Easy</Text>
  15. <Navbar.Content
  16. enableCursorHighlight
  17. activeColor="secondary"
  18. hideIn="xs"
  19. variant="highlight-rounded"
  20. >
  21. <Navbar.Link href="/">Home</Navbar.Link>
  22. <Navbar.Link href="/Create">Create</Navbar.Link>
  23. <Navbar.Link href="/Favourite">Favourite</Navbar.Link>
  24. <Navbar.Link href="#">About</Navbar.Link>
  25. </Navbar.Content>
  26. <Navbar.Content
  27. css={{
  28. "@xs": {
  29. w: "12%",
  30. jc: "flex-end",
  31. },
  32. }}
  33. >
  34. <Dropdown placement="bottom-right">
  35. <Navbar.Item>
  36. <Dropdown.Trigger>
  37. <Avatar
  38. bordered
  39. as="button"
  40. color="secondary"
  41. size="md"
  42. src="https://media.istockphoto.com/id/1208175274/vector/avatar-vector-icon-simple-element-illustrationavatar-vector-icon-material-concept-vector.jpg?s=612x612&w=0&k=20&c=t4aK_TKnYaGQcPAC5Zyh46qqAtuoPcb-mjtQax3_9Xc="
  43. />
  44. </Dropdown.Trigger>
  45. </Navbar.Item>
  46. <Dropdown.Menu
  47. aria-label="User menu actions"
  48. color="secondary"
  49. onAction={(actionKey) => console.log({ actionKey })}
  50. >
  51. <Dropdown.Item key="profile" css={{ height: "$18" }}>
  52. <Text b color="inherit" css={{ d: "flex" }}>
  53. Signed in as
  54. </Text>
  55. <Text b color="inherit" css={{ d: "flex" }}>
  56. zoey@example.com
  57. </Text>
  58. </Dropdown.Item>
  59. <Dropdown.Item key="settings" withDivider>
  60. <Link href="/Account">Account</Link>
  61. </Dropdown.Item>
  62. <Dropdown.Item key="logout" withDivider color="error">
  63. Log Out
  64. </Dropdown.Item>
  65. </Dropdown.Menu>
  66. </Dropdown>
  67. </Navbar.Content>
  68. <Navbar.Collapse>
  69. {collapseItems.map((item, index) => (
  70. <Navbar.CollapseItem
  71. key={item}
  72. activeColor="secondary"
  73. css={{
  74. color: index === collapseItems.length - 1 ? "$error" : "",
  75. }}
  76. isActive={index === 2}
  77. >
  78. <Link
  79. color="inherit"
  80. css={{
  81. minWidth: "100%",
  82. }}
  83. href={(item=='Home')?"/":`/${item}`}
  84. >
  85. {item}
  86. </Link>
  87. </Navbar.CollapseItem>
  88. ))}
  89. </Navbar.Collapse>
  90. </Navbar>
  91. </Layout>
  92. );
  93. }


我尝试使用上下文API,但是每当我转到不同的组件时,值都变成默认值,尽管整个应用程序都 Package 在上下文中。
useEffect被触发并记录登录状态,userData工作正常并更新数据,但当它移动到不同的路由时,更新的数据消失了。
Link to a video showing the problem的数据。

icomxhvb

icomxhvb1#

您的视频显示,当您更改路由时,页面正在刷新(这是上下文重新初始化的原因)。我假设这是因为@nextui-org/react中的Link正在渲染一个普通的HMTL a元素,而没有任何Next.js功能。使用next/link代替:

  1. import Link from "next/link";

字符串

相关问题