Javascript 未能在react组件内部使用文档对象&引用;“未定义文档”;错误

Javascript 未能在react组件内部使用文档对象&引用;“未定义文档”;错误,javascript,reactjs,next.js,Javascript,Reactjs,Next.js,我在react组件内部使用了一些浏览器嗅探代码 import React,{useState}来自“React” 常量SomeComponent=({props})=>{ const isIE=document.documentMode; 返回( 这里有一些浏览器嗅探代码。 ) }当您使用Next.js时,您应该知道,您的一些代码将在服务器端运行,其中窗口,文档和其他特定于浏览器的API将不可用 由于useffecthook仅在客户端运行,因此您可以将其与useState一起使用以实现您的目标

我在react组件内部使用了一些浏览器嗅探代码

import React,{useState}来自“React”
常量SomeComponent=({props})=>{
const isIE=document.documentMode;
返回(
这里有一些浏览器嗅探代码。
)

}
当您使用
Next.js
时,您应该知道,您的一些代码将在服务器端运行,其中
窗口
文档
和其他特定于浏览器的API将不可用

由于
useffect
hook仅在客户端运行,因此您可以将其与
useState
一起使用以实现您的目标:

import React, { useState, useEffect } from "react";

const SomeComponent = ({ props }) => {
  const [isIE, setIsIE] = useState(false);
  useEffect(() => {
    setIsIE(document.documentMode);
  }, []);
  if (!isIE) return null;
  return <div>Some browser sniffing code here.</div>;
};
import React,{useState,useffect}来自“React”;
常量SomeComponent=({props})=>{
const[isIE,setIsIE]=useState(false);
useffect(()=>{
setIsIE(document.documentMode);
}, []);
如果(!isIE)返回null;
在此处返回一些浏览器嗅探代码。;
};

当您使用
Next.js
时,您应该知道,您的一些代码将在服务器端运行,其中
窗口
文档
和其他特定于浏览器的API将不可用

由于
useffect
hook仅在客户端运行,因此您可以将其与
useState
一起使用以实现您的目标:

import React, { useState, useEffect } from "react";

const SomeComponent = ({ props }) => {
  const [isIE, setIsIE] = useState(false);
  useEffect(() => {
    setIsIE(document.documentMode);
  }, []);
  if (!isIE) return null;
  return <div>Some browser sniffing code here.</div>;
};
import React,{useState,useffect}来自“React”;
常量SomeComponent=({props})=>{
const[isIE,setIsIE]=useState(false);
useffect(()=>{
setIsIE(document.documentMode);
}, []);
如果(!isIE)返回null;
在此处返回一些浏览器嗅探代码。;
};

js是一个SSR框架,您的代码将同时在服务器端和客户端运行<在服务器端运行时,不会定义代码>窗口
。如果要从
窗口
获取属性,可以尝试以下方法

  • 需要时获取
    窗口

    if (typeof window !== 'undefined') {
       console.log(window.document)
    }
    

  • 在某些特定情况下,您只需要在客户端运行组件
    。在这种情况下,可以使用
    dynamic

    组件/客户端组件

    const ClientSideComponent = props => {
        // You could get window directly in this component 
        console.log(window.document)
        return (
          <div>
             run your code only on client side
          </div>
        )
    }
    
    const ClientSideComponent=props=>{
    //您可以直接在该组件中获取窗口
    console.log(window.document)
    返回(
    只在客户端运行代码
    )
    }
    
    页面/索引

    import dynamic from 'next/dynamic';
    const ClientSideComponent = dynamic(() => import('../components/ClientSideComponent'), {
        ssr: false,
    });
    
    const HomePage = props => {
        return <ClientSideComponent />
    }
    
    从“下一个/动态”导入动态;
    const ClientSideComponent=dynamic(()=>import('../components/ClientSideComponent'){
    ssr:错,
    });
    const HomePage=props=>{
    返回
    }
    

  • Next.js
    是一个SSR框架,您的代码将同时在服务器端和客户端运行<在服务器端运行时,不会定义代码>窗口
    。如果要从
    窗口
    获取属性,可以尝试以下方法

  • 需要时获取
    窗口

    if (typeof window !== 'undefined') {
       console.log(window.document)
    }
    

  • 在某些特定情况下,您只需要在客户端运行组件
    。在这种情况下,可以使用
    dynamic

    组件/客户端组件

    const ClientSideComponent = props => {
        // You could get window directly in this component 
        console.log(window.document)
        return (
          <div>
             run your code only on client side
          </div>
        )
    }
    
    const ClientSideComponent=props=>{
    //您可以直接在该组件中获取窗口
    console.log(window.document)
    返回(
    只在客户端运行代码
    )
    }
    
    页面/索引

    import dynamic from 'next/dynamic';
    const ClientSideComponent = dynamic(() => import('../components/ClientSideComponent'), {
        ssr: false,
    });
    
    const HomePage = props => {
        return <ClientSideComponent />
    }
    
    从“下一个/动态”导入动态;
    const ClientSideComponent=dynamic(()=>import('../components/ClientSideComponent'){
    ssr:错,
    });
    const HomePage=props=>{
    返回
    }
    

  • React.render()函数在哪里?我可以看一下吗?文件中没有呈现函数,因为它是一个函数组件(函数组件在语法中没有呈现函数),请看一下您的文件app.js或index.js。您肯定找到了这段代码ReactDOM.render(,document.getElementById(“root”);React.render()函数在哪里?我可以看一下吗?文件中没有呈现函数,因为它是一个函数组件(函数组件在语法中没有呈现函数),请看一下您的文件app.js或index.js。您肯定找到了这段代码ReactDOM.render(,document.getElementById(“root”);