简体   繁体   English

JSX 条件渲染未按预期工作

[英]JSX conditional rendering not working as expected

I'm having trouble with a conditional jsx statement where an element is not appearing properly unless I resize the window.我在使用条件 jsx 语句时遇到问题,除非我调整 window 的大小,否则元素无法正确显示。 Note: It works fine in dev mode.注意:它在开发模式下工作正常。 But doesn't display properly after build.但构建后无法正常显示。

I'm trying to get it so I can display some navigation links if on desktop view and mobile menu if in mobile view.我正在尝试获取它,以便在桌面视图和移动菜单中显示一些导航链接(如果在移动视图中)。

My Main nav wrapper component is this -我的主要导航包装组件是这个 -

const Nav = ({ image, branding, links, blog }) => {
    const [ size, setSize ] = useState(
        typeof window !== 'undefined' ? window.innerWidth : 1000
    );

    const handleSizeChange = (e) => {
        setSize((state) => e.target.innerWidth);
    };

    useEffect(
        () => {
            window.addEventListener('resize', (e) => handleSizeChange(e));
        },
        [ size ]
    );

    console.log(size);

    return (
        <NavWrapper>
            <Branding>
                <Link to="/">{!!image && <img src={image.url} alt="img" />}</Link>
                <Link to="/">{branding}</Link>
            </Branding>
            {size < 850 ? (
                <MobNav links={links} blog={blog} />
            ) : (
                <NavLinks links={links} />
            )}
        </NavWrapper>
    );
};

Which should give me this layout -这应该给我这个布局 -

在此处输入图像描述

But instead I am getting this layout (until I resize the window to desktop and back to mobile) -但相反,我得到了这个布局(直到我将 window 调整为桌面并返回移动) -

在此处输入图像描述

This is my NavLinks component -这是我的 NavLinks 组件 -

const NavLinks = ({ links }) => {
    return (
        <NavLinksWrapper>
            {links.map((link) => {
                return (
                    <NavLink key={link.link._meta.uid}>
                        <Link to={`/${link.link._meta.uid}`}>{link.label}</Link>
                    </NavLink>
                );
            })}
        </NavLinksWrapper>
    );
};

And this is BottomMobNav component -这是 BottomMobNav 组件 -

const BottomMobNav = ({ links, socialMedia, contact }) => {
    const [ open, setOpen ] = useState(false);
    const newLinks = [ { label: 'Home', link: { _meta: { uid: '/' } } }, ...links ];
    return (
        <MobNavWrapper>
            <div className="menu" style={{ left: open ? '0' : '-150%' }}>
                <MenuWrapper>
                    {newLinks.map((e, i) => {
                        if (e.label.toLowerCase() !== 'contact') {
                            return (
                                <Link to={`/${e.link._meta.uid}`} key={'mobNav ' + i}>
                                    <li
                                        style={{ height: `${75 / links.length}%` }}
                                        onClick={() => setOpen((state) => !state)}>
                                        {e.label}
                                    </li>
                                </Link>
                            );
                        }
                    })}
                </MenuWrapper>
            </div>
            <div className="icons">
                <i
                    className={`fa ${open ? 'fa-close' : 'fa-bars'} fa-2x`}
                    onClick={() => setOpen((state) => !state)}
                />
                <a href="https://www.google.com">
                    <i
                        className="fa fa-facebook-official fa-2x"
                        onClick={() => setOpen((state) => false)}
                    />
                </a>
                <Link to="/contact">
                    <i
                        className="fa fa-envelope fa-2x"
                        onClick={() => setOpen((state) => false)}
                    />
                </Link>
            </div>
        </MobNavWrapper>
    );
};

I don't understand why it would create the Navlinks component then put the bottomMobNav component inside it.我不明白为什么它会创建 Navlinks 组件然后将 bottomMobNav 组件放入其中。

Any help would be appreciated.任何帮助,将不胜感激。 Thanks!谢谢!

use effect options array should be empty to only be run on init, also you should remove this listener on unmount.使用效果选项数组应该是空的,只能在初始化时运行,你也应该在卸载时删除这个监听器。

useEffect(
        () => {
            const listener  = (e) => handleSizeChange(e);
            window.addEventListener('resize', listener);
            return function(){ window.removeEventListener('resize', listener)   }
        },
        []
    );

I managed to fix this by removing all the js and simply handling the display using css media queries.我设法通过删除所有 js 并使用 css 媒体查询简单地处理显示来解决此问题。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM