代码之家  ›  专栏  ›  技术社区  ›  anon

为什么我会得到“未捕获的DOMException:无法在DOMTokenList上执行添加”

  •  0
  • anon  · 技术社区  · 2 年前

    由于某种原因,我出现了这个错误 enter image description here 而这个=> enter image description here

    我相信这个错误与我将模式从亮模式更改为暗模式有关。以下是我的导航栏.jsx=>“

    // function to toggle between dark mode / light
      const toggleTheme = () => {
        setTheme((prevTheme) => (prevTheme === "light" ? "dark" : "light"));
      };"
    
    
       <div id="navbar-container" className={`flex justify-between z-10 items-center top-0 pt-3 px-4 w-full sticky ${theme === "dark" ? "bg-slate-950": "bg-white"}`}>
    

    这是主题提供程序所在的App.jsx(我使用shadcn-ui作为主题提供程序)=>

    const Navigation = () => {
      const location = useLocation();
      const loginRoute = location.pathname === '/login';
      const emailConfirmRoute = location.pathname === "/success/confirm";
    
      // Determine which component to render based on the route
      const renderNavbar = loginRoute || emailConfirmRoute ? null : (location.pathname === '/' ? <Navbar /> : <DashboardNavbar />);
      
    
      return renderNavbar;
    };
    
    const FooterComponent = () => {
      const location = useLocation();
      const loginRoute = location.pathname === '/login';
    
      const renderFooter = loginRoute ? null : (location.pathname === '/' ? <Footer /> : null);
      
      return renderFooter;
    };
    
    // Create context for the user
    export const UserContext = createContext(null);
    
    // Custom hook to use the user context
    export const useUser = () => useContext(UserContext);
    
    const App = () => {
      const [user, setUser] = useState(null);
    
      // useEffect for auth to determine if user is authenticated or not
      useEffect(() => {
        // Define an async function to get the session
        async function getSession() {
          try {
            // Wait for the session promise to resolve
            const {data: { session }} = await supabase.auth.getSession()
      
            // If there is a session, set the user state to the session's user information
            if (session) {
              console.log("Session object:", session);
            
            if (session.user && session.user.aud) {
              console.log("Session aud:", session.user?.aud)
            } else {
              console.log("Session is undefined")
            }
            setUser(session.user);
            
          } else {
              console.log('No active session: User is not logged in');
            }
          } catch (error) {
            console.error('Error fetching session:', error);
          }
        }
        // Call the async function
        getSession();
      }, [setUser]);
    
      return (
        <ThemeProvider defaultTheme='light' storageKey='vite-ui-theme'>
          <UserContext.Provider value={{ user, setUser }}>
            <Router>
              <div>
                {/* Render the appropriate component based on the route */}
                <Navigation/>
                <Routes>
                  <Route path="/" element={<Home />} />
                  <Route path='/create' element={<Dashboard />} />
                  <Route path='/login' element={<Login />} />
                  <Route path='/success/confirm' element={<ConfirmEmail />} />
                </Routes>
                <FooterComponent />
              </div>
            </Router>
          </UserContext.Provider>
        </ThemeProvider>
      );
    };
    
    export default App;"
    

    并且主题提供者.jsx=>

    /* eslint-disable react/prop-types */
    import { createContext, useContext, useEffect, useState } from "react";
    
    const ThemeProviderContext = createContext(null);
    
    export function ThemeProvider({
      children,
      defaultTheme = "system",
      storageKey = "vite-ui-theme",
      ...props
    }) {
      const [theme, setTheme] = useState(
        () => localStorage.getItem(storageKey) || defaultTheme
      );
    
      useEffect(() => {
        const root = window.document.documentElement;
    
        root.classList.remove("light", "dark");
    
        if (theme === "system") {
          const systemTheme = window.matchMedia("(prefers-color-scheme: dark)")
            .matches
            ? "dark"
            : "light";
    
          root.classList.add(systemTheme);
          return;
        }
    
        root.classList.add(theme);
      }, [theme]);
    
      const value = {
        theme,
        setTheme: (theme) => {
          localStorage.setItem(storageKey, theme);
          setTheme(theme);
        },
      };
    
      return (
        <ThemeProviderContext.Provider {...props} value={value}>
          {children}
        </ThemeProviderContext.Provider>
      );
    }
    
    // eslint-disable-next-line react-refresh/only-export-components
    export const useTheme = () => {
      const context = useContext(ThemeProviderContext);
    
      if (context === undefined)
        throw new Error("useTheme must be used within a ThemeProvider");
    
      return context;
    };
    

    现在奇怪的部分=>此错误 只有 当我登录到使用超级数据库进行身份验证的应用程序时会发生这种情况。例如,当我清除浏览器cahce或在icognito中查看应用程序时,一切都按预期进行 包括…在内 从亮主题变为暗主题,反之亦然。 这意味着我的身份验证出现了问题,导致了此错误。

    如有任何帮助,我们将不胜感激。真的不知道从哪里去找答案。

    1 回复  |  直到 2 年前
        1
  •  1
  •   AnanthDev    2 年前
      const toggleTheme = () => {
        // wrong you're passing a function instead of a string to set state of the theme
        setTheme((prevTheme) => (prevTheme === "light" ? "dark" : "light"));
      };"
    

    所以您使用useState钩子来调用 setTheme 函数并设置值时,要设置的参数应该是字符串。根据你如何设置 defaultTheme 在里面 ThemeProvider 组件为“光”

    在您的代码中,您将向setTheme钩子传递一个箭头函数,这不是ThemeProvider所期望的。

    将其替换为

    ...
    setTheme(prevTheme === 'light' ? 'dark' : 'light');
    ...