Неожиданное поведение контекста реакции

#javascript #reactjs #next.js

Вопрос:

Технический Стек

  • реагировать — 17.0.2
  • реагировать-дом — 17.0.2
  • Далее — 11.1.1

Контексты

userContext.js

 import React from "react";

const UserContext = React.createContext(null);

export default UserContext;
 

utilContext.js

 import React from "react";

const UtilContext = React.createContext(null);

export default UtilContext;
 

_app.js документы

 import { useState, useEffect } from "react";
import { ChakraProvider } from "@chakra-ui/react";
import { Provider as ReduxProvider } from "react-redux";
import { useStore } from "../store";
import UserContext from "@src/context/userContext";
import UtilContext from "@src/context/utilContext";

function MyApp({ Component, pageProps }) {
  const store = useStore(pageProps.initialReduxState);
  const [user, setUser] = useState(null);
  const [showNav, setShowNav] = useState(true);
  const [showToTop, setShowToTop] = useState(false);

  useEffect(() => {
    const user = getLocalStorage("user");
    if (user) {
      setUser(JSON.parse(user));
    }

    // show and hide navbar
    let prevScrollpos = window.pageYOffset;
    window.onscroll = function () {
      let currentScrollPos = window.pageYOffset;
      if (prevScrollpos > currentScrollPos) {
        setShowNav(true);
      } else {
        setShowNav(false);
      }
      prevScrollpos = currentScrollPos;

      // scroll to top button
      if (
        document.body.scrollTop > 20 ||
        document.documentElement.scrollTop > 20
      ) {
        setShowToTop(true);
      } else {
        setShowNav(true);
        setShowToTop(false);
      }
    };
  }, []);


  const updateUser = (data) => {
    let localUser = getLocalStorage("user");
    if (localUser) {
      localUser = JSON.parse(localUser);
    } else {
      localUser = {};
    }

    const mergeUser = { ...localUser, ...data };
    setUser(mergeUser);
    setLocalStorage("user", JSON.stringify(mergeUser));
  };
  
  return (
    <>
      <ChakraProvider>
        <ReduxProvider store={store}>
          <UserContext.Provider value={{ data: user, setUser: updateUser }}>
            <UtilContext.Provider value={{ showNav, showToTop }}>
              <Component {...pageProps} />
            </UtilContext.Provider>
          </UserContext.Provider>
        </ReduxProvider>
      </ChakraProvider>
    </>
  );
}

export default MyApp;
 

component.js

 import UserContext from "@src/context/userContext";
const Component=()=>{
  const user = useContext(UserContext);
  const [posts, setPosts] = useState({});

  useEffect(() => {
    console.log("User changed..")
    if (!user.data?._id) return;

    setPosts({ loading: true });
    GET(`/api/post/fetch/all/by-author/${user.data._id}?private=true`)
      .then((res) => setPosts({ data: res.data, loading: false }))
      .catch((err) => setPosts({ err: true, loading: false }));
  }, [user]);
  
  // render posts which is a long list
}
 

Проблема

Вы можете видеть в _app.js файле, что я обновляю utilContext информацию о window.scroll событии. Но обновление utilContext также запускает крючок Component .

И всякий раз, когда я прокручиваю страницу, я получаю это сообщение, зарегистрированное на консоли.

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

Пользователь изменился..

Пользователь изменился..

Комментарии:

1. I am updating the utilContext , Я не вижу, чтобы какой-либо контекст был обновлен, просто состояние.

2. @Кит, я тебя не понял