React 条件渲染(移动视图和桌面视图)问题

React condtional render (mobile view and Desktop view ) issue

谁能帮帮我?当此代码加载到移动视图时,它会显示桌面视图几毫秒,然后显示移动视图。任何人都可以纠正我的代码吗?提前致谢。

class Header extends React.Component {

    constructor(props) {
        super(props);
        this.state = {
           isLarge:true
        };
        this.updatePredicate = this.updatePredicate.bind(this);
    }

    componentDidMount() {    
        this.updatePredicate();
        window.addEventListener("resize", this.updatePredicate);
    }

    componentWillUnmount() {
        window.removeEventListener("resize", this.updatePredicate);
    }

    updatePredicate() {
         var size = window.innerWidth;
         if(size>767) {
             this.setState({ isLarge:true});
         } else {
             this.setState({ isLarge:false});
         }  
    }

    render() {
        const {isLarge} = this.state;   

        return (
            <div>
                {isLarge ? (<DesktopMenu 
                                categories={categories} 
                                menuOpen={menuOpen} 
                                openMenu={openMenu}/>) 
                         : (<MobileMenu 
                                categories={categories} 
                                menuOpen={menuOpen} 
                                openMenu=openMenu}/>)
                }
            </div>
        );
    }
}

默认情况下,您的状态 isLarge 设置为 true,因此即使对于这些毫秒,它也会呈现 DesktopView。

您可以使用 undefined 值而不是默认值来初始化您的状态。

    this.state = {
       isLarge: undefined
    };

然后检查值是否存在

    return (
        <>
        {isLarge === undefined ? "Loading" :
        <div>
            {
             isLarge ?
               <DesktopMenu categories={categories}
                            menuOpen={menuOpen}
                            openMenu={openMenu}
               />
              : 
               <MobileMenu categories={categories}
                           menuOpen={menuOpen}
                           openMenu={openMenu}
               />
            }
        </div>
     }
     </>
    );