React Context API получает данные по умолчанию при изменении маршрутов в Next.js

_app.tsx:

'use client';
import type { AppProps } from 'next/app'
import  NavBar  from '@/Components/NavBar/NavBar';
import { NextUIProvider } from '@nextui-org/react'
import BlogState from '@/Context/blogState';
export default function App({ Component, pageProps }: AppProps) {
 
  return<BlogState> 
    <NextUIProvider>
  <div style = {{
    display:"flex",
    alignItems:"center",
    justifyContent:"center",
    fontSize:"50px",
    marginBottom:"30px"
  }}>Blog</div>
   <NavBar/>
   <Component {...pageProps} />
   </NextUIProvider>
   </BlogState>
}

blogState.tsx:

import BlogContext from "./blogContext";
import { useState, useEffect } from 'react';

const BlogState:any=(props:any)=>{
    
    const [Login,SetLogin]=useState(false)
    const [userDetail,setUserDetail]=useState({})

    function setLogin(val:boolean){
        SetLogin(()=>val)
    }
    function setUserDetails(val:any){
        setUserDetail((prev)=>prev=val)
    }
    useEffect(()=>{
      console.info(Login)
      console.info(userDetail)
    },[Login,userDetail])

    return (
        <BlogContext.Provider value = {{setUserDetails,setLogin,Login,userDetail}}>
            {props.children}
        </BlogContext.Provider>
    )
}

export default BlogState

Авторизоваться

 const [visible, setVisible] = useState(false)
  const [message,setMessage]=useState("")
  const {setUserDetails,setLogin}=useContext(blogContext)
  const[loading,setLoding]=useState(false)
  const[email,setEmail]=useState("")
  const[password,setPassword]=useState("")
  function LoginUser(){
    if (email= = ""||email==undefined||password= = ""||password==undefined){
      setMessage(()=>"Please fill all feilds")
      setVisible(()=>true)
      return;
    }
    setLoding(()=>true)
    axios.post("/api/Users/Login",
      {
        email:email,
        password:password
      }
    ).then((res:any)=>{
      if (res.data.details= = "No User Found"){
        setMessage(()=>"Email is not connected with any account")
        setVisible(()=>true)
        setLoding(()=>false)
         return;
      }
      if (res.data.details= = "Password Incorrect"){
        setMessage(()=>"Email or password incorrect")
        setVisible(()=>true)
        setLoding(()=>false)
         return;
      }
      setLoding(()=>false)
      setLogin(true)
      setUserDetails(res.data)
    }).catch(e=>console.info(e))
  }

Домашняя страница:

export default function Home() {
  const{Login}=useContext(blogContext)
  console.info(Login)
  return <div style = {{display:"flex",alignItems:"center",justifyContent:"center",flexDirection:"column"}}>
    <Quote title1='Conversation is king.' title2='Content is just something to talk about.'/>
   <div className = {classes.blogs}>
      <CardB/>
    <CardB/>
    <CardB/>
    <CardB/>
    <CardB/>
    </div>
  </div>
}

NavBAr

import { Navbar, Link, Text, Avatar, Dropdown, Input } from "@nextui-org/react";
import { Layout } from "./Layout";
export default function App() {
  const collapseItems = [
    "Home",
    "Create",
    "Favourite",
    "About",
  ];

  return (
    <Layout>
      <Navbar isBordered variant = "sticky">
        <Navbar.Toggle showIn = "xs" />
        <Text b>Bloging Made Easy</Text>
        <Navbar.Content
          enableCursorHighlight
          activeColor = "secondary"
          hideIn = "xs"
          variant = "highlight-rounded"
        >
          <Navbar.Link href = "/">Home</Navbar.Link>
          <Navbar.Link href = "/Create">Create</Navbar.Link>
          <Navbar.Link href = "/Favourite">Favourite</Navbar.Link>
          <Navbar.Link href = "#">About</Navbar.Link>
        </Navbar.Content>
        <Navbar.Content
          css = {{
            "@xs": {
              w: "12%",
              jc: "flex-end",
            },
          }}
        >
          <Dropdown placement = "bottom-right">
            <Navbar.Item>
              <Dropdown.Trigger>
                <Avatar
                  bordered
                  as = "button"
                  color = "secondary"
                  size = "md"
                  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 = "
                />
              </Dropdown.Trigger>
            </Navbar.Item>
            <Dropdown.Menu
              aria-label = "User menu actions"
              color = "secondary"
              onAction = {(actionKey) => console.info({ actionKey })}
            >
              <Dropdown.Item key = "profile" css = {{ height: "$18" }}>
                <Text b color = "inherit" css = {{ d: "flex" }}>
                  Signed in as
                </Text>
                <Text b color = "inherit" css = {{ d: "flex" }}>
                  [email protected]
                </Text>
              </Dropdown.Item>
              <Dropdown.Item key = "settings" withDivider>
                <Link href = "/Account">Account</Link>
              </Dropdown.Item>
              <Dropdown.Item key = "logout" withDivider color = "error">
                Log Out
              </Dropdown.Item>
            </Dropdown.Menu>
          </Dropdown>
        </Navbar.Content>
        <Navbar.Collapse>
          {collapseItems.map((item, index) => (
            <Navbar.CollapseItem
              key = {item}
              activeColor = "secondary"
              css = {{
                color: index === collapseItems.length - 1 ? "$error" : "",
              }}
              isActive = {index === 2}
            >
              <Link
                color = "inherit"
                css = {{
                  minWidth: "100%",
                }}
                href = {(item=='Home')?"/":`/${item}`}
              >
                {item}
              </Link>
            </Navbar.CollapseItem>
          ))}
        </Navbar.Collapse>
      </Navbar>
    </Layout>
  );
}

Я пытался использовать контекстный API, но значения получают значение по умолчанию всякий раз, когда я перехожу к другому компоненту, хотя все приложение заключено в контекст.

useEffect запускается и регистрирует состояние входа в систему и userData, который отлично работает и обновляет данные, но когда он переходит на другой маршрут, обновленные данные исчезают.

Ссылка на видео, показывающее проблему.

Можете ли вы показать, где вы назвали компонент BlogState?

Youssouf Oumar 23.07.2023 22:21

@YoussoufOumar Я отредактировал вопрос и добавил использование BlogState, которое используется в _app.tsx

Ankit Kumar 24.07.2023 06:55

Спасибо. Теперь вы можете показать кнопки в вашем компоненте NavBar?

Youssouf Oumar 24.07.2023 07:53

@YoussoufOumar Я снова отредактировал и добавил NavBar

Ankit Kumar 24.07.2023 15:21

Спасибо. Я вставил ответ. Проверьте это и дайте мне знать, пожалуйста :)

Youssouf Oumar 25.07.2023 16:27
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
2
5
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваше видео показывает, что страница обновляется при изменении маршрутов (причина повторной инициализации контекста). Я предполагаю, что это потому, что Link из @nextui-org/react отображает обычный HMTL элемент без каких-либо функций Next.js. Вместо этого используйте далее/ссылка:

import Link from "next/link";

Другие вопросы по теме

Похожие вопросы

Ответный запрос. Как получить ответ на запрос? Я получаю только после второй отправки
Next.js 13 Группировка маршрутов каталога приложений выдает «Несоответствующий путь (), предоставленный для / (общедоступного)»
TypeError: не удается прочитать свойства undefined (чтение «заголовков») с помощью нового маршрутизатора приложений next.js
Получение неопределенных данных и ошибка «Данные запроса не могут быть неопределенными»
Jest захватывает событие изменения ввода и проверяет, что оно было вызвано с правильным значением в контролируемом компоненте реакции
Родительский компонент возвращает дочерние div один за другим
Выпадающее меню React снова открывает меню при нажатии снаружи
Почему useState<string>() не является ошибкой TypeScript?
Можно ли преобразовать строку в имя ссылочной переменной в реакции?
Как вызвать функцию перед визуализацией компонента в React